使用OpenCV生成22种伪彩色图像(附Python代码)

在这里插入图片描述

💪 专业从事且热爱图像处理,图像处理专栏更新如下👇:
📝《图像去噪》
📝《超分辨率重建》
📝《语义分割》
📝《风格迁移》
📝《目标检测》
📝《暗光增强》
📝《模型优化》
📝《模型实战部署》
📝《图像配准融合》
📝《数据集》
📝《高效助手》


在这里插入图片描述

伪彩色图的作用主要是通过颜色差异增强图像中的细节和对比度,从而更好地展示和分析图像中的信息,广泛应用于医疗、工业、科研、数据可视化、红外成像等多个领域。

一、伪彩色图像

将图像生成伪彩色图(也称为伪彩色处理或颜色映射)的作用在于增强图像的视觉效果、提升图像信息的可读性,特别是在灰度图像或无色彩信息的图像中,能够通过颜色的差异直观地展示不同区域的特征。伪彩色图在很多领域中都有广泛应用,以下是一些具体的作用和应用场景。

1.1 增强对比度与细节

灰度图像中的信息主要通过亮度传达,但亮度变化有时不明显。伪彩色通过将不同亮度值映射到不同的颜色,可以增强对比度,使图像中不同区域的细节更容易分辨。例如,在一些灰度差异较小的医学影像中,伪彩色处理能更清晰地展示不同组织或结构的分布。

1.2 数据可视化

伪彩色图广泛应用于科学数据可视化,如地理信息系统(GIS)、卫星图像和热图。在这些应用中,伪彩色能够帮助人们更好地理解数据背后的规律。例如:

卫星图像:将不同的波段数据转换为可视化的伪彩色图,能够展示植被、土壤或水体的分布。

热力图:用于显示区域的热分布或密度分布,如城市的交通流量、网络热点图等。

1.3 医学影像分析

在医学影像中(如 X 射线、CT、MRI 等),通常生成的图像是灰度图。通过伪彩色处理,可以突出不同密度或强度的区域,使得医生更容易识别病变区域,如肿瘤、炎症或其他异常组织。例如:

红外热成像:通过伪彩色可以直观地显示人体不同部位的温度分布,用于早期诊断炎症、病变等。

1.4 工业检测

在工业中,伪彩色图像可以用于无损检测(NDT)。例如在红外热成像检测中,通过伪彩色可以更直观地看到金属表面的裂纹、缺陷或材料厚度的变化。

1.5 红外图像处理

红外热成像生成的是灰度图像,不同的亮度值代表不同的温度。通过伪彩色映射,可以将低温区域显示为蓝色,高温区域显示为红色,形成类似铁红色的热图效果。这种颜色映射直观地表现温度的分布,便于观察热泄漏、异常温升等现象。

红外图像本身通常是灰度的。通过伪彩色映射,能够让不同温度区域以不同颜色显示,通常用在安防监控、夜间观测、军事等领域。这种技术能够突出目标的温度差异,使得冷暖区域一目了然。例如:

热红外伪彩色图:可以帮助观察到物体的温度分布,应用于消防、安防、建筑节能检测等场景。

1.6 表征自然或物理现象

伪彩色处理能够表征自然现象或物理过程。例如气象数据(如风速、温度、降水量等)可以通过伪彩色图展示不同地理区域的数值差异,便于气象预测和灾害预警。

1.7 科学实验与科研领域

在各种科研实验中,伪彩色图广泛用于分析实验数据。例如在光学实验中,伪彩色能够清晰展示激光、光强、波长等物理量的变化,有助于实验结果的解释和可视化展示。

二、生成伪彩色图原理

OpenCV 中伪彩色图像生成的原理是通过对灰度图像中每个像素的灰度值进行映射,将这些灰度值转换为对应的颜色,从而生成一幅具有颜色表现的伪彩色图像。这种转换主要是基于颜色查找表(Color Look-Up Table, LUT),即所谓的色板(colormap)。

2.1 灰度图像的本质

