数字图像处理11-rgb,hsi等色彩空间转换

合集下载

图像编码中的颜色空间转换方法探究(二)

图像编码中的颜色空间转换方法探究(二)

图像编码是一种将图像信息转换为可传输或存储的数字信号的技术。

在图像编码中,一种重要的操作是颜色空间转换,它将图像从一个颜色表示空间转换为另一个。

本文将探究图像编码中的颜色空间转换方法。

颜色空间是指用于表示和描述颜色的数学模型。

常见的颜色空间包括RGB(红绿蓝)、CMYK(青、品红、黄、黑)、HSV(色调、饱和度、亮度)等。

在图像编码中,颜色空间的选择是根据图像特性和应用需求进行的。

一种常用的颜色空间转换方法是RGB到灰度空间的转换。

RGB是一种基于红、绿、蓝三个原色的颜色表示方式,每个原色的取值范围为0到255。

在RGB到灰度空间的转换中,通过对RGB三个分量的加权求和来计算得到一个灰度值。

常用的加权公式是Y = + + ,其中Y代表灰度值。

这种转换方法可以简化图像编码和处理的复杂度,同时保留了图像的亮度信息。

另一种常见的颜色空间转换方法是RGB到YUV空间的转换。

YUV是一种将亮度(Y)和色度(U、V)分开表示的颜色空间。

在YUV空间中,Y代表亮度分量,U和V代表色度分量。

这种转换方法可以将图像的亮度信息和色度信息分离开来,提高编码的效率和质量。

在视频编码中,经常使用YUV空间进行压缩编码,以减小数据量和提高压缩比。

除了RGB到灰度空间和RGB到YUV空间的转换方法,还有一些其他的颜色空间转换方法。

例如,RGB到LAB空间的转换是一种广泛使用的颜色空间转换方法。

LAB颜色空间是一种基于人眼感知的颜色模型,其中L代表亮度,A和B表示颜色的位置。

通过将RGB颜色分量映射到LAB空间,可以更好地表示和调整图像的颜色。

除了常见的颜色空间转换方法,还有一些特殊的颜色空间转换方法。

例如,颜色空间转换算法可以根据应用需求进行优化。

在无损压缩领域,颜色空间转换方法可以通过保留更多的像素信息来提高图像的质量。

在有损压缩领域,颜色空间转换方法可以采用较高的离散分辨率来减小数据量。

总结而言,图像编码中的颜色空间转换方法是图像编码的重要环节。

图像处理中的色彩空间变换算法

图像处理中的色彩空间变换算法

图像处理中的色彩空间变换算法随着数字图像技术的不断发展,图像处理在许多领域都得到了广泛应用。

而其中的色彩空间变换算法则是一个非常重要的处理技术,它可以对图像的色彩信息进行转换,实现图像处理的多样化。

一、什么是色彩空间变换算法色彩空间是指在三维坐标系中描述颜色的方法,它将不同的颜色表示成不同的坐标值。

而色彩空间变换算法则是将一个色彩空间中的颜色映射到另一个色彩空间中的算法。

其中比较常用的几种色彩空间包括RGB、CMYK、HSV和LAB等。

以RGB色彩空间为例,它是将颜色表示为红、绿、蓝三种色光混合的色彩空间。

如果想要将RGB色彩空间转换为HSV色彩空间,就需要使用色彩空间变换算法,将RGB空间中的每个色彩点坐标映射到HSV空间中的对应点。

二、色彩空间变换算法的应用色彩空间变换算法可以应用于许多领域,比如数字图像处理、计算机视觉、图像识别等。

其中,数字图像处理是最为广泛的应用领域之一,图像经过色彩空间变换后,可以改变图像的饱和度、明暗度、色调等属性,从而实现滤镜效果、纠偏、色彩增强等多种处理效果。

在具体应用中,常见的色彩空间变换算法包括RGB到HSV、RGB到YUV、RGB到LAB等。

其中RGB到HSV算法可以实现色相、饱和度和亮度的调整,可以产生多种滤镜效果;RGB到YUV算法则可以对图像进行压缩,从而更好地存储和传输图像数据;RGB到LAB算法则可以实现图像的白平衡调整,从而使图像更加真实自然。

三、色彩空间变换算法的实现色彩空间变换算法的实现需要考虑到算法的精度、速度和内存占用等方面的问题。

在实现时,可以采用传统的直接计算方法,也可以利用现有的已经优化过的库实现。

例如,在OpenCV中,可以使用cvtColor()函数来实现各种颜色空间变换。

该函数会自动选择最优的算法,并利用SIMD指令进行加速。

同时,还可以使用Intel IPP和OpenCL等技术来further优化算法,提高图像处理的速度和质量。

[知识]RGB、Lab、YUV、HSI、HSV等颜色空间的区别

[知识]RGB、Lab、YUV、HSI、HSV等颜色空间的区别

RGB、Lab、YUV、HSI、HSV等颜色空间的区别RGB、Lab、YUV、HSI、HSV等颜色空间的区别RGB颜色空间RGB(red,green,blue)颜色空间最常用的用途就是显示器系统,彩色阴极射线管,彩色光栅图形的显示器都使用R、G、B数值来驱动R、G、B 电子枪发射电子,并分别激发荧光屏上的R、G、B三种颜色的荧光粉发出不同亮度的光线,并通过相加混合产生各种颜色;扫描仪也是通过吸收原稿经反射或透射而发送来的光线中的R、G、B成分,并用它来表示原稿的颜色。

RGB色彩空间称为与设备相关的色彩空间,因为不同的扫描仪扫描同一幅图像,会得到不同色彩的图像数据;不同型号的显示器显示同一幅图像,也会有不同的色彩显示结果。

显示器和扫描仪使用的RGB空间与CIE 1931 RGB真实三原色表色系统空间是不同的,后者是与设备无关的颜色空间。

btw:Photoshop的色彩选取器(Color Picker)。

可以显示HSB、RGB、LAB 和CMYK 色彩空间的每一种颜色的色彩值。

Lab 颜色空间Lab颜色空间是由CIE(国际照明委员会)制定的一种色彩模式。

自然界中任何一点色都可以在Lab空间中表达出来,它的色彩空间比RGB 空间还要大。

另外,这种模式是以数字化方式来描述人的视觉感应,与设备无关,所以它弥补了RGB和 CMYK模式必须依赖于设备色彩特性的不足。

由于Lab的色彩空间要比RGB模式和CMYK模式的色彩空间大。

这就意味着RGB以及CMYK所能描述的色彩信息在Lab空间中都能得以影射。

Lab空间取坐标Lab,其中L亮度;a的正数代表红色,负端代表绿色;b的正数代表黄色,负端代表兰色(a,b)有L=116f(y)-16, a=500[f(x/0.982)-f(y)],b=200[f(y)-f(z/1.183 )];其中: f(x)=7.787x+0.138, x<0.008856; f(x)=(x)1/3,x>0.008856。

Python实现RGB与HSI颜色空间的互换方式

Python实现RGB与HSI颜色空间的互换方式

Python实现RGB与HSI颜⾊空间的互换⽅式概要这是这学期数字图像处理课的第⼀份作业好久没懂python⼿都快⽣了,调了好久才搞出来。

HSI颜⾊模型是⼀个满⾜计算机数字化颜⾊管理需要的⾼度抽象模拟的数学模型。

