【问题标题】:How to remove shadow from image captured using mobile camera using OpenCV?如何从使用 OpenCV 的移动相机拍摄的图像中去除阴影?
【发布时间】:2015-07-22 11:09:09
【问题描述】:

我需要在图像中找到最大的矩形,但是当我找到轮廓时,阴影会成为轮廓的一部分。

关于如何去除/最小化阴影的任何建议。

原图

带轮廓的图像

【问题讨论】:

  • 你有背景模特吗?如果是这样,则有一个古老但有效的模式分析和机器智能paper,它在公式 8 中显示了一个简单的公式,用于阈值 HSV 值以去除阴影。看看,如果你有兴趣,我会发布代码作为答案。
  • 背景不固定,不同的图片会不一样
  • 那么这不是要走的路。另一个approach 是定义一个不受光照变化影响的色彩空间。然后,您可以在阴影“神奇地”消失的模型上工作。看看论文中的图 1。另一个更简单(可能是简单化)的解决方案是更好地处理您的预处理。我想你只需要提取条形码。那不应该那么困难。如果您发布您的代码,我们会试一试。
  • 在提取/分析任何信息之前,我必须从场景图像(使用相机捕获)中找到感兴趣的图像(边界内的图像区域)
  • 并且边框由两条水平线分隔?

标签: opencv shadow opencv-contour shadow-removal


【解决方案1】:

使用 AdaptiveThreshold 而不是普通的 Otsu Thresholding,我能够用 OpenCV Java for Android 解决同样的问题

【讨论】:

  • 你能分享一些sn-ps吗
【解决方案2】:

通常,您首先使用自适应阈值对图像进行二值化以去除阴影。

Source with example.

【讨论】:

    【解决方案3】:

    您可以使用像 Canny 这样的边缘检测器:

    cv::Mat image = cv::imread( "C:/Users/John/Documents/StackOverflow/t8keM.png" );
    cv::Mat gray_image, dst, color_dst;
    
    cvtColor( image, gray_image, CV_BGR2GRAY );
    Canny( gray_image, dst, 50, 200, 3 );
    cvtColor( dst, color_dst, CV_GRAY2BGR );
    
    cv::imshow( "image", image );
    cv::imshow( "canny", color_dst );
    
    cv::waitKey();
    

    结果:

    之后,您可以使用 cv::findContours() 来查找矩形。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-26
      • 2017-06-02
      • 2011-07-15
      • 2016-10-25
      • 1970-01-01
      • 2018-05-24
      • 2012-10-28
      • 2018-09-15
      相关资源
      最近更新 更多