如何使用OpenCV从使用移动相机拍摄的图像中移除阴影?

如何使用OpenCV从使用移动相机拍摄的图像中移除阴影?,opencv,shadow,opencv-contour,shadow-removal,Opencv,Shadow,Opencv Contour,Shadow Removal,我需要找到图像中最大的矩形,但当我找到轮廓时,阴影就成为轮廓的一部分 任何关于如何移除/最小化阴影的建议 原始图像 轮廓图像 通常,首先使用自适应阈值对图像进行二值化,以去除阴影 .您可以使用像Canny这样的边缘检测器: cv::Mat image = cv::imread( "C:/Users/John/Documents/StackOverflow/t8keM.png" ); cv::Mat gray_image, dst, color_dst; cvtColor( image, gr

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

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

原始图像

轮廓图像


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


.

您可以使用像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()查找矩形。

使用AdaptiveThreshold而不是正常的Otsu阈值设置,我使用OpenCV Java for Android解决了同样的问题

您有背景模型吗?如果是这样的话,有一个古老但有效的模式分析和机器智能,在等式8中显示了一个简单的等式,用于阈值HSV值以去除阴影。看一看,如果你感兴趣的话,我会把代码贴出来作为答案。背景不是固定的,不同的图像会有所不同,这不是办法。另一种方法是定义对照明变化不变的颜色空间。然后,您可以在阴影“神奇地”消失的模型上工作。请看一下本文中的图1。另一个简单的解决方案是更好地进行预处理。我想您只需要提取条形码。这应该没那么难。如果你发布你的代码,我们会尝试一下。在提取/分析任何信息之前,我必须从场景图像(使用相机拍摄)中找到感兴趣的图像(图像边框内的区域),并且边框由两条水平线分隔。你能分享一些片段吗