灰度图像过滤需求:将特定灰度区间分别染为蓝、红色
实现灰度图像区间染色过滤器
没问题,我来帮你搞定这个需求!核心思路是先把单通道的灰度图转换成三通道的彩色图像(这样才能给不同区域染上颜色),然后通过掩码定位目标灰度区间,最后给对应区域赋值指定颜色。
下面是修改后的完整代码,关键部分我都加了注释说明:
import matplotlib.pyplot as plt import cv2 # 读取原始图像 original = cv2.imread('D:/download.jfif') # 转换为灰度图 gray = cv2.cvtColor(original, cv2.COLOR_BGR2GRAY) # 关键步骤1:把单通道灰度图转成三通道BGR图像,才能存储彩色信息 color_img = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR) # 关键步骤2:创建掩码,精准定位需要染色的灰度区间 # 匹配灰度值130-135的区域 blue_mask = (gray >= 130) & (gray <= 135) # 匹配灰度值140-145的区域 red_mask = (gray >= 140) & (gray <= 145) # 关键步骤3:给对应掩码区域赋值颜色(OpenCV用BGR格式) color_img[blue_mask] = (255, 0, 0) # BGR格式的蓝色 color_img[red_mask] = (0, 0, 255) # BGR格式的红色 # 显示所有图像:原图、灰度图、染色后的结果 fig, axes = plt.subplots(1, 3, figsize=(12, 4)) ax = axes.ravel() # OpenCV读入的是BGR,matplotlib显示需要转成RGB才不会偏色 ax[0].imshow(cv2.cvtColor(original, cv2.COLOR_BGR2RGB)) ax[0].set_title("Original") ax[0].axis('off') ax[1].imshow(gray, cmap=plt.cm.gray) ax[1].set_title("Grayscale") ax[1].axis('off') # 染色后的图同样转RGB后显示 ax[2].imshow(cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB)) ax[2].set_title("Colored Filter") ax[2].axis('off') fig.tight_layout() plt.show() # 显示灰度直方图,方便你确认目标区间的分布情况 plt.hist(gray, bins=256) plt.title("Grayscale Histogram") plt.show()
几个需要注意的细节:
- OpenCV的颜色通道是BGR顺序,所以蓝色是
(255,0,0),红色是(0,0,255),如果直接用matplotlib显示BGR图像会出现颜色偏差,转成RGB后显示才准确。 - 掩码是布尔数组,
gray >=130 & gray <=135会生成一个和灰度图尺寸完全相同的数组,符合条件的像素位置为True,我们用这个数组直接定位要染色的像素。 - 必须把灰度图转成三通道图像,因为单通道灰度图只能存储灰度值,无法承载彩色信息,转成三通道后才能给不同区域赋予不同的颜色值。
内容的提问来源于stack exchange,提问作者cmg




