OpenCv 减去来自不同来源的相同图像
OpenCv subtract same image but from different sources
我需要减去两个图像:
- img1为原图作为对象Object Image (img1)
- img2被点击使用相机作为场景Scene Image (img2)
- 结果图片:drive.google.com/open?id=0B0IUdCi6RzGcRENDSEdoa3dRN2c&authuser=0
(我不能添加两个以上的链接)
在调用 subtract 方法之前执行以下步骤:
对象图像 (img1) 使用 findHomography
和 perspectiveTransform
方法位于场景图像 (img2) 中。
使用 getPerspectiveTransform
和 warpPerspective
方法修复视角
然后 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",但会删除其他噪声像素。
我需要减去两个图像:
- img1为原图作为对象Object Image (img1)
- img2被点击使用相机作为场景Scene Image (img2)
- 结果图片:drive.google.com/open?id=0B0IUdCi6RzGcRENDSEdoa3dRN2c&authuser=0 (我不能添加两个以上的链接)
在调用 subtract 方法之前执行以下步骤:
对象图像 (img1) 使用
findHomography
和perspectiveTransform
方法位于场景图像 (img2) 中。使用
getPerspectiveTransform
和warpPerspective
方法修复视角
然后 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",但会删除其他噪声像素。