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

news2025/1/20 2:39:26

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

import cv2  #彩图R、G、B的提取
import torch
from PIL import Image
from matplotlib import pyplot as plt
import numpy as np

  1. 读取并显示彩色图像的三种方法:
img_path = "./data/yndx"

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

# 使用 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 显示图像

# 使用 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 显示图像

烦人

# 使用 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 格式读取图像,因此可以直接提取各个分量。

# 读取图像
# 将图像转换为 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 分量。
  • 用途:主要用于需要分别处理每个通道的情况,例如对每个通道进行独立的滤波、阈值处理等操作。
# 读取图像
# 使用 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 等。
# 读取图像
# 使用 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 图像。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2279158.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

下定决心不去读研了。。。

大家好,我是苍何。 之前发表过一篇文章,表达了自己读研的困惑和纠结,得到了大家很多的建议,也引起了很多人的共鸣,在留言区分享了自己的故事,看着这些故事,我觉得都够苍何写一部小说了。 可惜苍…

单链表的新建、查找

10.3 头插法新建链表实战 10.3.1 流程图 10.3.1.1 整体的流程图 10.3.1.2 循环的流程图 10.3.2 代码 !!!头指针始终指向头结点!!!头插法:实则就是不断地插元素插在头结点的后面最初要先给头结点的指针域赋值为NULL #include &…

【unity进阶篇】向量插值运算Vector3.Lerp和Vector3.Slerp

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、…

CSS 的基础知识及应用

前言 CSS(层叠样式表)是网页设计和开发中不可或缺的一部分。它用于描述网页的视觉表现,使页面不仅实现功能,还能提供吸引人的用户体验。本文将介绍 CSS 的基本概念、语法、选择器及其在提升网页美观性方面的重要性。 什么是 CSS&…

怎么投稿各大媒体网站?如何快速辨别一家媒体是否适合自己?

在做软文营销时,除去在官号和子账号上投稿外,怎么投稿各大媒体网站是困扰中小企业主的一大难题。没有多余账号、运营成本太高,让不少想做全平台推广的朋友止步于此。为了解决这些问题,今天就让小编来分享一下,怎么在各…

dl学习笔记:(4)简单神经网络

(1)单层正向回归网络 bx1x2z100-0.2110-0.05101-0.051110.1 接下来我们用代码实现这组线性回归数据 import torch x torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]], dtype torch.float32) z torch.tensor([-0.2, -0.05, -0.05, 0.1]) w torch.…

01设计模式(D3_设计模式类型 - D3_行为型模式)

目录 一、模版方法模式 1. 基本介绍 2. 应用案例一:豆浆制作问题 需求 代码实现 模板方法模式的钩子方法 3. View的draw(Android) Android中View的draw方法就是使用了模板方法模式 模板方法模式在 Spring 框架应用的源码分析 知识小…

Android BitmapShader实现狙击瞄具十字交叉线准星,Kotlin

Android BitmapShader实现狙击瞄具十字交叉线准星&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.…

【QT】: 初识 QWidget 控件 | QWidget 核心属性(API) | qrc 文件

&#x1f525; 目录 1. 控件概述 控件体系的发展阶段 2. QWidget 核心属性 2.1 核心属性概览2.2 用件可用&#xff08;Enabled&#xff09; 2.3 坐标系&#xff08;Geometry&#xff09; **实例 1: 控制按钮的位置**实例 2: 表白 程序 2.4 窗口标题&#xff08;windowTiltle&a…

复健第二天之[MoeCTF 2022]baby_file

打开题目在线环境可以看到&#xff1a; 感觉要用伪协议去求&#xff0c;但是我们并不知道flag的位置&#xff0c;这里我选择用dirsearch去扫一下&#xff1a; 最像的应该就是flag.php了 于是就构建payload&#xff1a; **?filephp://filter/convert.base64-encode/resource…

Spring Boot + Apache POI 实现 Excel 导出:BOM物料清单生成器(支持中文文件名、样式美化、数据合并)

