2017-04-18 178 views
9

所以,即时通讯使用opencv捕获文件,扫描并裁剪它。当房间里没有照明时,它完美地工作。当房间里有一些灯光,桌子上有眩光并且文档靠近它时,它也会将眩光视为矩形的一部分。从照片中删除眩光opencv

如何从照片中去除眩光?

下面是一个使用来获得我想要的图像的代码IM:

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); 

这里讲的是眩光IM的照片:

enter image description here

我发现的东西在inRange中使用,为颜色找到合适的标量,并使用inpaint去除光线。这是一个代码片段,但它总是崩溃,说它需要chanels的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); 
+0

您可以尝试与服用3-4个快照,从不同的角度,以克服眩光的桌子上的效果。 – ZdaR

+1

如果你没有回答答案,那么你很难知道答案。 –

+0

眩光与镜头眩光消除技术非常相似,并且简单地说,它们添加到RGB色彩空间以使其接近最大值。这可能会很复杂,您可能需要使用空间过滤器来确保尽可能保持背景。对于这样的事物,有一种洋葱皮方法,从3x3矩阵开始,去除额外的眩光成分,并以洋葱皮朝着中心移动。你可以运行它来查看它是否遵循眩光模式并将其删除。 –

回答

4

我之前已经处理了这个问题,并在照明变化总是检测和图像的描述在计算机视觉的一个问题。我实际上训练了一个分类器,用于HSV色彩空间而不是RGB/BGR,它将图像与变化的入射光映射到没有突然亮度/暗色块(这将是标签)的图像。这对我来说工作得非常好,但是,图像始终是相同的背景(我不知道你是否也有这个)。

当然,机器学习可以解决这个问题,但它可能是一个矫枉过正的问题。当我在做上面提到的时候,我碰到了CLAHE,这对于本地对比度增强非常有效。我建议你在检测轮廓之前尝试一下。此外,您可能想要在不同的色彩空间上工作,例如HSV/Lab/Luv而不是RGB/BGR。您可以将CLAHE分别应用到每个频道,然后合并它们。

让我知道你是否需要一些其他信息。我用python实现了这个图像,它工作的很好,但我会把编码留给你。我可能会更新我在几天后得到的结果(希望你先得到它们))。希望能帮助到你。

Gray image

V channel of HSV after CLAHE - clipLimit=10, TileGridSize= (16, 16)

+0

CLAHE技术在这方面似乎没有帮助。我尝试了你说的话,但似乎没有奏效。你如何声称它会有所帮助? –

+0

@JeruLuke您是否尝试过使用HSV量表中的不同参数? –

+0

是的,事实上,我完全按照你所说的去尝试。你能否支持你的要求多一点?眩光消除的问题相当普遍.... –