因此,即时通讯使用opencv捕获文档,对其进行扫描并对其进行裁剪。当房间没有照明时,它会完美工作。当房间里有光线,并且桌子上有眩光并且文件靠近它时,它也将眩光作为矩形的一部分。
如何消除照片中的眩光?
这是即时消息用于获取我想要的图像的代码:
Mat &image = *(Mat *) matAddrRgba;
Rect bounding_rect;
Mat thr(image.rows, image.cols, CV_8UC1);
cvtColor(image, thr, CV_BGR2GRAY); //Convert to gray
threshold(thr, thr, 150, 255, THRESH_BINARY + THRESH_OTSU); //Threshold the gray
vector<vector<Point> > contours; // Vector for storing contour
vector<Vec4i> hierarchy;
findContours(thr, contours, hierarchy, CV_RETR_CCOMP,
CV_CHAIN_APPROX_SIMPLE); // Find the contours in the image
sort(contours.begin(), contours.end(),
compareContourAreas); //Store the index of largest contour
bounding_rect = boundingRect(contours[0]);
rectangle(image, bounding_rect, Scalar(250, 250, 250), 5);
这是我正在谈论的眩光照片:
我发现的东西是使用inRange,找到合适的颜色标量,然后使用我们的油漆去除光。这是一个代码片段,但是总是崩溃,说它需要带有 channel 的8位图像。
Mat &image = *(Mat *) matAddrRgba;
Mat hsv, newImage, inpaintMask;
cv::Mat lower_red_hue_range;
inpaintMask = Mat::zeros(image.size(), CV_8U);
cvtColor(image, hsv, COLOR_BGR2HSV);
cv::inRange(hsv, cv::Scalar(0, 0, 215, 0), cv::Scalar(180, 255, 255, 0),
lower_red_hue_range);
image = lower_red_hue_range;
inpaint(image, lower_red_hue_range, newImage, 3, INPAINT_TELEA);
最佳答案
我之前已经解决了这个问题,并且在计算机视觉中,照明的更改始终是检测和描述图像的问题。我实际上训练了一个用于HSV颜色空间而不是RGB/BGR的分类器,该分类器将具有不断变化的入射光的图像映射到没有突然的亮度/暗斑的图像(这就是标签)。这对我来说效果很好,但是图像始终是相同背景的(我不知道您是否也有这个背景)。
当然,机器学习可以解决问题,但这可能是一个过大的杀伤力。在进行上述操作时,我遇到了CLAHE,它可以很好地用于局部对比度增强。我建议您在检测轮廓之前先尝试一下。此外,您可能需要在其他颜色空间上工作,例如HSV/Lab/Luv,而不是RGB/BGR。您可以将CLAHE分别应用于每个 channel ,然后将它们合并。
让我知道您是否需要其他信息。我在python中用您的图片实现了它,效果很好,但是我会把编码留给您。我可能会更新几天后得到的结果(希望您先得到它们;))。希望能帮助到你。
关于android - 去除照片opencv中的眩光,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43470569/