如何使用OTSU阈值处理图像的一部分阈值?

时间:2016-04-11 15:57:43

标签: python image opencv image-processing

我在扩张和侵蚀的图像上使用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]

这是被侵蚀和扩张的图像,以及得到阈值的图像:

enter image description here

我只希望中间的圆形明亮区域可以从阈值处理中获得,但我得到的结果是:

enter image description here

我如何进行阈值处理,使得我只得到中间的圆形区域,这似乎也是图像中最亮(视觉)的部分?

注意:为了避免使用不同的值,我想坚持使用OTSU阈值,但我对这些想法持开放态度。

2 个答案:

答案 0 :(得分:2)

您可以对此图像使用Dilate和Erode滤镜,但是按其他顺序:首先侵蚀然后再拨号。它将抑制图像上方的亮区,阈值方法将提供更好的结果

enter image description here

enter image description here

enter image description here

enter image description here

答案 1 :(得分:1)

您可以尝试基于渐变的方法。下面我使用了形态学梯度。我将Otsu阈值应用于此渐变图像,然后进行相似数量的形态学闭合(10次迭代),然后采用所得图像的形态渐变。

现在这些地区很容易被发现。您可以从轮廓中过滤圆形区域,例如,使用基于区域的方法:使用轮廓的边界框尺寸,您可以获得半径的估计值,然后将计算的区域与轮廓区域进行比较。

不知道这种方法对你的收藏有多普遍。

渐变图像:为可视化而缩放的强度值

grad

二值化渐变图像

bw

关闭图片

closed

<强>渐变

cont

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)