HIS模型是从⼈的视觉系统出发,直接使⽤颜⾊三要素–⾊调(Hue)、饱和度(Saturation)和亮度(Intensity,有时也翻译作密度或灰度)来描述颜⾊。

RGB向HSI模型的转换是由⼀个基于笛卡尔直⾓坐标系的单位⽴⽅体向基于圆柱极坐标的双锥体的转换。

基本要求是将RGB 中的亮度因素分离,通常将⾊调和饱和度统称为⾊度,⽤来表⽰颜⾊的类别与深浅程度。

在图中圆锥中间的横截⾯圆就是⾊度圆,⽽圆锥向上或向下延伸的便是亮度分量的表⽰。

(这⾥直接借鉴这篇⽂章:)从RGB空间到HSI空间的转换有多种⽅法,这⾥仅说明最为经典的⼏何推导法。

RGB转化成HSI的公式为:HSI转化成RGB的公式为:Python代码:#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2017/10/14 13:21# @Author : DaiPuWei# @Site : 理学院机房# @File : __init__.py.py# @Software: PyCharm Community Editionimport cv2import numpy as npdef RGB2HSI(rgb_img):"""这是将RGB彩⾊图像转化为HSI图像的函数:param rgm_img: RGB彩⾊图像:return: HSI图像"""#保存原始图像的⾏列数row = np.shape(rgb_img)[0]col = np.shape(rgb_img)[1]#对原始图像进⾏复制hsi_img = rgb_img.copy()#对图像进⾏通道拆分B,G,R = cv2.split(rgb_img)#把通道归⼀化到[0,1][B,G,R] = [ i/ 255.0 for i in ([B,G,R])]H = np.zeros((row, col)) #定义H通道I = (R + G + B) / 3.0 #计算I通道S = np.zeros((row,col)) #定义S通道for i in range(row):den = np.sqrt((R[i]-G[i])**2+(R[i]-B[i])*(G[i]-B[i]))thetha = np.arccos(0.5*(R[i]-B[i]+R[i]-G[i])/den) #计算夹⾓ h = np.zeros(col) #定义临时数组#den>0且G>=B的元素h赋值为thethah[B[i]<=G[i]] = thetha[B[i]<=G[i]]#den>0且G<=B的元素h赋值为thethah[G[i]<B[i]] = 2*np.pi-thetha[G[i]<B[i]]#den<0的元素h赋值为0h[den == 0] = 0H[i] = h/(2*np.pi) #弧度化后赋值给H通道#计算S通道for i in range(row):min = []#找出每组RGB值的最⼩值for j in range(col):arr = [B[i][j],G[i][j],R[i][j]]min.append(np.min(arr))min = np.array(min)#计算S通道S[i] = 1 - min*3/(R[i]+B[i]+G[i])#I为0的值直接赋值0S[i][R[i]+B[i]+G[i] == 0] = 0#扩充到255以⽅便显⽰,⼀般H分量在[0,2pi]之间,S和I在[0,1]之间 hsi_img[:,:,0] = H*255hsi_img[:,:,1] = S*255hsi_img[:,:,2] = I*255return hsi_imgdef HSI2RGB(hsi_img):"""这是将HSI图像转化为RGB图像的函数:param hsi_img: HSI彩⾊图像:return: RGB图像"""# 保存原始图像的⾏列数row = np.shape(hsi_img)[0]col = np.shape(hsi_img)[1]#对原始图像进⾏复制rgb_img = hsi_img.copy()#对图像进⾏通道拆分H,S,I = cv2.split(hsi_img)#把通道归⼀化到[0,1][H,S,I] = [ i/ 255.0 for i in ([H,S,I])]R,G,B = H,S,Ifor i in range(row):h = H[i]*2*np.pi#H⼤于等于0⼩于120度时a1 = h >=0a2 = h < 2*np.pi/3a = a1 & a2 #第⼀种情况的花式索引tmp = np.cos(np.pi / 3 - h)b = I[i] * (1 - S[i])r = I[i]*(1+S[i]*np.cos(h)/tmp)g = 3*I[i]-r-bB[i][a] = b[a]R[i][a] = r[a]G[i][a] = g[a]#H⼤于等于120度⼩于240度a1 = h >= 2*np.pi/3a2 = h < 4*np.pi/3a = a1 & a2 #第⼆种情况的花式索引tmp = np.cos(np.pi - h)r = I[i] * (1 - S[i])g = I[i]*(1+S[i]*np.cos(h-2*np.pi/3)/tmp)b = 3 * I[i] - r - gR[i][a] = r[a]G[i][a] = g[a]B[i][a] = b[a]#H⼤于等于240度⼩于360度a1 = h >= 4 * np.pi / 3a2 = h < 2 * np.pia = a1 & a2 #第三种情况的花式索引tmp = np.cos(5 * np.pi / 3 - h)g = I[i] * (1-S[i])b = I[i]*(1+S[i]*np.cos(h-4*np.pi/3)/tmp)r = 3 * I[i] - g - bB[i][a] = b[a]G[i][a] = g[a]R[i][a] = r[a]rgb_img[:,:,0] = B*255rgb_img[:,:,1] = G*255rgb_img[:,:,2] = R*255return rgb_imgdef run_main():"""这是主函数"""#利⽤opencv读⼊图⽚rgb_img = cv2.imread('1.jpeg',cv2.IMREAD_COLOR)#进⾏颜⾊空间转换hsi_img = RGB2HSI(rgb_img)rgb_img2 = HSI2RGB(hsi_img)#opencv库的颜⾊空间转换结果hsi_img2 = cv2.cvtColor(rgb_img,cv2.COLOR_BGR2HSV)rgb_img3 = cv2.cvtColor(hsi_img2,cv2.COLOR_HSV2BGR)cv2.imshow("Origin",rgb_img)cv2.imshow("HSI", hsi_img)cv2.imshow("RGB",rgb_img2)cv2.imshow("OpenCV_HSI",hsi_img2)cv2.imshow("OpenCV_RGB",rgb_img3)cv2.imwrite("HSI.jpeg",hsi_img)cv2.imwrite("RGB.jpeg", rgb_img2)cv2.imwrite("OpenCV_HSI.jpeg", hsi_img2)cv2.imwrite("OpenCV_RGB.jpeg", rgb_img3)cv2.waitKey()cv2.destroyAllWindows()if __name__ == '__main__':run_main()原始图像为:⾃⼰写的RGB2HSI函数⽣成的HSI图⽚:opencv库函数⽣成的HSI图⽚:⽤⾃⼰写的函数⽣成导⼊HSI图⽚执⾏HSI2RGB函数⽣成的RGB图⽚:opencv库函数⽣成的HSI图⽚在此执⾏库函数⽣成RGB图⽚:以上这篇Python实现RGB与HSI颜⾊空间的互换⽅式就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

RGB转换HSI

RGB转换HSI

RGB与HSI颜色模型的转换方法对比研究刘华波华中农业大学资源环境学院liuhuabo@摘要:HSI模型由RGB模型转换而来,不同的转换思路的会形成各具特色的HSI模型。

本文概述了二种模型间的几种主要的转换方法,分析比较了各自的异同,并进行了应用举例。

关键词:RGB-HSI 转换,颜色模型,对比研究中图分类号:TP391.41在进行数字图像处理和识别时,颜色常常是一个重要的研究对象。

