You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:48:21