灰度图像中的每个像素值通常在 0 到 255 的范围内,表示像素的亮度或强度。值越低,像素越暗;值越高,像素越亮。而伪彩色处理则是将这些灰度值映射为颜色值,使得图像看起来更加直观。

2.2 色板 (Colormap)

在 OpenCV 中,伪彩色生成的核心原理是利用颜色查找表(LUT)。它是一张预定义的查找表,用来将灰度值映射到相应的颜色。不同的色板有不同的映射规则,形成不同的颜色效果。

例如:

在 cv2.COLORMAP_JET 色板中,灰度值 0 被映射为深蓝色,灰度值 128 映射为绿色,灰度值 255 则被映射为红色。

在 cv2.COLORMAP_HOT 色板中,灰度值逐渐从黑色(最低亮度)过渡到红色,再到黄色和白色(最高亮度)。

OpenCV 内部通过这些色板,查找每个像素的灰度值并将其映射到一个新的 RGB 颜色,从而生成伪彩色图像。

三、OpenCV提供的色板

OpenCV 提供了 22 种预定义的伪彩色色板(colormap),这些色板可以通过 cv2.applyColorMap() 函数应用于灰度图像。每种色板对应不同的颜色映射方案,适用于不同的视觉效果和场景。以下是 OpenCV 提供的所有色板列表:
在这里插入图片描述
以下代码列出并显示所有 OpenCV 支持的色板:

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 生成一个灰度渐变图像
gray_image = np.linspace(0, 255, 256).astype(np.uint8)
gray_image = np.tile(gray_image, (100, 1))

# OpenCV提供的伪彩色色板列表
colormaps = [
    cv2.COLORMAP_AUTUMN, cv2.COLORMAP_BONE, cv2.COLORMAP_JET, cv2.COLORMAP_WINTER, 
    cv2.COLORMAP_RAINBOW, cv2.COLORMAP_OCEAN, cv2.COLORMAP_SUMMER, cv2.COLORMAP_SPRING,
    cv2.COLORMAP_COOL, cv2.COLORMAP_HSV, cv2.COLORMAP_PINK, cv2.COLORMAP_HOT, 
    cv2.COLORMAP_PARULA, cv2.COLORMAP_MAGMA, cv2.COLORMAP_INFERNO, cv2.COLORMAP_PLASMA, 
    cv2.COLORMAP_VIRIDIS, cv2.COLORMAP_CIVIDIS, cv2.COLORMAP_TWILIGHT, 
    cv2.COLORMAP_TWILIGHT_SHIFTED, cv2.COLORMAP_TURBO, cv2.COLORMAP_DEEPGREEN
]

# 显示每种色板效果
plt.figure(figsize=(12, 12))
for i, cmap in enumerate(colormaps):
    # 应用伪彩色
    colored_image = cv2.applyColorMap(gray_image, cmap)
    
    # 显示结果
    plt.subplot(6, 4, i + 1)
    plt.imshow(colored_image)
    plt.title(f'COLORMAP_{i+1}')
    plt.axis('off')

plt.tight_layout()
plt.show()

运行上面代码的输出结果见下:

在这里插入图片描述

四、生成伪彩色图像实例

4.1 单帧图像生成伪彩色

4.1.1 待测试图像

待测试的灰度图像见下:
在这里插入图片描述

4.1.2 代码

完整代码见下:

import cv2
import matplotlib.pyplot as plt

# 读取图像
img = cv2.imread('input_image.png', cv2.IMREAD_GRAYSCALE)  # 假设输入图像为灰度图
if img is None:
    print("图像未找到!")
    exit()

