如何将直方图均衡化后的灰度图转为彩色图像?可用哪些通道?
问题详情
原始图像

应用equalizeHist的代码
PhotoImage_hist = resized_img hist_image = resized_img def histogram(): global PhotoImage_hist,hist_image,gray_image hist_image = cv2.equalizeHist(gray_image) PhotoImage_hist = Image.fromarray(hist_image) PhotoImage_hist = ImageTk.PhotoImage(PhotoImage_hist) canvas_hist.create_image(0, 0, anchor=NW, image=PhotoImage_hist)
应用equalizeHist后的图像

尝试转彩色的代码(未得到预期彩色)
PhotoImage_color = resized_img color_img = resized_img def coloredHist(): global PhotoImage_color,hist_image,color_img color_img = cv2.cvtColor(hist_image,cv2.COLOR_GRAY2BGR) PhotoImage_color = Image.fromarray(color_img) PhotoImage_color = ImageTk.PhotoImage(PhotoImage_color) canvas_color.create_image(0, 0, anchor=NW, image=PhotoImage_color)
转换后的结果

疑问
是否有其他可用的通道来实现我想要的彩色结果?
解决方案
为什么COLOR_GRAY2BGR没用?
cv2.COLOR_GRAY2BGR只是把单通道灰度图复制成三个通道的BGR图,三个通道像素值完全一致,视觉上还是灰度,并没有生成真正的彩色。
两种实现彩色效果的方法
1. 保留原始色彩的对比度增强(推荐)
不转灰度,直接在彩色空间中只对亮度通道做均衡,保留原始色彩信息:
def coloredHist(): global PhotoImage_color, color_img, original_color_img # 确保original_color_img是原始彩色图像 # 转HSV空间,分离亮度通道V hsv_img = cv2.cvtColor(original_color_img, cv2.COLOR_BGR2HSV) h, s, v = cv2.split(hsv_img) # 对亮度通道做直方图均衡 v_equalized = cv2.equalizeHist(v) # 合并通道后转回BGR hsv_equalized = cv2.merge((h, s, v_equalized)) color_img = cv2.cvtColor(hsv_equalized, cv2.COLOR_HSV2BGR) # 转换为Tkinter可用格式并显示 PhotoImage_color = Image.fromarray(color_img) PhotoImage_color = ImageTk.PhotoImage(PhotoImage_color) canvas_color.create_image(0, 0, anchor=NW, image=PhotoImage_color)
2. 伪彩色映射(给灰度图添加彩色渐变)
如果只是想给灰度均衡后的图像添加伪彩色(用不同颜色区分灰度值),可以用OpenCV的伪彩色映射函数:
def pseudoColorHist(): global PhotoImage_color, hist_image # 可选映射方案:COLORMAP_JET、COLORMAP_HSV、COLORMAP_COOL等 color_img = cv2.applyColorMap(hist_image, cv2.COLORMAP_JET) # 转换为Tkinter可用格式并显示 PhotoImage_color = Image.fromarray(color_img) PhotoImage_color = ImageTk.PhotoImage(PhotoImage_color) canvas_color.create_image(0, 0, anchor=NW, image=PhotoImage_color)
内容的提问来源于stack exchange,提问作者GALAXY A50
相关产品推荐
相关产品推荐