RGB和HSI模型是二种最常用的颜色模型。

RGB模型基于三基色原理,面向硬件,便于颜色的采集和显示。

HSI模型基于色调(Hue)-饱和度(Saturation)-亮度(Intensity)理论,符合人类观察和感受颜色的视觉及心理学特点,便于从主观出发对颜色进行操作。

1 相关概念1905年美国人孟塞尔(Albert H.Munsell )直接使用人眼对比实验法标定颜色,创立了以其名字命名的色彩表示系统--Munsell Color System。

该系统面向人类视觉感受,把颜色的三种基本属性色相、明度、饱和度分离,形成一个类纺锤体的三维色域空间。

孟塞尔系统和较晚出现的Ostwald(1923年,德国)和PCCS(1964年,日本)等颜色表示系统都符合二个基本原则,一是颜色恒常性原则,即将亮度和色度(色调+饱和度)独立表示; 二是色度二极渐弱原则,即亮度适中时人眼对色彩的分辨力最强,颜色的种类最多,而亮度趋强或趋弱时,分辨力会降低,直至为零。

Munsell Ostwald PCCS图1几种面向人类视觉的颜色表示系统上述颜色表示系统的颜色值离散而复杂,没有具体的描述公式,不利于数学演算和数字化应用。

HSI模型就是为了满足计算机数字化颜色管理的需要而提出的对上述颜色模型的高度抽象模拟的数学模型。

HSI为英文Hue,Saturation,Intensity的缩写形式。

HSI模型除了符合上述模型的二大基本特点,还要求能够与现有模型互相转换。

数字图像处理中的颜色空间转换与均值滤波技术

数字图像处理中的颜色空间转换与均值滤波技术

数字图像处理中的颜色空间转换与均值滤波技术数字图像处理是现代计算机科学和数字信号处理中一个非常重要的研究领域。

在数字图像处理中,颜色空间转换和均值滤波是其中两个基本且常见的技术。

一、颜色空间转换颜色空间转换是将图像从一种颜色表示方式转换到另一种颜色表示方式的过程。

常见的颜色空间包括RGB(红绿蓝)、CMYK(青黄洋红黑)和HSV(色调饱和度明度)等。

在数字图像处理中,颜色空间转换的目的往往是为了满足特定的应用需求。

例如,在计算机视觉中,HSV颜色空间常用于目标检测和跟踪,因为它更符合人类感知颜色的方式,能够更好地区分不同颜色之间的差异。

另外,颜色空间转换也经常用于图像增强和颜色校正。

通过将图像从RGB颜色空间转换到LAB(明度a通道b通道)颜色空间,可以实现对图像的亮度和对比度进行调整,以达到更好的视觉效果。

而在印刷行业,CMYK颜色空间常用于图像的输出和打印,因为它能够更好地模拟出印刷过程中的真实颜色。

二、均值滤波技术均值滤波是一种基础的图像平滑处理技术,通过将每个像素的值替换为其周围邻域像素值的平均值来实现。

均值滤波的主要目的是去除图像中的噪声,使得图像更加清晰和平滑。

在数字图像处理中,均值滤波的具体实现方式有很多种,包括简单平均滤波器、加权平均滤波器和自适应平均滤波器等。

其中,简单平均滤波器是最基础的一种,它将周围像素的值全部取平均,然后得到新的像素值。

然而,简单平均滤波器存在一个问题,即在去除噪声的同时也会模糊图像的细节。

为了解决这个问题,加权平均滤波器和自适应平均滤波器被提出。

它们通过赋予不同的权重给邻域像素,使得滤波器更加关注图像的纹理细节,从而在去噪的同时保留更多的图像信息。

总结:数字图像处理中的颜色空间转换和均值滤波是常见且重要的技术。

颜色空间转换可以帮助我们更好地理解和处理图像的颜色信息,同时也提供了更多的应用选择。

均值滤波则可以在去除图像噪声的同时保持图像细节,提供更好的视觉效果。

RGB图和HSI图转换

RGB图和HSI图转换

摘要所谓彩色模型就是指摸个三维颜色空间中的一个可见光子集。

它包含某个颜色域的所有颜色。

例如,RGB颜色模型就是三维直角坐标颜色系统的一个单位正方体。

颜色模型的用途是在某个颜色域内方便的制定颜色,由于每一个颜色域都是可见光的子集,所以任何一个颜色模型都无法包含所有得可见光。

在大多数的颜色图形显示设备一般都是使用红、绿、蓝三原色,我们的真实感图形学中的主要的颜色模型也是RGB模型,但是红、绿、蓝颜色模型用起来不太方便,它与直观的颜色概念如色调、饱和度和亮度等没有直接的联系。

计算机彩色显示器显示色彩的原理与彩色电视机一样,都是采用R、G、B 相加混色的原理。

通过发射出三种不同强度的电子束,使屏幕内侧覆盖的红、绿、蓝磷光材料发光尔产生色彩的。

这种色彩的表示方法称为RGB色彩空间表示。

HSV 颜色模型中颜色的参数分别是:色彩,纯度,明度。

HSV模型的三维表示是一种比较直观的颜色模型,在许多图形编辑工具中应用比较广泛。

如Photoshop等等。

但这也决定了他不适合使用在光照模型中。

YCbCr是DVD、摄像机、数字电视等消费类视频产品中,常用的色彩编码方案。

YCbCr有时也会称为YCC。

YCbCr在模拟分量视频中也常被称为YPbpr。

关键词:颜色模型;RGB;HSV;YCbCr目录1 课程设计目的.......................................... 错误!未定义书签。

2 课程设计要求 (1)3 MATLAB简介 (2)3.1 MATLAB主要功能 (2)3.2 MATLAB优势 (2)3.2.1 工作平台和编程环境 (2)3.2.2 程序语言 (3)3.2.3 科学计算机数据处理能力 (3)3.2.4图形处理功能 (3)3.2.5模块集合工具箱 (4)3.3 MATLAB函数与数据类型 (4)4 设计方案 (4)5 程序编码 (5)5.1 将RGB图像与HSI图像互相转换 (5)5.2 将RGB图像转换到NTSC图像 (8)6 仿真结果 (9)7 结论 (11)8 参考文献 (12)1 课程设计目的彩色模型也称为彩色空间或彩色系统,是描述色彩的一种方法。

图像处理技术的颜色空间转换与调整方法

图像处理技术的颜色空间转换与调整方法

图像处理技术的颜色空间转换与调整方法在图像处理中,颜色空间的转换和调整是非常重要的技术手段。

通过改变图像的颜色空间,我们可以达到多种效果,如增强图像的对比度、改变图像的色调和饱和度等。

本文将介绍几种常见的图像处理技术的颜色空间转换与调整方法。

一、RGB颜色空间转换与调整方法RGB颜色空间是一种最常见的图像颜色表示方式,它通过红、绿和蓝三个颜色通道来描述图像的颜色。

RGB颜色空间转换与调整的方法主要包括以下几种:1. 色彩平衡调整:色彩平衡调整可以改变图像中红、绿、蓝三个通道的相对强度,从而调整整个图像的色调。

通过增加或减小某个通道的亮度,可以使图像呈现不同的色彩效果。

2. 亮度调整:亮度调整可以改变图像的整体亮度,使图像变得明亮或暗淡。

