实验2 色彩模式转换

1. 实验目的

①了解常用的色彩模式,理解色彩模式转换原理;
②掌握Photoshop中常用的颜色管理工具和色彩模式转换方法;
③掌握使用Matlab/Python+OpenCV编程实现色彩模式转换的方法。

2. 实验内容

①使用Photoshop中的颜色管理工具,转换色彩模式并查看各通道图像。
②调用Matlab/OpenCV中相关函数,实现RGB、YCbCr、HSV等色彩模式之间的转换;
③使用Matlab/Python,自行编写函数实现任意两个色彩模式之间的转换。

3. 实验过程

3.1 Photoshop颜色管理工具

打开Photoshop,新建空白文件,使用“拾色器”工具,改变前景色和后景色,观察各颜色通道变化规律和变化范围;确定颜色后,使用画笔工具和橡皮擦工具,观察图层变化情况;
① 实验步骤

在这里插入图片描述

②实验结果展示

在这里插入图片描述

3.2 Photoshop实现色彩模式转换

在Photoshop中实现RGB到CMYK,Lab色彩模式的转换,并查看各通道图像。
①实验步骤

在这里插入图片描述
② 实验结果展示
在这里插入图片描述

3.3 使用函数实现色彩模式转换

使用 Matlab/OpenCV中相关函数,实现RGB、YCbCr、HSV等色彩模式之间的转换。具体步骤如下:
⑴将RGB图像分离为R/G/B通道并显示;将R/G/B通道合并为RGB图像。
⑵将RGB图像转换为YCbCr/HSV图像,并分别显示各个通道图像;再将各个通道合并为YCbCr/HSV图像。
⑶将⑵中的YCbCr/HSV图像重新转换为RGB图像。

3.3.1 Matlab实现:

调用Matlab相关函数,实现各色彩模式之间的转换:
① 主要函数及其参数
请填写以下函数对应的参数说明:

rgb2YCbCr(image)rgb2YCbCr(image) 是一个函数,用于将RGB(红绿蓝)图像转换为YCbCr(亮度、蓝色差、红色差)颜色空间
rgb2hsv rgb2hsv 是一个函数,用于将RGB(红绿蓝)图像转换为HSV(色相、饱和度、明度)颜色空间
ycbcr2rgbycbcr2rgb 是一个函数,用于将YCbCr(亮度、蓝色差、红色差)图像转换回RGB(红绿蓝)颜色空间
hsv2rgbhsv2rgb 是一个函数,用于将HSV(色相、饱和度、明度)图像转换为RGB(红绿蓝)颜色空间

② 实验代码展示

%将 RGB 图像分离为 R/G/B 通道并显示,然后将 R/G/B 通道合并为 RGB 图像,可以使用以下函数:% 读取 RGB 图像
rgbImage = imread('lena.png');% 分离 R/G/B 通道
redChannel = rgbImage(:,:,1);
greenChannel = rgbImage(:,:,2);
blueChannel = rgbImage(:,:,3);% 显示 R/G/B 通道图像
figure;
subplot(2,2,1);
imshow(rgbImage);
title('Original RGB Image');
subplot(2,2,2);
imshow(redChannel);
title('Red Channel');
subplot(2,2,3);
imshow(greenChannel);
title('Green Channel');
subplot(2,2,4);
imshow(blueChannel);
title('Blue Channel');% 合并 R/G/B 通道为 RGB 图像
mergedImage = cat(3, redChannel, greenChannel, blueChannel);
figure;
imshow(mergedImage);
title('Merged RGB Image');%将 RGB 图像转换为 YCbCr/HSV 图像,并分别显示各个通道图像,然后将各个通道合并为 YCbCr/HSV 图像,可以使用以下函数:% RGB 转 YCbCr 图像
ycbcrImage = rgb2ycbcr(rgbImage);% 分离 Y/Cb/Cr 通道
yChannel = ycbcrImage(:,:,1);
cbChannel = ycbcrImage(:,:,2);
crChannel = ycbcrImage(:,:,3);% 显示 Y/Cb/Cr 通道图像
figure;
subplot(2,2,1);
imshow(rgbImage);
title('Original RGB Image');
subplot(2,2,2);
imshow(yChannel);
title('Y Channel');
subplot(2,2,3);
imshow(cbChannel);
title('Cb Channel');
subplot(2,2,4);
imshow(crChannel);
title('Cr Channel');% 合并 Y/Cb/Cr 通道为 YCbCr 图像
mergedYCbCrImage = cat(3, yChannel, cbChannel, crChannel);
figure;
imshow(mergedYCbCrImage);
title('Merged YCbCr Image');% RGB 转 HSV 图像
hsvImage = rgb2hsv(rgbImage);% 分离 H/S/V 通道
hChannel = hsvImage(:,:,1);
sChannel = hsvImage(:,:,2);
vChannel = hsvImage(:,:,3);% 显示 H/S/V 通道图像
figure;
subplot(2,2,1);
imshow(rgbImage);
title('Original RGB Image');
subplot(2,2,2);
imshow(hChannel);
title('H Channel');
subplot(2,2,3);
imshow(sChannel);
title('S Channel');
subplot(2,2,4);
imshow(vChannel);
title('V Channel');% 合并 H/S/V 通道为 HSV 图像
mergedHSVImage = cat(3, hChannel, sChannel, vChannel);
figure;
imshow(mergedHSVImage);
title('Merged HSV Image');%将上述步骤中得到的 YCbCr/HSV 图像重新转换为 RGB 图像,可以使用以下函数:% YCbCr 转 RGB 图像
reconstructedRGBImage = ycbcr2rgb(ycbcrImage);
figure;
imshow(reconstructedRGBImage);
title('Reconstructed RGB Image from YCbCr');% HSV 转 RGB 图像
reconstructedRGBImage = hsv2rgb(hsvImage);
figure;
imshow(reconstructedRGBImage);
title('Reconstructed RGB Image from HSV');

