python - 多级图像阈值

标签 python numpy opencv image-processing

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

最佳答案

为此使用 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] 的逐项比较,这是我们在上面的代码块中利用的质量。

关于python - 多级图像阈值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58794404/

相关文章:

python - SqlAlchemy 检查关系属性是否在列表中

python - 如何使用 xarray 沿时间维度扩展数据变量?

python - numpy切片奇怪的行为

c++ - OpenCv 将圆转换为多边形

java - drawContours 不填充/JAVA - OpenCV

python - 如何根据句号后面的行将合并为列表的条件将 pandas 数据帧的行组合为列表?

python - Gunicorn ImportError : No module named application

python - Numpy 无法将列表转换为 np 数组

python - 如何将实例属性链接到 numpy 数组?

python - OpenCV VideoCapture 在 Flask 项目中不起作用,但在基本示例中起作用