通过调整RGB三个通道的亮度,可以在保持颜色信息不变的情况下,调整图像的明暗。

3. 对比度调整:对比度调整可以改变图像中颜色的差异程度,使图像更加鲜明。

通过调整RGB三个通道的对比度,可以使图像的黑白部分更加明确,颜色部分更加饱和。

二、HSV颜色空间转换与调整方法HSV颜色空间是一种将颜色的属性(色调Hue)、饱和度(Saturation)和明度(Value)分开表示的颜色模型。

HSV颜色空间转换与调整的方法包括以下几种:1. 饱和度调整:饱和度调整可以改变图像中颜色的鲜艳程度,使图像的颜色更加饱和或褪色。

通过调整S通道的数值,可以增加或减小图像的饱和度。

2. 明度调整:明度调整可以改变图像的亮度,使图像变得明亮或暗淡。

通过调整V通道的数值,可以调整图像的明暗程度。

3. 色调调整:色调调整可以改变图像中颜色的种类,使图像呈现不同的色调。

通过调整H通道的数值,可以改变图像的色调,如从蓝色调整为红色。

三、LAB颜色空间转换与调整方法LAB颜色空间是一种将颜色的亮度L与颜色的两个对立色a与b分开表示的颜色模型。

LAB颜色空间转换与调整的方法包括以下几种:1. 亮度调整:亮度调整可以改变图像的整体亮度,使图像变得明亮或暗淡。

图像处理技术中的颜色空间变换方法

图像处理技术中的颜色空间变换方法

图像处理技术中的颜色空间变换方法图像处理是一种通过计算机技术对图像进行更改、增强或改进的过程。

在图像处理的过程中,颜色是一个非常重要的因素,因为有效的颜色处理可以改善图像的质量并提供更多的细节。

颜色空间变换是图像处理中一种广泛应用的方法,用于在不同的颜色空间之间转换图像。

不同的颜色空间在表示颜色时使用不同的数学模型和通道。

以下是几种常见的颜色空间变换方法。

1. RGB到灰度变换:RGB(红绿蓝)是最常用的颜色空间之一,它使用红、绿和蓝三个通道来表示颜色。

然而,有时我们只需要图像的亮度信息,而不需要彩色信息。

在这种情况下,可以使用RGB到灰度的颜色空间变换方法。

转换后的图像只包含一个通道,它表示图像的亮度级别,而不包含颜色信息。

2. RGB到HSV变换:HSV(色调、饱和度和亮度)是另一种常用的颜色空间,它更直观地表示颜色。

HSV颜色空间将颜色表示为色调、饱和度和亮度三个通道。

色调表示颜色的基本属性,饱和度表示颜色的纯度,而亮度表示颜色的亮暗程度。

通过将RGB图像转换为HSV颜色空间,可以更好地处理颜色信息,例如调整图像的色调或饱和度。

3. RGB到CMYK变换:CMYK(青、洋红、黄、黑)是一种用于印刷颜色的颜色空间。

和RGB颜色空间一样,CMYK也使用四个通道来表示颜色。

在颜色印刷中,通过组合不同比例的青、洋红、黄和黑墨水,可以产生各种颜色。

通过将RGB图像转换为CMYK 颜色空间,可以更准确地表示颜色,以便进行印刷。

4. RGB到YUV变换:YUV是一种用于视频和电视颜色表示的颜色空间。

它将颜色分为亮度(Y)和两个色度(U、V)通道。

亮度表示图像的明亮程度,而色度表示颜色的色彩。

由于人眼对亮度更敏感,而对色彩不太敏感,将RGB图像转换为YUV颜色空间可以节省存储空间,并且在视频编码和传输中更加有效。

5. HSV到RGB变换:HSV到RGB的颜色空间变换方法常用于图像分割和对象检测等应用中。

通过将HSV图像转换回RGB空间,可以将处理后的图像重新映射到原始的RGB空间,以便进行后续的分析和处理。

色彩空间变换算法

色彩空间变换算法

色彩空间变换算法1. 引言色彩空间变换算法是数字图像处理中的一项重要技术,它可以将图像从一个色彩空间转换到另一个色彩空间。

不同的色彩空间具有不同的特点和应用场景,通过变换可以改变图像的颜色表现方式,从而达到不同的视觉效果和应用目的。

本文将介绍常见的色彩空间及其相互之间的转换算法。

2. RGB色彩空间RGB(红绿蓝)是最常见也是最直观的一种色彩空间。

在RGB色彩空间中,通过调节红、绿、蓝三个分量的强度来表示不同颜色。

通常情况下,每个分量的取值范围为0-255。

2.1 RGB到HSV的转换算法HSV(色相、饱和度、明度)是另一种广泛使用的颜色表示方法。

HSV模型将颜色分为三个维度:色相(H),饱和度(S)和明度(V)。

其中,H表示颜色在环形连续光谱上所处位置,取值范围为0-360;S表示颜色饱和度,取值范围为0-1;V 表示颜色的明度,取值范围为0-1。

RGB到HSV的转换算法如下所示:def RGB2HSV(R, G, B):R = R / 255.0G = G / 255.0B = B / 255.0Cmax = max(R, G, B)Cmin = min(R, G, B)delta = Cmax - Cminif delta == 0:H = 0elif Cmax == R:H = 60 * ((G - B) / delta % 6)elif Cmax == G:H = 60 * ((B - R) / delta + 2)else:H = 60 * ((R - G) / delta + 4)if Cmax == 0:S = 0else:S = delta / CmaxV = Cmaxreturn H, S, V2.2 RGB到CMYK的转换算法CMYK(青、品红、黄、黑)是一种用于印刷颜色的色彩空间。

CMYK模型通过调节青、品红、黄三个颜料的浓度以及黑色墨水的使用量来表示不同颜色。

通常情况下,每个分量的取值范围为0-100。

RGB空间与HSI空间的转换算法的C#实现

RGB空间与HSI空间的转换算法的C#实现

RGB空间与HSI空间的转换算法的C#实现这是我为数字化病理项⽬做的准备,将部分MATLAB函数的功能在C#上实现。

完成标题中所说的功能,当然⾸先需要定义我⾃⼰的RGB类和HSI类。