②实验结果展示

在这里插入图片描述

3.3.2 Python+OpenCV实现

调用OpenCV中相关函数,实现各色彩模式之间的转换:
① 主要函数及其参数
请填写以下函数对应的参数说明:

cv2.COLOR_BGR2RGBcv2.COLOR_BGR2RGB 是OpenCV库中的一个颜色转换标志,用于将BGR(蓝绿红)颜色空间转换为RGB(红绿蓝)颜色空间
cv2.COLOR_BGR2GRAY cv2.COLOR_BGR2GRAY 是OpenCV库中的一个颜色转换标志,用于将BGR(蓝绿红)图像转换为灰度图像
cv2.COLOR_BGR2HSVcv2.COLOR_BGR2HSV 是OpenCV库中的一个颜色转换标志,用于将BGR(蓝绿红)图像转换为HSV(色相、饱和度、明度)颜色空间

② 实验代码展示

import cv2 as cv
import numpy as np# 读取图像
image = cv.imread('lena.png')# (1) RGB图像通道分离和合并
b, g, r = cv.split(image)  # 分离通道
cv.imshow('Blue Channel', b)
cv.imshow('Green Channel', g)
cv.imshow('Red Channel', r)merged_image = cv.merge([b, g, r])  # 合并通道
cv.imshow('Merged RGB Image', merged_image)
cv.waitKey(0)
cv.destroyAllWindows()# (2) RGB到YCbCr和HSV的转换
ycbcr_image = cv.cvtColor(image, cv.COLOR_BGR2YCrCb)
y, cb, cr = cv.split(ycbcr_image)  # 分离通道
cv.imshow('Y Channel', y)
cv.imshow('Cb Channel', cb)
cv.imshow('Cr Channel', cr)hsv_image = cv.cvtColor(image, cv.COLOR_BGR2HSV)
h, s, v = cv.split(hsv_image)  # 分离通道
cv.imshow('Hue Channel', h)
cv.imshow('Saturation Channel', s)
cv.imshow('Value Channel', v)cv.waitKey(0)
cv.destroyAllWindows()# (3) YCbCr和HSV到RGB的转换
rgb_from_ycbcr = cv.cvtColor(ycbcr_image, cv.COLOR_YCrCb2BGR)
cv.imshow('RGB Image from YCbCr', rgb_from_ycbcr)rgb_from_hsv = cv.cvtColor(hsv_image, cv.COLOR_HSV2BGR)
cv.imshow('RGB Image from HSV', rgb_from_hsv)cv.waitKey(0)
cv.destroyAllWindows()

③实验结果展示
在此仅为部分实验结果

在这里插入图片描述

3.3.3 自行编写代码实现

