例如这种卡片:
应该能够被分成两个图像,因为有2种背景颜色.有没有关于如何解决这个问题的建议?我试过做一些轮廓分析并没有太成功.
其他示例卡:
这张卡应该提供3个分段,因为有三个部分,即使它只有2种颜色(虽然2种颜色可以).
上面的卡应该只提供一个分段,因为它只是一种背景颜色.
我还没想到渐变背景.
解决方法
在您发布的示例中,您可以只收集边框像素的颜色(大多数左列,最右列,第一行,最后一行)并将您找到的内容视为可能的背景颜色.也许检查是否有足够多的像素具有大致相同的颜色.你需要某种距离测量.一个简单的解决方案是在RGB颜色空间中使用欧氏距离.
更通用的解决方案是在整个图像的颜色直方图中找到聚类,并将具有超过总像素量的x%的每种颜色(再次具有公差)视为背景颜色.但是,您定义为背景取决于您想要实现的目标以及图像的外观.
如果您需要进一步的建议,您可以发布更多图像,并标记您想要检测的图像的哪些部分作为背景颜色,哪些不是.
–
编辑:您的两个新图像也显示相同的模式.背景颜色占据了图像的很大一部分,没有噪声,也没有颜色渐变.所以一个简单的方法可能如下所示:
>计算图像的直方图:参见http://docs.opencv.org/modules/imgproc/doc/histograms.html#calchist和http://docs.opencv.org/doc/tutorials/imgproc/histograms/histogram_calculation/histogram_calculation.html
>找到直方图中最突出的颜色.如果您不想自己迭代Mat,可以使用minMaxLoc(http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#minmaxloc),如calchist文档中所示(见上文),如果颜色占用了像素数的足够百分比,则将其保存并设置相应的bin.直方图为零.重复,直到不再达到您的百分比.然后,您将保存一份最突出的颜色列表,即背景颜色.
>为每种背景颜色阈值图像.见:http://docs.opencv.org/doc/tutorials/imgproc/threshold/threshold.html
>在生成的螺纹保持图像上找到每种背景颜色的相应区域.见:http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.html
如果您的示例无法使用此方法,请发布它们.