RGB类:1///<summary>2/// RGB colorspace3///</summary>4public sealed class RGB5 {6///<summary>7/// Red component8///</summary>9public byte Red;1011///<summary>12/// Green component13///</summary>14public byte Green;1516///<summary>17/// Blue component18///</summary>19public byte Blue;2021///<summary>22/// Index of Red component23///</summary>24public const short R = 2;2526///<summary>27/// Index of Green component28///</summary>29public const short G = 1;3031///<summary>32/// Index of Blue component33///</summary>34public const short B = 0;3536///<summary>37/// Initializes a new instance of the RGB class38///</summary>39public RGB() { }4041///<summary>42/// Initializes a new instance of the RGB class43///</summary>44///<param name="red">Red component</param>45///<param name="green">Green component</param>46///<param name="blue">Blue component</param>47public RGB(byte red, byte green, byte blue)48 {49this.Red = red;50this.Green = green;51this.Blue = blue;52 }5354///<summary>55/// Initializes a new instance of the RGB class56///</summary>57///<param name="color">Input color</param>58public RGB(Color color)59 {60this.Red = color.R;61this.Green = color.G;62this.Blue = color.B;63 }6465///<summary>66/// Color property67///</summary>68public System.Drawing.Color Color69 {70get { return Color.FromArgb(Red, Green, Blue); }71set72 {73this.Red = value.R;74this.Green = value.G;75this.Blue = value.B;76 }77 }7879public override string ToString()80 {81return String.Format("RGB: ({0},{1},{2})", Red, Green, Blue);82 }83 }HSI类:1///<summary>2/// HSI colorspace3///</summary>4///<remarks>All components normalized</remarks>5public sealed class HSI6 {7///<summary>8/// Hue component9///</summary>10///<remarks>Hue ranges [0,1]</remarks>11public double Hue;1213///<summary>14/// Saturation component15///</summary>16///<remarks>Saturation ranges [0,1]</remarks>17public double Saturation;1819///<summary>20/// Intensity component21///</summary>22///<remarks>Intensity ranges [0,1]</remarks>23public double Intensity;2425///<summary>26/// Initializes a new instance of the HSI class27///</summary>28public HSI() { }2930///<summary>31/// Initializes a new instance of the HSI class32///</summary>33///<param name="hue">Hue component</param>34///<param name="saturation">Saturation component</param>35///<param name="intensity">Intensity component</param>36public HSI(int hue, double saturation, double intensity)37 {38this.Hue = hue;39this.Saturation = saturation;40this.Intensity = intensity;41 }4243public override string ToString()44 {45return String.Format("HSI: ({0},{1},{2})", Hue, Saturation, Intensity);46 }47 }然后参照《Digital Image Processing Using MATLAB》上的算法实现扩展⽅法:1///<summary>2/// This helper class provides with colorspace-convertion extension methods3///</summary>4///<remarks>The algorithms are from "Digital Image Processing Using MATLAB" (DIPUM)</remarks>5public static class ColorspaceHelper6 {7///<summary>8/// Convert RGB colorspace to HSI colorspace9///</summary>10///<param name="rgb">Input RGB pixel</param>11///<returns>HSI colorspace pixel</returns>12public static HSI RGB2HSI(this RGB rgb)13 {14 HSI hsi = new HSI();1516double r = (rgb.Red / 255.0);17double g = (rgb.Green / 255.0);18double b = (rgb.Blue / 255.0);1920double theta = Math.Acos(0.5 * ((r - g) + (r - b)) / Math.Sqrt((r - g) * (r - g) + (r - b) * (g - b))) / (2 * Math.PI); 2122 hsi.Hue = (b <= g) ? theta : (1 - theta);2324 hsi.Saturation = 1 - 3 * Math.Min(Math.Min(r, g), b) / (r + g + b);2526 hsi.Intensity = (r + g + b) / 3;2728return hsi;29 }3031///<summary>32/// Convert HSI colorspace to RGB colorspace33///</summary>34///<param name="hsi">Input HSI pixel</param>35///<returns>RGB colorspace pixel</returns>36public static RGB HSI2RGB(this HSI hsi)37 {38double r, g, b;3940double h = hsi.Hue;41double s = hsi.Saturation;42double i = hsi.Intensity;4344 h = h * 2 * Math.PI;4546if (h >= 0 && h < 2 * Math.PI / 3)47 {48 b = i * (1 - s);49 r = i * (1 + s * Math.Cos(h) / Math.Cos(Math.PI / 3 - h));50 g = 3 * i - (r + b);51 }52else if (h >= 2 * Math.PI / 3 && h < 4 * Math.PI / 3)53 {54 r = i * (1 - s);55 g = i * (1 + s * Math.Cos(h - 2 * Math.PI / 3) / Math.Cos(Math.PI - h));56 b = 3 * i - (r + g);57 }58else//if (h >= 4 * Math.PI / 3 && h <= 2 * Math.PI)59 {60 g = i * (1 - s);61 b = i * (1 + s * Math.Cos(h - 4 * Math.PI / 3) / Math.Cos(5 * Math.PI / 3 - h));62 r = 3 * i - (g + b);63 }6465return new RGB((byte)(r * 255.0 + .5), (byte)(g * 255.0 + .5), (byte)(b * 255.0 + .5));66 }67 }。

RGB颜色空间和HSI颜色空间的相互转换

RGB颜色空间和HSI颜色空间的相互转换

RGB颜⾊空间和HSI颜⾊空间的相互转换转载⾃:关于HSI颜⾊空间参照维基百科:也可参考清华⼤学图像处理课件:下⾯是别⼈利⽤opencv来实现的RGB转化为HSI空间核⼼的转换公式:RGB-->HSI截图来⾃中科院刘定⽣⽼师的《数字图像处理与分析》课件。

HSI-->RGB具体的数学公式参照冈萨雷斯版《数字图像处理(第三版)》432-434页,中译版的260-261页。

