我需要减去两张图片:
在调用减法方法之前,执行以下步骤:
对象图像(img1)位于使用findHomography
和perspectiveTransform
方法的场景图像(img2)中。
使用getPerspectiveTransform
和warpPerspective
方法
然后调用subtract
方法,但输出图像包含应该减去的线/轮廓。
根据我的观察,这可能是由于一张图像中出现的噪点,它看起来并不像img1那样清晰,我试着在锐化之后调用减法但是它不起作用。
任何建议/指导都是适当的
答案 0 :(得分:1)
要删除不清晰度工件和略微不完美的对齐问题,您可以尝试扩展模板图像。但是你会丢失一些输入信息。
如果你想“更好”,我建议你尝试在输入图像中找到模板图像的每个轮廓(例如,使用活动轮廓)。剩下的一切都应该是用户输入。
但这里有扩张的简单版本:
输入:
输入掩码图片:
扩张后的模板蒙版图像:
差异图片: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);
,您会失去更多的“输入”,但您会移除其他噪点像素。