如何在OpenCV C ++中使用保持原始颜色的掩码复制图像

时间:2017-11-11 08:31:35

标签: c++ image opencv image-processing mask

我有一个彩色图像,我想复制到白色图像,但只有某些像素。我想在白色图像中保留这些像素的原始颜色。我正在使用mask和copyTo函数,但生成的图像只显示一种颜色。我究竟做错了什么?输入是一张带有手绘图案的带衬纸的照片,我想要做的只是保留图形和线条及其颜色为白色图像(以消除噪音,阴影和皱纹)。

 Mat src = imread("D:/Images/test.jpg", 1);  
imshow("input", src);

input

Mat gray;
Mat dst_eq = adaptiveHistogramEqualization(src); //adaptive histogram equalization to enhance contrast
imshow("adaptive histogram", dst_eq);
cvtColor(dst_eq, gray, CV_BGR2GRAY);
GaussianBlur(gray, gray, Size(5, 5), 0, 0);
adaptiveThreshold(~gray, binary, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY_INV, 3, -2); //binary mask 
imshow("binary mask", ~binary);

binary mask

Mat white2 = Mat(src.size(), src.type()); 
white2 = cv::Scalar(255, 255, 255);
src.copyTo(white2, ~binary);
imshow("Result", white2);

Result

如果可以这样做,请告诉我。顺便说一句,有谁知道如何摆脱论文中的界限?考虑到照片将通过手机拍摄,因此它将是重要的照明变化,并且片材可以具有正方形或带衬里的背景,并且线条可以具有不同的颜色(不一定是蓝色)。由于灯光的变化和噪音,我尝试了颜色分割(假设蓝线)没有成功。我也尝试过形态转换。在这两种情况下,都不可能删除背景并在我的所有测试图像中保持图形完整。

Input, before copy

0 个答案:

没有答案