下⾯贴代码:1 #include "opencv_libs.h"2 #include <highgui.h>3 #include <cv.h>4 #include <math.h>56 /*7 * 描述:实现RGB颜⾊模型到HSI颜⾊模型之间的相互转换8 * 作者:qdsclove(qdsclove@)9 * 时间:16:01 4/17 星期三 201310 */1112 // 将HSI颜⾊空间的三个分量组合起来,便于显⽰13 IplImage* catHSImage(CvMat* HSI_H, CvMat* HSI_S, CvMat* HSI_I)14 {15 IplImage* HSI_Image = cvCreateImage( cvGetSize( HSI_H ), IPL_DEPTH_8U, 3 );1617 for(int i = 0; i < HSI_Image->height; i++)18 {19 for(int j = 0; j < HSI_Image->width; j++)20 {21 double d = cvmGet( HSI_H, i, j );22 int b = (int)(d * 255/360);23 d = cvmGet( HSI_S, i, j );24 int g = (int)( d * 255 );25 d = cvmGet( HSI_I, i, j );26 int r = (int)( d * 255 );2728 cvSet2D( HSI_Image, i, j, cvScalar( b, g, r ) );29 }30 }3132 return HSI_Image;33 }3435 // 将HSI颜⾊模型的数据转换为RGB颜⾊模型的图像36 IplImage* HSI2RGBImage(CvMat* HSI_H, CvMat* HSI_S, CvMat* HSI_I)37 {38 IplImage * RGB_Image = cvCreateImage(cvGetSize(HSI_H), IPL_DEPTH_8U, 3 );3940 int iB, iG, iR;41 for(int i = 0; i < RGB_Image->height; i++)42 {43 for(int j = 0; j < RGB_Image->width; j++)44 {45 // 该点的⾊度H46 double dH = cvmGet( HSI_H, i, j );47 // 该点的⾊饱和度S48 double dS = cvmGet( HSI_S, i, j );49 // 该点的亮度50 double dI = cvmGet( HSI_I, i, j );5152 double dTempB, dTempG, dTempR;53 // RG扇区54 if(dH < 120 && dH >= 0)55 {56 // 将H转为弧度表⽰57 dH = dH * 3.1415926 / 180;58 dTempB = dI * (1 - dS);59 dTempR = dI * ( 1 + (dS * cos(dH))/cos(3.1415926/3 - dH) );60 dTempG = (3 * dI - (dTempR + dTempB));61 }62 // GB扇区63 else if(dH < 240 && dH >= 120)64 {65 dH -= 120;6667 // 将H转为弧度表⽰68 dH = dH * 3.1415926 / 180;6970 dTempR = dI * (1 - dS);71 dTempG = dI * (1 + dS * cos(dH)/cos(3.1415926/3 - dH));72 dTempB = (3 * dI - (dTempR + dTempG));73 }74 // BR扇区75 else76 {77 dH -= 240;7879 // 将H转为弧度表⽰80 dH = dH * 3.1415926 / 180;8182 dTempG = dI * (1 - dS);83 dTempB = dI * (1 + (dS * cos(dH))/cos(3.1415926/3 - dH));84 dTempR = (3* dI - (dTempG + dTempB));85 }8687 iB = dTempB * 255;88 iG = dTempG * 255;89 iR = dTempR * 255;9091 cvSet2D( RGB_Image, i, j, cvScalar( iB, iG, iR ) );92 }93 }9495 return RGB_Image;96 }979899 int main()100 {101 IplImage* img = cvLoadImage("lena.bmp");102103 // 三个HSI空间数据矩阵104 CvMat* HSI_H = cvCreateMat( img->height, img->width, CV_32FC1 );105 CvMat* HSI_S = cvCreateMat( img->height, img->width, CV_32FC1 );106 CvMat* HSI_I = cvCreateMat( img->height, img->width, CV_32FC1 );107108 // 原始图像数据指针, HSI矩阵数据指针109 uchar* data;110111 // rgb分量112 byte img_r, img_g, img_b;113 byte min_rgb; // rgb分量中的最⼩值114 // HSI分量115 float fHue, fSaturation, fIntensity;116117 for(int i = 0; i < img->height; i++)118 {119 for(int j = 0; j < img->width; j++)120 {121 data = cvPtr2D(img, i, j, 0);122 img_b = *data;123 data++;124 img_g = *data;125 data++;126 img_r = *data;127128 // Intensity分量[0, 1]129 fIntensity = (float)((img_b + img_g + img_r)/3)/255;130131 // 得到RGB分量中的最⼩值132 float fTemp = img_r < img_g ? img_r : img_g;133 min_rgb = fTemp < img_b ? fTemp : img_b;134 // Saturation分量[0, 1]135 fSaturation = 1 - (float)(3 * min_rgb)/(img_r + img_g + img_b);136137 // 计算theta⾓138 float numerator = (img_r - img_g + img_r - img_b ) / 2;139 float denominator = sqrt(140 pow( (img_r - img_g), 2 ) + (img_r - img_b)*(img_g - img_b) );141142 // 计算Hue分量143 if(denominator != 0)144 {145 float theta = acos( numerator/denominator) * 180/3.14;146147 if(img_b <= img_g)148 {149 fHue = theta ;150 }151 else152 {153 fHue = 360 - theta;154 }155 }156 else157 {158 fHue = 0;159 }160161 // 赋值162 cvmSet( HSI_H, i, j, fHue );163 cvmSet( HSI_S, i, j, fSaturation);164 cvmSet( HSI_I, i, j, fIntensity );165 }166 }167168 IplImage* HSI_Image = catHSImage( HSI_H, HSI_S, HSI_I );169 IplImage* RGB_Image = HSI2RGBImage( HSI_H, HSI_S, HSI_I );170171 cvShowImage("img", img);172 cvShowImage("HSI Color Model", HSI_Image);173 cvShowImage("RGB Color Model", RGB_Image);174175 cvWaitKey(0);176177 cvReleaseImage( &img );178 cvReleaseImage( &HSI_Image );179 cvReleaseImage( &RGB_Image );180 cvReleaseMat( &HSI_H);181 cvReleaseMat( &HSI_S);182 cvReleaseMat( &HSI_I);183184 cvDestroyAllWindows();185186 return 0;187 }写的⽐较仓促,代码结构稍微有点混乱。

图像编码中的颜色空间转换方法探究(一)

图像编码中的颜色空间转换方法探究(一)

图像编码是数字图像处理中的重要环节,对图像的颜色空间进行转换是图像编码中的一项关键任务。

颜色空间转换是将一个颜色表示方式转换为另一个表示方式的过程,通过颜色空间的转换可以实现图像的色彩增强、噪声去除和图像压缩等操作。

本文将探究图像编码中的颜色空间转换方法。

一、RGB色彩空间RGB是图像最常用的颜色空间之一,它采用红(Red)、绿(Green)、蓝(Blue)三原色的叠加来表示颜色。

在RGB空间中,每一个像素点都用三个分量表示其颜色,分别表示红色、绿色和蓝色的强度。

这三个分量的取值范围为0-255,分别对应于颜色强度的最小值和最大值。

通过RGB色彩空间,可以准确地表示各种颜色。

二、HSV色彩空间HSV(Hue-Saturation-Value)是一种用于描述颜色的模型。

在HSV空间中,H表示色调,取值范围为0-360度,对应于红色、橙色、黄色等颜色;S表示饱和度,取值范围为0-1,表示颜色的纯度;V表示亮度,取值范围为0-1,表示颜色的明亮程度。

HSV色彩空间常用于图像的颜色分割和图像处理等领域,它具有较强的直观性和可操作性。

三、CMYK色彩空间CMYK是一种用于印刷颜色的模型,它采用青(Cyan)、品红(Magenta)、黄(Yellow)和黑(Black)四种颜色的叠加来表示颜色。

在CMYK空间中,C表示青色的强度,M表示品红色的强度,Y表示黄色的强度,K表示黑色的强度。

CMYK色彩空间常用于印刷和打印领域,它可以准确地表示各种印刷颜色。

四、颜色空间转换方法在图像编码中,颜色空间转换是将不同颜色空间的像素值相互转换的过程。

常见的颜色空间转换方法有以下两种:1. RGB到HSV的转换RGB到HSV的转换可以通过以下公式进行计算:V = max(R, G, B)S = (V - min(R, G, B)) / VH = 60 * (G - B) / (V - min(R, G, B)), 当V = R时H = 60 * (B - R) / (V - min(R, G, B)) + 120, 当V = G时H = 60 * (R - G) / (V - min(R, G, B)) + 240, 当V = B时H = 0, 当V = 0其中,R、G、B分别表示像素点的红、绿、蓝分量,H、S、V分别表示像素点的色调、饱和度、亮度。

计算机数字图像处理常用颜色空间及转换

计算机数字图像处理常用颜色空间及转换

122计算机与多媒体技术Computer And Multimedia Technology电子技术与软件工程Electronic Technology & Software Engineering对图像色调的认识与处置在电脑数字图像处理阶段会时常用到[1]。

比如在CRT 显示器中,扫描仪与打印机运用阶段,均要权衡到不同的色彩空间。

例如打印机运用CMYK 颜色空间,显示器是RGB 色彩空间,在完成由图片到显示器到打印机的打印工作中,要意识到其色彩转换需求,这部分是电脑彩色体系中需要解读的基本常识[2]。

伴随计算机多媒体科技的日新月异,色彩处理科技在数字图像处理阶段中得到了广泛的运用,与灰度图像对比,彩色图像提供了更多的讯息。

1 色彩系统1.1 RGB色彩系统RGB 颜色系统是最为常规的颜色系统,其是由(CIE )国际照明委员会在1931年提出的。

自然界内的全部色彩都能够有红色、绿色、蓝色三大基色进行表示,其相应的波长依次是700nm 、546.1nm 、435.8nm ,并且在CIE-RGB 体系中,配套等能白光的三原色(R )、(G )、(B )亮度比率是1000:49507:0.0601,幅亮度比率也能够进行显示。

