OpenCv 减去来自不同来源的相同图像

OpenCv subtract same image but from different sources

我需要减去两个图像:

  1. img1为原图作为对象Object Image (img1)
  2. img2被点击使用相机作为场景Scene Image (img2)
  3. 结果图片:drive.google.com/open?id=0B0IUdCi6RzGcRENDSEdoa3dRN2c&authuser=0 (我不能添加两个以上的链接)

在调用 subtract 方法之前执行以下步骤:

  1. 对象图像 (img1) 使用 findHomographyperspectiveTransform 方法位于场景图像 (img2) 中。

  2. 使用 getPerspectiveTransformwarpPerspective 方法修复视角

然后 subtract 方法被调用,但输出图像包含 lines/contours 应该被减去。

根据我的观察,这可能是由于一张图像中存在噪声,它看起来不像img1那么锐利,我尝试在锐化后调用减法,但没有成功。

任何 suggestion/guidance 已申请

要消除不清晰伪影和稍微不完美的对齐问题,您可以尝试只放大模板图像。不过,您会丢失一些输入信息。

如果你想这样做 "better",我建议你尝试在输入图像中找到模板图像的每个轮廓(例如,使用活动轮廓)。剩下的一切都应该是用户输入。

但这里是带膨胀的简单版本:

输入:

输入蒙版图片:

膨胀后的模板蒙版图像:

差异图像:input - template

请注意我没有使用任何透视校正,这可能会也可能不会改善结果!

int main()
{
    // edited image:
    cv::Mat input = cv::imread("../inputData/earth-science-worksheet-edited.png");
    cv::Mat grayInput;
    cv::cvtColor(input,grayInput,CV_BGR2GRAY);
    cv::Mat maskInput = grayInput < 150; // find everything that isn't "white" on your sheet of paper


    // template image:
    cv::Mat templateImage = cv::imread("../inputData/earth-science-worksheet-printable.png");
    cv::Mat grayTemplate;
    cv::cvtColor(templateImage,grayTemplate,CV_BGR2GRAY);
    cv::Mat maskTemplate = grayTemplate < 150; // find everything that isn't "white" on your sheet of paper

    // dilate the template image to overcome sharpness effects and imperfect alignment
    cv::dilate(maskTemplate, maskTemplate, cv::Mat(), cv::Point(-1,-1),1);

    // compute the difference image
    cv::Mat difference = maskInput - maskTemplate;


    cv::imshow("input", input);

    cv::imshow("mask template", maskTemplate);
    cv::imshow("mask input", maskInput);

    cv::imshow("difference", difference);

    cv::waitKey(0);
    return 0;
}

如果更改为 cv::dilate(maskTemplate, maskTemplate, cv::Mat(), cv::Point(-1,-1),2);,您会损失更多的 "input",但会删除其他噪声像素。