You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

灰度图像过滤需求:将特定灰度区间分别染为蓝、红色

实现灰度图像区间染色过滤器

没问题,我来帮你搞定这个需求!核心思路是先把单通道的灰度图转换成三通道的彩色图像(这样才能给不同区域染上颜色),然后通过掩码定位目标灰度区间,最后给对应区域赋值指定颜色。

下面是修改后的完整代码,关键部分我都加了注释说明:

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

火山引擎 最新活动