不调用相关库中的函数,根据色彩模式转换原理,找到各色彩模式对应的转换关系,并自行编写代码实现·RGB、YCbCr、HSV等色彩模式的转换。
①实验代码展示

在这里插入图片描述
② 实验结果展示
效果与上图类似,只需在脚本中调用即可。

4. 实验小结

① 使用调用的Matlab函数,OpenCV函数以及自己编写的函数,进行相同的色彩模式转换。得到的转换结果以及各通道图像是一样的吗?查阅相关资料并分析产生这种结果的原因。
答:算法实现的差异:不同的库或代码实现可能会在算法的具体实现上存在微小的差异。这可能涉及数值计算的舍入误差、通道值的截断或舍入方式等。这些差异可能会导致微小的像素级差异,尤其是在通道值较小的情况下。
数据类型的差异:不同的库或代码实现可能使用不同的数据类型来表示图像和通道值。例如,某些库可能使用整数类型(如uint8)表示通道值,而其他库可能使用浮点类型(如float或double)。这可能会导致数值范围和精度方面的差异。
图像加载和保存的差异:图像加载和保存的过程中可能存在不同的编解码算法或参数设置。这可能导致在图像加载和保存过程中引入一些额外的差异。
② 将10张尺寸为160×60的RGB图像存储在多维数组pic中,多维数组的各个维度分别代表了图像中的哪些信息?在不同的图像处理库中,各个维度所代表的含义一样吗?
答:第一个维度(维度0):表示图像的索引或编号。在这种情况下,它表示第几张图像,范围通常是从0到9。
第二个维度(维度1):表示图像的行索引,即图像的垂直方向。
第三个维度(维度2):表示图像的列索引,即图像的水平方向。
第四个维度(维度3):表示图像的通道索引,通常用于表示图像的不同颜色通道。在RGB图像中,常见的通道顺序是红色(R)、绿色(G)和蓝色(B)

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

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

相关文章

第0章_项目方案介绍

文章目录 第0章 项目方案介绍0.1 功能介绍0.2 硬件方案0.3 软件方案0.3.1 上位机方案0.3.2 **中控方案**0.3.3 **传感器方案**0.3.4 **技术难点** 第0章 项目方案介绍 0.1 功能介绍 本课程来自一个真实项目:多个气体传感器的管理。由于气体传感器比较昂贵&#xf…

比尔盖茨:Agent将是AI最大的赛道

Agent不仅将改变人们与计算机的互动方式,还将颠覆软件行业,引发自从我们从键入命令到点击图标以来计算机领域的最大革命。 保罗艾伦和我一起创立微软的至今,我对软件的热爱至今依然不减。 然而,尽管在过去的几十年中软件已经取得…

Vue.js 和 Node.js 全栈项目的运行与部署指南

Vue.js 和 Node.js 全栈项目的运行与部署指南 前言具体运行方式导入数据库初始化安装配置nodejs启动server后端启动client前端确保前后端正确连接 前言 本博客用来介绍一下一个包含前端和后端代码的全栈项目MoreMall,前端部分使用了 Vue.js,后端部分使用…

多阶段分层构建容器化Spring Boot应用程序

上一节中,容器化spring boot应用程序-CSDN博客我们介绍了基于简单的Dockerfile对spring boot进行容器化的过程,本讲将介绍如何基于Dockerfile进行多阶段的分层构建过程,希望对大家有所帮助。 Spring Boot从版本2.3.0开始支持分层构建容器化的…

Mysql中varchar类型数字排序不对踩坑记录

场景 在进行表设计时将版本号字段设计了为varchar类型,尽量从表设计阶段将数字类型列设计为int型。 再进行排序时如果版本号累计到了10及以上,那么再进行排序时则会出现问题。 比如下面执行排序时发现10被排在了第一位。 这是因为 varchar类型对数字…

已备案网站变更并且不影响现有业务的方案

已备案网站变更并且不影响现有业务的方案 近日有个工作上的需求,已备案网站变更并且不影响现有业务,记录一下。 需求 域名:XXXXXX.com备案变更前主体: 海南XXXXXX科技有限公司 备案变更后主体: 深圳XXXXXX科技有限…

【05】从0到1构建AI生成思维导图应用 -- 前端交互实现

【05】从0到1构建AI生成思维导图应用 – 前端交互实现 大家好!最近自己做了一个完全免费的AI生成思维导图的网站,支持下载,编辑和对接微信公众号,可以在这里体验:https://lt2mind.zeabur.app/ 上一章:http…

