我尝试提取图像中一大片白色区域的坐标,如下所示:这是原始图像:
使用一个小的方形核,我应用了闭合操作来填充小的孔洞,并帮助识别图像中的较大结构,如下所示:
import cv2import numpy as npimport imutils original = cv2.imread("Plates\\24.png")original = cv2.resize(original, None, fx=3, fy=3, interpolation=cv2.INTER_CUBIC)gray = cv2.cvtColor(original, cv2.COLOR_BGR2GRAY) # 接下来,查找图像中为光的区域squareKern = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))light = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, squareKern)light = cv2.threshold(light, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
处理后的图像如下:
另一个例子如下:
我希望能够检测到盘子中的大片白色区域,如下所示:
请注意,轮廓方法在许多例子中可能效果不佳
回答:
对于您提供的一张图像:
我提出了两种解决这个问题的方案:
方案1
轮廓面积比较
如您所见,图像中有三个大的轮廓;顶部的矩形和下面的两个矩形,您希望将其整体检测出来。
所以我对您的图像进行了阈值处理,检测了阈值处理后图像的轮廓,并索引了第二大和第三大的轮廓(最大的是顶部的矩形,您希望忽略它)。
这是阈值处理后的图像:
我将这两个轮廓堆叠在一起,并检测了这两个轮廓的边界框:
输出:
方案2
阈值掩码
由于盘子底部的两个矩形比顶部的矩形更白,我使用了一个阈值来遮蔽盘子的顶部:
我在上图所示的掩码上使用了Canny边缘检测器。
输出:
当然,如果盘子的顶部不比底部更亮,这种方法可能无法正常工作。