因此,即时通讯使用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);

这是我正在谈论的眩光照片:

android - 去除照片opencv中的眩光-LMLPHP

我发现的东西是使用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中的眩光-LMLPHP

android - 去除照片opencv中的眩光-LMLPHP

关于android - 去除照片opencv中的眩光,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43470569/

10-10 21:25