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