20250118-读取并显示彩色图像以及提取彩色图像的 R、G、B 分量

读取并显示彩色图像以及提取彩色图像的 R、G、B 分量

python 复制代码
import cv2  #彩图R、G、B的提取
import torch
from PIL import Image
from matplotlib import pyplot as plt
import numpy as np
  1. 读取并显示彩色图像的三种方法:
python 复制代码
img_path = "./data/yndx"

1.1 使用 PIL 读取图像,并使用 plt.imshow 显示图像

python 复制代码
# 使用 PIL 读取图像
pil_img = Image.open(img_path + "/color_img.jpg")

# 使用 plt.imshow 显示图像
plt.imshow(pil_img)
plt.axis('off')  # 不显示坐标轴
plt.show()

1.2 使用 OpenCV 读取图像,并使用 plt.imshow 显示图像

python 复制代码
# 使用 OpenCV 读取图像
cv2_img = cv2.imread(img_path + "/color_img.jpg")

# OpenCV 读取的图像是 BGR 格式,需要转换为 RGB 格式
img_rgb = cv2.cvtColor(cv2_img, cv2.COLOR_BGR2RGB)
# 使用 plt.imshow 显示图像
plt.imshow(img_rgb)
plt.axis('off')  # 不显示坐标轴
plt.show()

1.3 使用 OpenCV 读取图像,并使用 cv2.imshow 显示图像

烦人

python 复制代码
# 使用 cv2.imshow 显示图像
cv2.imshow("Original", cv2_img)
# 等待键盘事件
cv2.waitKey(0)
# 关闭所有 OpenCV 窗口
cv2.destroyAllWindows()
  1. 提取彩色图像的 R、G、B 分量的两种方法

2.1 使用 PIL(Pillow)

PIL(Pillow)是 Python Imaging Library 的一个分支,它以 RGB 格式读取图像,因此可以直接提取各个分量。

python 复制代码
# 读取图像
# 将图像转换为 NumPy 数组
image_np = np.array(pil_img)

# 提取 R、G、B 分量
R = image_np[:, :, 0]
G = image_np[:, :, 1]
B = image_np[:, :, 2]

# 显示各分量
plt.figure(figsize=(12, 4))

plt.subplot(1, 4, 1)
plt.imshow(pil_img)
plt.title('Original Image')
plt.axis('off')

plt.subplot(1, 4, 2)
plt.imshow(R, cmap='gray')
plt.title('Red Channel')
plt.axis('off')

plt.subplot(1, 4, 3)
plt.imshow(G, cmap='gray')
plt.title('Green Channel')
plt.axis('off')

plt.subplot(1, 4, 4)
plt.imshow(B, cmap='gray')
plt.title('Blue Channel')
plt.axis('off')

plt.show()

2.2 使用 OpenCV

OpenCV 是一个功能强大的图像处理库,它以 BGR 格式读取图像,但我们可以轻松地将其转换为 RGB 格式,并提取各个分量。

2.2.1 使用 cv2.split() 提取 B、G、R 分量

  • 功能:将图像按通道分割成多个单通道图像。
  • 返回值:返回一个包含三个单通道图像的元组,分别是 B、G、R 分量。
  • 用途:主要用于需要分别处理每个通道的情况,例如对每个通道进行独立的滤波、阈值处理等操作。
python 复制代码
# 读取图像
# 使用 cv2.split() 提取 B、G、R 分量
(B, G, R) = cv2.split(cv2_img)

# 另存图像
cv2.imwrite(img_path + "/blue_img.jpg", B)
cv2.imwrite(img_path + "/green_img.jpg", G)
cv2.imwrite(img_path + "/red_img.jpg", R)

# 显示各分量
plt.figure(figsize=(12, 4))

plt.subplot(1, 4, 1)
plt.imshow(cv2.cvtColor(cv2_img, cv2.COLOR_BGR2RGB))
plt.title('Original Image')
plt.axis('off')

plt.subplot(1, 4, 2)
plt.imshow(R, cmap='gray')
plt.title('Red Channel')
plt.axis('off')

plt.subplot(1, 4, 3)
plt.imshow(G, cmap='gray')
plt.title('Green Channel')
plt.axis('off')