# 定义所有22种色板
colormaps = [
    cv2.COLORMAP_AUTUMN, cv2.COLORMAP_BONE, cv2.COLORMAP_JET, cv2.COLORMAP_WINTER,
    cv2.COLORMAP_RAINBOW, cv2.COLORMAP_OCEAN, cv2.COLORMAP_SUMMER, cv2.COLORMAP_SPRING,
    cv2.COLORMAP_COOL, cv2.COLORMAP_HSV, cv2.COLORMAP_PINK, cv2.COLORMAP_HOT,
    cv2.COLORMAP_PARULA, cv2.COLORMAP_MAGMA, cv2.COLORMAP_INFERNO, cv2.COLORMAP_PLASMA,
    cv2.COLORMAP_VIRIDIS, cv2.COLORMAP_CIVIDIS, cv2.COLORMAP_TWILIGHT,
    cv2.COLORMAP_TWILIGHT_SHIFTED, cv2.COLORMAP_TURBO, cv2.COLORMAP_DEEPGREEN
]

# 准备显示图像
fig, axes = plt.subplots(4, 6, figsize=(15, 10))  # 4x6 的子图网格(总共22张图像)

# 遍历所有色板并应用伪彩色
for i, colormap in enumerate(colormaps):
    # 生成伪彩色图像
    pseudo_color_img = cv2.applyColorMap(img, colormap)
    
    # 将 BGR 转换为 RGB(因为 OpenCV 默认是 BGR 而 Matplotlib 是 RGB)
    pseudo_color_img = cv2.cvtColor(pseudo_color_img, cv2.COLOR_BGR2RGB)
    
    # 在子图中显示图像
    ax = axes[i // 6, i % 6]  # 找到对应的子图位置
    ax.imshow(pseudo_color_img)
    ax.set_title(f'Colormap {i+1}')
    ax.axis('off')  # 不显示坐标轴

# 删除多余的空白子图
for j in range(len(colormaps), 24):  # 24 = 4x6
    fig.delaxes(axes[j // 6, j % 6])

# 调整布局并显示
plt.tight_layout()
plt.show()

4.1.3 生成伪彩色结果

运行上面代码生成的伪彩色图见下:

在这里插入图片描述

4.2 批量图像生成伪彩色

可以先通过4.1中脚步测试看看自己需要什么色板,确定好后使用本小节代码批量将文件夹中图片转为伪彩色图片,代码见下:

import cv2
import os

# 定义文件夹路径
input_folder = r'F:\Code\Pythonc64_gray'  # 灰度图像文件夹路径
output_folder = r'F:\Code\Pythonc64_gray_pseudo_color'  # 伪彩色图像保存路径

# 如果输出文件夹不存在,则创建
if not os.path.exists(output_folder):
	os.makedirs(output_folder)

# 遍历文件夹中的所有图片
for filename in os.listdir(input_folder):
	if filename.endswith('.png') or filename.endswith('.jpg') or filename.endswith('.bmp'):  # 支持常见图像格式
		# 读取灰度图像
		gray_image_path = os.path.join(input_folder, filename)
		gray_image = cv2.imread(gray_image_path, cv2.IMREAD_GRAYSCALE)

		# 应用伪彩色(热红外风格的铁红颜色)
		# colored_image = cv2.applyColorMap(gray_image, cv2.COLORMAP_JET)  # COLORMAP_JET 可以生成铁红效果
		# colored_image = cv2.applyColorMap(gray_image, cv2.COLORMAP_AUTUMN)
		colored_image = cv2.applyColorMap(gray_image, cv2.COLORMAP_PLASMA)
		# colored_image = cv2.applyColorMap(gray_image, cv2.COLORMAP_INFERNO)

		# 保存伪彩色图像
		output_image_path = os.path.join(output_folder, 'colored_' + filename)
		print(filename)
		cv2.imwrite(output_image_path, colored_image)

print("所有灰度图像已转换为伪彩色并保存。")

五、总结
以上就是使用OpenCV生成22种伪彩色图像的详细方法,各个色板演示都已经列出来,学者根据自己需求自行选择。

感谢您阅读到最后!😊总结不易,多多支持呀🌹 点赞👍收藏⭐评论✍️,您的三连是我持续更新的动力💖

关注公众号「视觉研坊」,获取干货教程、实战案例、技术解答、行业资讯!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

视觉研坊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值