目录 引言 Apache POI操作Excel的实用技巧 1.合并单元格操作 2.设置单元格样式 1. 创建样式对象 2. 设置边框 3. 设置底色 4. 设置对齐方式 5. 设置字体样式 6.设置自动换行 7. 应用样式到单元格 3. 定位和操作指定单元格 4.实现标签-值的形式 5.列宽设置 1. 设…

【Web】2025西湖论剑·中国杭州网络安全安全技能大赛题解(全)

目录 Rank-l Rank-U sqli or not Rank-l username存在报错回显&#xff0c;发现可以打SSTI 本地起一个服务&#xff0c;折半查找fuzz黑名单&#xff0c;不断扔给fenjing去迭代改payload from flask import Flask, request, render_template_stringapp Flask(__name__)app…

索引(MySQL)

1. 没有索引&#xff0c;可能会有什么问题 索引&#xff1a;提高数据库的性能&#xff0c;索引是物美价廉的东西了。不用加内存&#xff0c;不用改程序&#xff0c;不用调sql&#xff0c;只要执行 正确的 create index &#xff0c;查询速度就可能提高成百上千倍。但是天下没有…

C#在Json序列化时将key和value转为对应的中文

在C#中&#xff0c;实体类可以通过System.Text.Json或Newtonsoft.Json库等方式直接序列化为json字符串&#xff0c;key为字段&#xff08;属性&#xff09;名&#xff0c;value为值。 上面的方式虽然实现简单&#xff0c;但是有个缺陷&#xff0c;就是转化后的json给外人展示时…

23- TIME-LLM: TIME SERIES FORECASTING BY REPRO- GRAMMING LARGE LANGUAGE MODELS

解决问题 用LLM来解决时序预测问题&#xff0c;并且能够将时序数据映射&#xff08;reprogramming&#xff09;为NLP token&#xff0c;并且保持backbone的大模型是不变的。解决了时序序列数据用于大模型训练数据稀疏性的问题。 方法 Input Embedding 输入&#xff1a; X …

使用 Java 开发 Android 应用:Kotlin 与 Java 的混合编程

使用 Java 开发 Android 应用&#xff1a;Kotlin 与 Java 的混合编程 在开发 Android 应用程序时&#xff0c;我们通常可以选择使用 Java 或 Kotlin 作为主要的编程语言。然而&#xff0c;有些开发者可能会想要在同一个项目中同时使用这两种语言&#xff0c;这就是所谓的混合编…

左神算法基础提升--4

文章目录 树形dp问题Morris遍历 树形dp问题 求解这个问题需要用到我们在基础班上学到的从节点的左子树和右子树上拿信息的方法。 求最大距离主要分为两种情况&#xff1a;1.当前节点参与最大距离的求解&#xff1b;2.当前节点不参与最大距离的求解&#xff1b; 1.当前节点参与最…

拆分工作簿转换PDF格式文件一步到位-Excel易用宝

今天一大早老板急匆匆的跑进办公室说&#xff0c;快快快&#xff0c;&#xff0c;快把这个工作簿中的工作表拆分出来&#xff0c;然后转换成PDF格式文件发给客户。 我一看这么多工作表&#xff0c;又是拆分表格&#xff0c;又是转换文件&#xff0c;这么复杂的工作&#xff0c…

SSM课设-学生管理系统

【课设者】SSM课设-学生管理系统 技术栈: 后端: SpringSpringMVCMybatisMySQLJSP 前端: HtmlCssJavaScriptEasyUIAjax 功能: 学生端: 登陆 学生信息管理 个人信息管理 老师端: 多了教师信息管理 管理员端: 多了班级信息管理 多了年级信息管理 多了系统用户管理

Python调用go语言编译的库

要在 Python 中调用用 Go 语言编写的库&#xff0c;可以使用 Go 语言的 cgo 特性将 Go 代码编译成共享库&#xff08;如 .so 文件&#xff09;&#xff0c;然后在 Python 中通过 ctypes 或 cffi 模块加载和调用这个共享库。 新建main.go文件&#xff0c;使用go语言编写如下代码…