【问题标题】:Multilevel image threshold多级图像阈值
【发布时间】:2019-11-11 01:06:33
【问题描述】:

我正在尝试获得具有多级阈值含义的图像蒙版,考虑到我想要对图像进行阈值处理的像素的强度 - 白色用于最亮区域,灰色用于稍微不太亮的区域,黑色用于相对较暗的区域。我遇到过有关多级 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)

【问题讨论】:

标签: python numpy opencv image-processing


【解决方案1】:

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

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

(未经测试)

您看到错误的原因是因为与数组的比较在“vanilla”python 中不起作用;你希望[1, 2, 3] &gt; 2 的结果是什么?

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

【讨论】:

  • 我应该在原始图像上应用这个吗?
  • 是的——如果它是一个 numpy-array 或类似的,这个代码应该可以直接工作(并且会修改你的 img 变量)。我无法从您发布的代码中看出您的 img 变量设置为什么。
  • 图像是一个 numpy 数组,我在其上执行了边缘检测和膨胀。
【解决方案2】:

使用 Numpy,可以通过针对可变数量区域的快速内置函数轻松实现该解决方案。假设我们正在做灰度分段。假设一个长度为 k-1 的阈值 T 列表(例如 k = 3 个区域,T = [85, 170])。

import numpy as np

Digitize 将获取每个元素的 bin 索引 (0...k-1):

out = np.digitize(image, bins=T)

现在我们将索引映射到灰度颜色:

out = out*int(255/(k-1))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 2016-09-27
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多