以红色为实例,某类色彩含红色比例能够被分成0—255共256个色阶,0级代表不包括红色,255阶代表包含100%的红色元素。

相似地,绿色与蓝色也能够分成256阶。

如此,依照R 、G 、B 的类似组合就能够分成256×256 ×256(大概1600万)中色彩。

1.2 CMY颜色系统RGB 颜色系统是加色合成法(Additive Clolor Synthesis ),但是在印刷领域则通用CMY 颜色系统,也就是Cyan 、Magenta 、Yellow 。

通常所用到的四色印刷CMYK 是要算入黑颜色的。

其通过色彩叠减来形成其余色彩,因此这类模式也被叫做减色合成法。

hsi 使用

hsi 使用

hsi 使用
HSI(Hue-Saturation-Intensity)颜色模型是一种描述人眼感知颜色的方式,它使用色调(Hue)、色饱和度(Saturation)和亮度(Intensity)三个参数来描述颜色。

HSI颜色模型可以用一个圆锥空间模型来描述,其中色调表示颜色,色饱和度表示颜色的深浅程度,亮度表示颜色的明暗程度。

在HSI颜色模型中,色调H通常用角度表示,范围是0°到360°,表示不同的颜色;色饱和度S表示颜色的深浅程度,范围是0%到100%;亮度I表示颜色的明暗程度,范围是0%到100%。

HSI颜色模型在图像处理和计算机视觉领域有很多应用,例如图像分割、目标检测、人脸识别等。

使用HSI颜色模型可以更好地描述图像中的颜色信息,并将其应用于相应的图像处理算法中。

同时,由于HSI颜色模型与人的视觉系统更接近,所以使用HSI颜色模型还可以更好地模拟人的视觉感知,从而在图像处理中取得更好的效果。

在实际使用中,将RGB颜色模型转换为HSI颜色模型需要经过一系列的计算和转换步骤。

常用的转换公式如下:
计算RGB各通道的平均值:R_avg = (R + G + B) / 3
计算色调H:H = arccos((((R_avg - G) / (2 * sqrt((R_avg - G) ^ 2 + (R_avg - B) ^ 2))) + 1 / 3) * 180 / π)
计算色饱和度S:S = 1 - 3 * ((min(R, G, B)) / (R + G + B)) ^ 2
计算亮度I:I = (R + G + B) / 3。

RGB、HSV、HSI颜色空间

RGB、HSV、HSI颜色空间

[原]RGB、HSV、HSI颜色空间RGB颜色空间∙定义RGB颜色空间通常用于显示器系统,例如:电脑、电视机的显示器使用的都是RGB颜色空间。

利用物理学中的三原色叠加原理,可以产生各种颜色。

在RGB 颜色空间中,R、G、B各颜色分量彼此独立。

RGB颜色空间的缺点在于不符合人眼的视觉特性,直接处理多有不便,因此通常需要转换到其他颜色空间进行处理,最后再转换到RGB颜色空间,用于显示器显示。

∙数学模型RGB颜色空间中,R、G、B三个分量彼此独立,所能表示的范围也相同,例如:用8比特来表示每个分量,则所能表示的范围为[0,255]。

在数学上,RGB颜色空间可以用一个正方体来表示,如下图所示:HSV颜色空间∙定义HSV颜色空间中,H是Hue(色度)的缩写,S是Saturation(饱和度)的缩写,V是Value(亮度)的缩写。

色度通常用来从宏观上区分某一种颜色,例如:白、黄、青、绿、品红、红、蓝、黑等就是色度;饱和度指的是颜色的纯度,通常情况下,颜色越鲜艳,饱和度越高,颜色越暗淡,饱和度越低;亮度指的是颜色的明暗程度,亮度越高,颜色越亮,亮度越低,颜色越暗。

HSV颜色空间不适合显示器系统,但是更符合人眼的视觉特性,因此通常会将颜色从RGB空间域转换到HSV颜色空间进行处理,然后在换回RGB域进行显示。

∙数学模型HSV颜色空间可以用一个圆锥来表示,如下图所示:如图所示,某一像素的H可以由该点与白色基准线所形成的圆心角表示,H的取值范围为[0,360];某一点的S可以由该点与所在圆面的圆心之间的距离表示,距离越大,饱和度越高,反之越低;某一点的V可以由该点所在圆面与圆锥顶部之间的距离表示,距离越大,亮度越高,反之则越低。

HSI颜色空间HSI颜色空间中,H和S与HSV颜色空间中的含义相同,I是Intensity(强度)的缩写。

HSI颜色空间与HSV颜色空间很相近,但彼此之家并不相同。

∙数学模型与HSV颜色空间不同的是,HSI颜色空间可以用以双锥体表示,数学模型如下图:如图所示,与HSV颜色空间相比,HSI颜色空间中,H和S仍旧用相同的表示方法,不同的地方在于I的表示不同于V。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

