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