【图解大数据技术】Hive、HBase

【图解大数据技术】Hive、HBase Hive数据仓库Hive的执行流程Hive架构数据导入Hive HBaseHBase简介HBase架构HBase的列式存储HBase建表流程HBase数据写入流程HBase数据读取流程 Hive Hive是基于Hadoop的一个数据仓库工具,Hive的数据存储在HDFS上,底层基于…

容器进程

一、容器进程和宿主机进程的关系 容器在进程空间上和宿主机是隔离的,每创建一个容器,该容器都有一个独属的进程空间简称PID NameSpace。但是容器本质也是一个进程,自然是由其父进程创建的,这个可以使用ps aux命令验证。 | 容器视…

Tesseract Python 图片文字识别入门

1、安装tesseract Index of /tesseract https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w64-setup-v5.3.0.20221214.exe 2、安装中文语言包 https://digi.bib.uni-mannheim.de/tesseract/tessdata_fast/ 拷贝到C:\Program Files\Tesseract-OCR\tessdata 3、注…

ISO26262标准

什么是ISO26262? ISO 26262(国际功能安全标准)是一个涵盖整个汽车产品开发过程的汽车功能安全标准。ISO 26262继承或改编自工业自动化行业的安全要求标准IEC61508,但专门为汽车行业量身定制。最新版本是ISO26262-1:2018。 它包括诸如需求分析、安全分析…

STM32CubeMx的学习记录系列(2)- STM32G474RET6

最近有个小比赛,需要用到G4,不过找了一圈没有找到标准库的代码,只能使用hal,用CubeMX来生成配置代码。 共同特点 ARDUINO Uno V3 扩展连接器 ST morpho 扩展引脚接头,可完全访问所有 STM32 I/O 采用LQFP64或LQFP48封…

2-requests模块(6节课学会爬虫)

2-requests模块(6节课学会爬虫) 1,安装requests2,发送get,post请求,获取响应3,response的方法方法一(Response.text)方法二(response.content.decode()&#…

Docker 查看源地址/仓库地址,更改

一、源地址文件配置路径。若有docker文件夹,没有json,可以新增,复制进去内容 /etc/docker/daemon.json {"registry-mirrors": ["https://dockerhub.azk8s.cn","https://hub-mirror.c.163.com",&q…

【数据分析】1、用Pandas计算数据相关性系数

相关性系数和相关分析是了解变量之间关系的重要工具。通过合理选择相关性系数和科学分析数据,能够有效揭示变量之间的关系,为进一步研究和决策提供有力支持。在实际应用中,应结合业务背景、数据特性和统计原则,谨慎解释和应用相关…

【小学期】常用基于Swing的七个静态界面

示例1:基本的带按钮和标签的界面 import javax.swing.*; import java.awt.*;public class SimpleSwingApp1 {public static void main(String[] args) {JFrame frame new JFrame("Simple Swing App 1");frame.setDefaultCloseOperation(JFrame.EXIT_ON_C…

【linux】从零到入门

linux概述 Linux是一个免费使用和自由传播的一套操作系统。用户可以无偿地得到它地源代码,和大量地应用程序,并且可以随意修改和增加它们。 Linux的内核起初由林纳斯编写。内核是啥? 驱动设备,文件系统,进程管理&…

UE5(c++)demo开发日志(1):Actor类添加

工具---新建c类---选用Actor,创造出头文件(.h,用于声明变量、函数、重写父类函数等)和源文件(.cpp,涉及到具体功能实现),客户端界面成功显示出来新建类: Actor头文件默认方法简介: UCLASS(): ue提供的宏&a…

算法-位运算基础

文章目录 1. 前置知识2. 交换两个数3. 比较两个数的大小3. leetcode268 寻找缺失的数字4. leetcode136 只出现一次的数字5. leetcode260 只出现一次的数字|||6. leetcode137 只出现一次的数字||7. 2/3的幂8. 大于等于该数字的最小2的幂9. leetcode201 数字范围按位与10. 位运算…

Docker部署Dillinger个人文本编辑器

Docker部署Dillinger个人文本编辑器 一、Dillinger介绍1.1 Dillinger简介1.2 Dillinger使用场景 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、拉取Dillinger镜像五、部署Dill…