plt.subplot(1, 4, 4)
plt.imshow(B, cmap='gray')
plt.title('Blue Channel')
plt.axis('off')

plt.show()

2.2.2 使用 cv2.cvtColor() 提取 R、G、B 分量

  • 功能:将图像从一种颜色空间转换到另一种颜色空间。
  • 返回值:返回一个转换后的图像,仍然是一个三通道图像。
  • 用途:主要用于将图像从 BGR 格式转换为 RGB 格式,以便在 matplotlib 等库中正确显示图像。也可以用于其他颜色空间的转换,如从 BGR 转换为 HSV、YCrCb 等。
python 复制代码
# 读取图像
# 使用 cv2.cvtColor() 将 BGR 图像转换为 RGB 图像
image_rgb = cv2.cvtColor(cv2_img, cv2.COLOR_BGR2RGB)

# 提取 R、G、B 分量
R = image_rgb[:, :, 0]
G = image_rgb[:, :, 1]
B = image_rgb[:, :, 2]

# 显示各分量
plt.figure(figsize=(12, 4))

plt.subplot(1, 4, 1)
plt.imshow(image_rgb)
plt.title('Original Image')
plt.axis('off')

plt.subplot(1, 4, 2)
plt.imshow(R, cmap='gray')
plt.title('Red Channel')
plt.axis('off')

plt.subplot(1, 4, 3)
plt.imshow(G, cmap='gray')
plt.title('Green Channel')
plt.axis('off')

plt.subplot(1, 4, 4)
plt.imshow(B, cmap='gray')
plt.title('Blue Channel')
plt.axis('off')

plt.show()

使用 cv2.split() 和 cv2.cvtColor() 提取彩色图像的 R、G、B 分量在功能和用途上有一些区别,以下是详细对比:

  • 返回值类型:

cv2.split() 返回三个单通道图像(B、G、R)。

cv2.cvtColor() 返回一个三通道图像(例如 RGB)。

  • 用途:

cv2.split() 适用于需要分别处理每个通道的情况。

cv2.cvtColor() 适用于需要将图像从一种颜色空间转换到另一种颜色空间的情况,特别是从 BGR 转换为 RGB 以便在 matplotlib 中显示。

  • 显示效果:

cv2.split() 提取的单通道图像在 matplotlib 中需要使用 cmap='gray' 显示为灰度图。

cv2.cvtColor() 转换后的 RGB 图像可以直接在 matplotlib 中显示为彩色图。

  • 选择建议

如果需要分别处理每个通道,使用 cv2.split()。

如果需要在 matplotlib 中显示图像,使用 cv2.cvtColor() 将 BGR 图像转换为 RGB 图像。

相关推荐
2601_962293243 小时前
Python自动化统计团队工作量并生成可视化仪表盘的脚本方案【指导】
python·数据分析·自动化·可视化·仪表盘
2601_962293794 小时前
OCRmyPDF批处理脚本:使用Python自动化复杂OCR任务
python·自动化·批处理脚本·ocrmypdf·ocr任务
Java后端的Ai之路6 小时前
20、Python - 备忘录模式
开发语言·人工智能·python·外观模式·备忘录模式
2601_962077716 小时前
基于Python与NLP的新闻事件信息抽取实战:从NER到时空标准化
python·nlp·transformers·spacy·新闻事件抽取
JavaPub-rodert6 小时前
LangChain 从入门到 Agent 实战:用 Python 搭建一个真正能调用工具和知识库的 AI 助手
人工智能·python·langchain
郝学胜-神的一滴7 小时前
Qt 高级编程 045:坐标体系深度实战
开发语言·c++·windows·python·qt·程序人生
m0_380743878 小时前
给 OpenAI API 调用加上模型切换:GPT-5.1 和 Codex 的配置实践
人工智能·python·gpt
2601_962297488 小时前
在python3中、下列输出变量a的正确写法是_2020超星大数据Python免费答案
数据结构·python·算法·编程·字符串操作
“AI国潮设计-小江”8 小时前
Python实战 | SDXL精准控制“普宁英歌舞×星空蛋糕”IP落地,附核心Prompt与商用授权思路
开发语言·人工智能·python·prompt·aigc
公爵爱学习8 小时前
无人机视觉识别前序-Linux-YOLO安装
python·yolo·计算机视觉·conda·无人机