如何在TKinter显示的灰度图像饱和像素上叠加红色蒙版?
实现饱和像素区域红色蒙版方案
核心思路
饱和像素指的是经缩放后达到16位最大值(65535)的像素,我们先识别这些像素的位置,再将灰度图转为RGB格式,最后在对应区域叠加红色蒙版。
具体代码修改步骤
- 生成饱和像素掩码
在现有图像转换代码后,添加掩码生成逻辑:
# 识别饱和像素(缩放后值为65535的像素) saturation_mask = (self.data == 65535)
- 将灰度图转为RGB格式
把8位灰度图扩展为3通道RGB数组,支持添加红色通道:
# 将data2转为标准uint8类型(范围0-255) data2_8bit = data2.astype('uint8') # 扩展为RGB三通道结构 rgb_data = np.repeat(data2_8bit[..., np.newaxis], 3, axis=-1)
- 叠加红色蒙版
在饱和像素区域替换为红色,也可选择半透明效果:
# 不透明红色蒙版 rgb_data[saturation_mask] = [255, 0, 0] # 可选:半透明红色蒙版(需改用RGBA格式) # rgba_data = np.repeat(data2_8bit[..., np.newaxis], 4, axis=-1) # rgba_data[saturation_mask] = [255, 0, 0, 128] # 最后一位为透明度,范围0-255 # img = Image.fromarray(rgba_data)
- 更新图像显示代码
将处理后的RGB数组转为PIL Image并显示:
img = Image.fromarray(rgb_data) imgtk = ImageTk.PhotoImage(image=img) self.liveMain.imgtk = imgtk self.liveMain.config(image=imgtk)
完整整合后的代码片段
# 原图像转换逻辑 imax2 = np.amax(self.data) if imax2 > 0: imul2 = int(65535/imax2) self.data = self.data * imul2 data2 = (self.data / 256).astype('u2') # 添加饱和蒙版处理 saturation_mask = (self.data == 65535) data2_8bit = data2.astype('uint8') rgb_data = np.repeat(data2_8bit[..., np.newaxis], 3, axis=-1) rgb_data[saturation_mask] = [255, 0, 0] # 显示图像 img = Image.fromarray(rgb_data) imgtk = ImageTk.PhotoImage(image=img) self.liveMain.imgtk = imgtk self.liveMain.config(image=imgtk)
内容的提问来源于stack exchange,提问作者Diego Gonzalez
相关产品推荐
相关产品推荐

