You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Python/OpenCV3双阈值处理求助:保留20-30亮度区间像素值

解决OpenCV中区间阈值保留像素的问题

嘿,我来帮你搞定这个特殊阈值处理的需求!你之前遇到的问题很典型——cv.threshold只能做单阈值的二值化,没法同时限制上下两个区间;而inRange其实是可行的,但需要搭配掩码操作才能得到你想要的结果。下面给你两种简单易懂的实现方法:

方法一:利用OpenCV的掩码(Mask)结合inRange

inRange函数会生成一个二值掩码,其中符合区间[20,30]的像素会被标记为255(白色),其余为0(黑色)。我们只需要把这个掩码和原图做按位与操作,就能保留目标区间的像素,其余设为0:

import cv2 as cv
import numpy as np

# 加载灰度图像
img = cv.imread("your_image_path.jpg", cv.IMREAD_GRAYSCALE)

# 生成区间掩码:保留20-30的像素区域
mask = cv.inRange(img, 20, 30)

# 应用掩码,保留目标像素,其余设为0
result = cv.bitwise_and(img, img, mask=mask)

# 如果需要把非目标区间设为255,替换成以下代码:
# result = np.full_like(img, 255)
# result[mask > 0] = img[mask > 0]

# 查看结果
cv.imshow("Original", img)
cv.imshow("Thresholded Result", result)
cv.waitKey(0)
cv.destroyAllWindows()

方法二:用Numpy条件索引(更直观)

如果你觉得掩码操作有点绕,用Numpy的条件判断索引会更直接,一行代码就能完成:

import cv2 as cv
import numpy as np

# 加载灰度图像
img = cv.imread("your_image_path.jpg", cv.IMREAD_GRAYSCALE)

# 保留20-30的像素,其余设为0
result = np.where((img >= 20) & (img <= 30), img, 0)

# 如果需要把非目标区间设为255,修改最后一个参数:
# result = np.where((img >= 20) & (img <= 30), img, 255)

# 显示结果
cv.imshow("Result", result)
cv.waitKey(0)
cv.destroyAllWindows()

为什么你之前的尝试没成功?

  • 你用的cv.threshold(img,30,255,cv.THRESH_BINARY)只能实现“高于30的像素设为255,低于等于30设为0”,没法限制下限(比如把低于20的像素也设为0),所以只能完成部分需求。
  • inRange本身只是生成掩码,不是直接修改原图,你需要把掩码和原图结合才能得到最终结果,这应该是你之前用inRange没成功的原因~

内容的提问来源于stack exchange,提问作者Giorgos Kosmidis

火山引擎 最新活动