自己编写 HSI 原始 RGB R 0 G 0 B 0 自己编写转为 HSI H 90 0 S 100 0 33.333 150 200 100 90 3 150 90 50 53.521 251.5789 1 213 252 54 84% 121 99 213 200 90 50 78% 150 200 100 I 0 255 MATLAB 自带转为 HSV PS 转为 HSV H 0 0 S 0 0 V 0 H S 0 0 V 0 R 0 转 RGB G 0 B 0
的优势。很容易得到的结论,就是 rgb 颜色对于人眼来说很难直观的分别,随便说一个 rgb 值,在正式使用其上色之前,无法对其进行直观上的理解,之后也很难做出“深一点”“灰 一点”这样方向的调整。但是 hsi 则不一样,h 代表色相,就是颜色具体的色彩倾向,s 代 表饱和度。饱和度越高,色彩越鲜艳,反之就越灰,饱和度为 0 时色彩空间表示的就是就是 灰度。而 i 值代表强度,也称作明度,也就是颜色明亮的程度。i 值越大颜色越亮,i 为 255 时就代表白色,为 0 时就代表黑色。这个空间与 hsv 空间也是存在部分相同点与差异的,之 后会提到二者的相似点与区别。 这里一共有四组数据,一组全为最小值,一组全为最大值,一组是比较整的随机参数,一组 是零散的随机参数。我们来配合运算的结果以及 MATLAB 中的程序来说明,这些数据呈这样 的原因。
个数中的最小值。 首先我们来纵向比较一下,四组不同的 rgb 值对应的 hsi 值的差别。很明显 hsi 色彩空间中 同一个颜色是可以由多个数值组合来表示的。 比如第一组值, 只要 i 为 0, hs 无论取什么值, 都是表示黑色,同理只要 i 取 255 就一定是表示白色。因此这里根据算法不同多种答案都是 正确的。 随后我们来横向比较一下。这里先来付上 MATLAB 自带的 rgb 转 hsv 的程序:
%my cmyk2rgb RR=255-c-k; GG=255-m-k; BB=255-y-k; disp("my cmyk2rgb"); disp(RR); disp(GG); disp(BB);
和之前 rgb 求 cmyk 的程序刚好做了相反的逆运算,在这 cmyk 的算法这个程序就只能算出估计值。由于各个程序采用的 生成 cmyk 算法是不一样的,因此完成这一步转换的算法也是不一样的,需要具体问题具体 分析。但是在目前的情况下这种算法无疑是最佳的。
255 255 255
255 0 0 100% 255 255 255
250.479 31.408 144.333 121 99 213 9 8 3
自己编写转为 CMYK C 0 0 0 0 M 0 0 Y 100 0 K C
MATLAB 自带转为 CMYK M Y K
PS 转为 CMYK C M Y K
这里生成了一个 cform 类,和之前的 tform 类似,这个函数是用来进行色彩空间转换的。
srgb2cmyk 这个参数代表转换类型是 rgb 到 cmyk,随后函数会返回一个[x][y][4]的矩
阵, 存储得到的 cmyk 颜色信息。 但是通过横向比较, 发现 MATLAB 自己生成的 cmyk 颜色, Photoshop 生成的 cmyk 颜色,虽说指代的是同一个 rgb 值,但是自身的值都是有所差别 的。产生这个现象的原因要通过多个角度去分析。第一个就是前面说过的,本身这个 cmyk 颜色的用途是在打印上,因此不同的打印环境就需要不同的调整,相对的 cmyk 值也会存在 差异。因此不同的软件,由于适用方向的不同,也会通过不同的算法求出合适的 cmyk 值。 其次,在打印的过程中,除了使用 cmyk 之外,还经常使用一种“专色”来进行补偿。如亮 橙色,特别的金属粉末等。为了适应这些东西的加入,cmyk 值也需要进行相应的调整。因 此不同的软件求得的 cmyk 结果不同。 最后来看一下我自己写的 cmyk 转 rgb 的程序:
%matlab's rgb2cmyk A(1,1,1)=R/255; A(1,1,2)=G/255; A(1,1,3)=B/255; cform = makecform('srgb2cmyk'); CMYK = applycform(A,cform); disp("matlab's rgb2cmyk") disp(CMYK(:,:,1)*100); disp(CMYK(:,:,2)*100); disp(CMYK(:,:,3)*100); disp(CMYK(:,:,4)*100);
70.8324 65.3819 66.627 93.4951 93 88 89 80 0.0031 0.3418 0.2609 0.0015 0 0 0 0
19.6078 0
39.2157 21.5686 42.2263 0.5447 73.7499 2.8244 49 6
73 0 0
36.0784 44.7059 0
Rgb 转 cmyk 的公式是很简单的,程序中表现的已经很清楚了,因此就不再进行更多讲解。 但是这个算法本身存在一些漏洞,可以看到在 rgb 都得 0 的时候,这个算法算出来的结果是 0,0,0,100,也就是说黑色对应的是全部用黑色墨水填充。在 rgb 都得 255 时对应白色,cmyk 值都为 0,代表不进行打印色彩输出,也就是保留纸张的白色的效果。其他 rgb 的时候程序 也换算为了对应的 cmyk 值来体现这个颜色。之后这个程序是 MATLAB 自带的 rgb 转 cmyk 的函数:
%my rgb2cmyk c=255-R; m=255-G; y=255-B; k=min(min(c,m),y); c=(c-k); m=(m-k); y=(y-k); C=c/255.0*100; M=m/255.0*100; Y=y/255.0*100; K=k/255.0*100; disp("my rgb2cmyk"); disp(C); disp(M); disp(Y); disp(K);
%my rgb2hsi R=xxx; G=xxx; B=xxx; r=R/(R+B+G+eps); g=G/(R+B+G+eps); b=B/(R+B+G+eps); num = 0.5*((r - g) + (r - b)); den = sqrt((r - g).^2 + (r - b).*(g - b)); theta = acos(num./(den + eps)); if(b<=g) h=theta; else h=2*pi-theta; end H=h*180/pi; num = min(min(r, g), b); s = 1 - 3.* num; S=s*100; if(S==0) H=0;
end I = (R + G + B)/3; disp("my rgb2hsi"); disp(H); disp(S); disp(I);
这是我自己编写的 rgb 转 hsi 的函数。经过网络上的查询,rgb 转 hsi 的算法非常多,但是常 见的有 5 种,具体如下图所示:
每种算法算出来的结果有微小的差异,但是基本上都可以较为准确的表现原本的 rbg 颜色。 因此程序中就采用了第一种算法,但是也进行了微小的改动。首先来解释一下经常出现的 eps 这个值。这个值是 MATLAB 自带的最小计数单位,也就是说 MATLAB 自身在数学层面上 无法对一个数字进行小于 eps 的改变。比如说 1+eps/3 和 1 显然不相等,但是在 MATLAB 中 1=1+eps/3,因为 eps/3MATLAB 无法计数,就当做 0 处理。在程序中可以看出,所有的 eps 都出现在了分母上, 也就是避免了分母为 0 最后没有得数的情况。 剩余的部分就是实现算法 1 中公式的过程,很显然 num 是分子,den 是分母,最后 hsi 都得到了想要的结果。此外还 要说明一下 min 这个函数只能传递两个参数,因此不能采用 min(a,b,c)的方式来求 3
这里不难看出,hsi 转 rgb 的函数是分段的,其具体公式如下:
由于本身 hsi 色彩空间,h 有 360°的变化区间,这个区间中可以分为均等的三份,每一份 中的色相都有一定的偏向性。而在向 rgb 色彩空间转换的过程中,我们得到一组 xyz 后,其 对应的值就是这个色相区间中的一个主要颜色的分量以及两个辅助颜色的分量值。 因此这种 分段算法可以准确的还原 rgb 值,在上面的表格中也可以看出还原的结果都是非常准确的。 随后来看 rgb 和 cmyk 色彩空间互相转换的部分。 Cmyk 色彩空间不同于熟知的色光叠加来表 示颜色的表示方法,其多用于打印过程中,一般来说 cmy 代表颜料的红蓝黄三原色,而 k 代表 black-黑色。原本 cmy 颜料的三原色通过不同比例的混合可以合成所有的颜色,但是由 于颜料本身不纯,黑色不能单纯靠三原色混合得到。因此这里需要用 black 也就是黑色墨水 来进行补偿,来确保达到纯正的颜色。我自己编写的转换程序如下:
%matlab's rgb2hsv A(1,1,1)=R; A(1,1,2)=G; A(1,1,3)=B; X=rgb2hsv(A); disp("matlab's rgb2hsv"); disp(X(1,1,1)*360); disp(X(1,1,2)*100); disp(X(1,1,3));
很简单,但是这与作业中的要求有些许不一致。因为本身 MATLAB 并不自带 rgb 转 hsi 色彩 空间的函数,但是 hsv 色彩空间中的值有一部分对 hsi 有参考价值。首先二者 h 的取值,在 我自己编写的程序, MATLAB 自带的程序以及 ps 中转化的结果都是很相似的, 也就是说这两 种色彩空间在色调上的表现方法是基本一致的。但是 s 的值由于本身计算公式就不一致,在 hsv 色彩空间中 s 的值为(max-min)/max,因此二者存在较大的差异。同理对于 i 和 v,他 们的命名就存在区别,因此数值上自然也有区别。v 的取值是 rgb 值中最大的一个,而 i 则 是其平均值,因此可以发现 MATLAB 自带的转换函数与 ps 中转换的值是一致的,但是与我 自己编写的转换值是不一致的。 随后我们来看把 hsi 色彩转为 rgb 值的程序:
相关文档
最新文档