首页 > 解决方案 > 多级图像阈值

问题描述

考虑到我想要对图像进行阈值处理的像素的强度,我正在尝试获得具有多级阈值含义的图像蒙版 - 白色表示最亮区域,灰色表示稍微不太亮的区域,黑色表示相对较暗的区域。我遇到过有关多级 otsu 阈值的各种文章,但找不到可以用作参考的实现。一旦我有了这些掩码,我想对这些掩码执行 bitwise_and 以检索白色和灰色区域的原始图像区域。那可能吗?目前,我正在使用ret, thresh_ = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)获取口罩。

我尝试使用 if 语句显式设置值。

if(thresh_ <=80):
            thresh_ = 0

        elif(thresh_ >80 & thresh_ <=160):
            thresh_ = 150

        else: 
            thresh_ = 255

但它没有用,它给出了一个错误- 具有多个元素的数组的真值是模棱两可的。使用 a.any() 或 a.all()

for file in glob.glob(path):
        img = cv2.imread(file)  


        #edge detection
        canny = auto_canny(img)


        #Dilation(Morphological function to increase edge width)
        img_dilate = cv2.dilate(canny, (3,3), iterations = 1)

标签: pythonnumpyopencvimage-processing

解决方案


为此使用 cv 可能是矫枉过正;您可能可以拍摄图像并使用 numpy 样式的索引来设置阈值:

img[img < 80] = 0
img[(img < 160) & (img > 0)] = 150
img[img > 150] = 255

(未经测试)

您收到您所看到的错误的原因是因为与数组的比较在“vanilla”python 中不起作用;您期望[1, 2, 3] > 2返回的结果是什么?

但是在 numpy 风格的 Python(OpenCV 使用)中,上面将返回 的逐项比较[False, False, True],这是我们在上面的代码块中利用的质量。


推荐阅读