如何用OpenCV Python将低通FFT处理后的灰度图转彩色并保留属性
OpenCV Python 灰度图转彩色图(含FFT处理场景)
咱们先解决你遇到的FFT低通处理后灰度图转彩色的问题,再聊聊通用的灰度转彩色方法,一步步来。
一、FFT低通处理后转彩色的解决方案
你当前的代码是把原图以灰度模式读取(cv2.imread('rocket.jpg', 0)),所以后续FFT处理的都是单通道灰度数据。要保留处理后的灰度属性同时转彩色,核心思路要么是把单通道数据复制成3个通道(得到视觉上还是灰度的彩色格式图),要么给灰度图加伪彩色(用色彩区分明暗层次)。
方案1:复制通道生成真彩色(保留灰度视觉效果)
这种方法会把处理后的灰度图单通道数据复制到B、G、R三个通道,得到的图格式是彩色,但视觉上和原灰度图一致。修改后的完整代码如下:
import cv2 import numpy as np from matplotlib import pyplot as plt # 读取灰度原图 img_gray = cv2.imread('rocket.jpg', 0) height, width = img_gray.shape # FFT处理流程(补全低通掩码逻辑) fft_img = np.fft.fft2(img_gray) fft_shift = np.fft.fftshift(fft_img) # 创建低通滤波器掩码(示例:保留中心20x20区域) mask = np.zeros((height, width), np.uint8) center_x, center_y = width//2, height//2 mask[center_y-10:center_y+10, center_x-10:center_x+10] = 1 # 应用掩码并逆FFT还原图像 fft_shift_filtered = fft_shift * mask ifft_shift = np.fft.ifftshift(fft_shift_filtered) img_filtered = np.fft.ifft2(ifft_shift) img_filtered = np.abs(img_filtered) # 归一化到0-255的灰度范围 img_filtered = cv2.normalize(img_filtered, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U) # 灰度转彩色:复制单通道为3个BGR通道 img_color = cv2.cvtColor(img_filtered, cv2.COLOR_GRAY2BGR) # 可视化展示(注意matplotlib用RGB格式,需要转换) plt.figure("FFT Processing Result") plt.subplot(221), plt.imshow(img_gray, cmap='gray') plt.title('Input Grayscale'), plt.xticks([]), plt.yticks([]) plt.subplot(222), plt.imshow(np.log(np.abs(fft_shift)), cmap='gray') plt.title('FFT Shift'), plt.xticks([]), plt.yticks([]) plt.subplot(223), plt.imshow(img_filtered, cmap='gray') plt.title('Filtered Grayscale'), plt.xticks([]), plt.yticks([]) plt.subplot(224), plt.imshow(cv2.cvtColor(img_color, cv2.COLOR_BGR2RGB)) plt.title('Filtered Color (Grayscale-like)'), plt.xticks([]), plt.yticks([]) plt.show()
方案2:添加伪彩色(视觉增强明暗层次)
如果你想要用色彩来区分灰度的明暗,可以用OpenCV的applyColorMap函数,它能给灰度图添加预设的伪彩色映射,同时完全保留灰度的明暗信息:
# 替换上面的img_color生成代码即可 img_pseudo_color = cv2.applyColorMap(img_filtered, cv2.COLORMAP_JET) # 可视化时直接使用这个伪彩色图
你可以替换COLORMAP_JET为其他预设,比如COLORMAP_VIRIDIS、COLORMAP_COOL等,不同映射会有不同的色彩风格。
二、OpenCV Python 灰度图转彩色图的通用方法
总结下来,灰度转彩色主要分两种常用场景:
1. 生成“视觉灰度的彩色图”(格式为彩色,视觉无变化)
有两种简单实现方式:
- 方法一:用
cv2.cvtColor直接转换:
gray_img = cv2.imread('test.jpg', 0) color_img = cv2.cvtColor(gray_img, cv2.COLOR_GRAY2BGR)
- 方法二:手动堆叠通道:
color_img = np.stack((gray_img, gray_img, gray_img), axis=-1)
2. 生成伪彩色图(用色彩区分灰度明暗)
使用cv2.applyColorMap,OpenCV提供了几十种预设色彩映射,满足不同可视化需求:
# 示例:用VIRIDIS色彩映射 pseudo_color_img = cv2.applyColorMap(gray_img, cv2.COLORMAP_VIRIDIS)
⚠️ 注意:OpenCV默认彩色格式是BGR,而matplotlib用的是RGB,所以在matplotlib中显示OpenCV生成的彩色图时,需要用cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB)转换,否则颜色会显示异常。
内容的提问来源于stack exchange,提问作者rocky king
相关产品推荐
相关产品推荐

