python - 多级图像阈值
问题描述
考虑到我想要对图像进行阈值处理的像素的强度,我正在尝试获得具有多级阈值含义的图像蒙版 - 白色表示最亮区域,灰色表示稍微不太亮的区域,黑色表示相对较暗的区域。我遇到过有关多级 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]
,这是我们在上面的代码块中利用的质量。
推荐阅读
- node.js - 存储 NodeJS 服务器请求和响应以供以后使用
- reactjs - 如何在 ReactJS recharts 中创建一个空圆圈?
- vb.net - 如何将两个 List(of T) 与 compareTo() 进行比较并将更改保存到新 List?
- bash - 在 bash 脚本中添加 '(' 字符的 bash 语法错误
- arrays - 由于 redim 数组,下标超出范围错误
- json - 在多个场景中调用同一个端点
- html - 您如何在不定向到新页面的情况下快速发回一些数据
- jquery - 无法使用 Yarn 在 Rails 上加载 jQuery 插件
- vue.js - 为什么 vs 代码语法高亮停止工作
- javascript - 使用 JS 获取 JSON 数组