我在扩张和侵蚀的图像上使用OTSU阈值,如下所示:
k = np.ones((5,5),np.float32)/1
d = cv2.dilate(self.img, k, iterations=10)
e = cv2.erode(d, k, iterations=10)
self.thresh = cv2.threshold(e, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
这是被侵蚀和扩张的图像,以及得到阈值的图像:
我只希望中间的圆形明亮区域可以从阈值处理中获得,但我得到的结果是:
我如何进行阈值处理,使得我只得到中间的圆形区域,这似乎也是图像中最亮(视觉)的部分?
注意:为了避免使用不同的值,我想坚持使用OTSU阈值,但我对这些想法持开放态度。
答案 0 :(得分:2)
答案 1 :(得分:1)
您可以尝试基于渐变的方法。下面我使用了形态学梯度。我将Otsu阈值应用于此渐变图像,然后进行相似数量的形态学闭合(10次迭代),然后采用所得图像的形态渐变。
现在这些地区很容易被发现。您可以从轮廓中过滤圆形区域,例如,使用基于区域的方法:使用轮廓的边界框尺寸,您可以获得半径的估计值,然后将计算的区域与轮廓区域进行比较。
不知道这种方法对你的收藏有多普遍。
渐变图像:为可视化而缩放的强度值
二值化渐变图像
关闭图片
<强>渐变强>
im = cv2.imread('LDxOj.jpg', 0)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
morph = cv2.morphologyEx(im, cv2.MORPH_GRADIENT, kernel)
_, bw = cv2.threshold(morph, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
morph2 = cv2.morphologyEx(bw, cv2.MORPH_CLOSE, kernel, anchor = (-1, -1), iterations = 10)
morph3 = cv2.morphologyEx(morph2, cv2.MORPH_GRADIENT, kernel)