当前位置:首页 » 网上购物 » 怎样利用矩阵转换颜色空间

怎样利用矩阵转换颜色空间

发布时间: 2022-10-03 23:30:17

⑴ matlab 中如何把矩阵对应成一个有颜色的网格

p=

[0.29200.56250.20090.47400.95610.37560.76940.4906;

0.85800.61660.27310.90900.59550.16620.44420.4093;

0.33580.11330.62620.59620.028700.62060.4635;

0.680200.53690.32900.81210.83860.95170.6109;

0.05340.75460.05950.47820.61010.45160.64000.0712;

0.35670.791100.59720.70150.95660.24730.3143;

0.49830.81500.27130.16140.09220.14720.35270.6084;

0.43440.67000.40910.82950.42490.869900.1750;]

gridcolor(p)

运行结果:

自定义函数gridcolor

functiongridcolor(p)

[mn]=size(p);

p=round(1+127*p/max(p(1:end)));

p=flipud(p);

x=0:m-1;

y=0:n-1;

[X,Y]=meshgrid(x,y);

hmap=[ones(127,1)linspace(0.5,0,127)'zeros(127,1)];

hmap=[[111];hmap];

fori=1:m

forj=1:n

subfun(i,j,X(i,j),Y(i,j),hmap(p(i,j),:));

end

end

functionsubfun(m,n,x0,y0,c)

x=[x0x0;x0x0+1;x0+1x0+1];

y=[y0-1y0-1;y0y0-1;y0y0];

z=[11;11;11];

tcolor(1,1,1:3)=c;

tcolor(1,2,1:3)=c;

h=patch(x,y,z,tcolor);

set(h,'EdgeColor','none');

⑵ RGB与XYZ颜色空间的转换

常用的几个色域信息表:

        关于RGB颜色空间与XYZ颜色空间的转换,需要事先剥离RGB灰度编码值的概念。RGB灰度编码值是一个非线性的灰阶数据。而针对RGB与XYZ空间来说,此处所指的都是RGB、XYZ颜色空间的三刺激值,是一个与自然界亮度呈线性的数据。且RGB空间与XYZ空间的转换是基于线性的三刺激值数据进行的。

        进行RGB与XYZ空间的转换,需要知道,RGB空间的三基色在XYZ空间中的色坐标,以及白点分别在RGB、XYZ的三刺激值

        RGB三基色在RGB颜色空间中的配色单元分别为 , , ;色坐标分别为 , , 。

        RGB三基色在XYZ颜色空间中的色坐标分别为 , , ,其在XYZ颜色空间中的三刺激值分别为

        XYZ三基色在XYZ颜色空间中的配色单元分别为 , , 。色坐标分别为 , , 。

        任意一个颜色P在RGB颜色空间的三刺激值为 ,在XYZ颜色空间中的三刺激值为 。则有:

        则有:

        上图矩阵,即为RGB颜色空间三刺激值与XYZ颜色空间三刺激值之间的转换矩阵。其中RGB三基色在XYZ颜色空间的三刺激值已知。只需要得到 , , 的比例关系即可得到转换矩阵。

        已知,白点W在RGB颜色空间中的三刺激值分别为 ,在XYZ颜色空间的色坐标分别为 ,三刺激值分别为

        设 ,带入上式,则有

        由此可得 , , 的比例关系,则可得RGB与XYZ的转换矩阵。

        BT2020、BT709、DCI-P3与XYZ的转换矩阵分别如下:

⑶ matlab,如何将三幅灰度图像合并为一张彩图

1) HSV值与RGB颜色空间的相互转换hsv2rgb( ) rgb2hsv( )
RGBMAP=hsv2rgb(HSVMAP) 其功能是:将一个HSV颜色图转换为RGB颜色图。输入矩阵输入矩阵输入矩阵输入矩阵HSVMAP中的三列分别表示:色度、饱和度和纯度值;输出矩阵输出矩阵输出矩阵输出矩阵RGBMAP各列分别表示红、绿、蓝的亮度。矩阵元素在区间 [0,1]。

⑷ MATLAB彩色空间转换

可以用rgb2hsv函数来转换例如:
t=imread('a.bmp');
hv=rgb2hsv(a);
imshow(hv);
可以通过下面的程序看一幅图的HSV三个通道
RGB=reshape(ones(64,1)*reshape(jet(64),1.192)[64,64,3]);%调整颜色条的尺寸,将细长变长方形
HVS=rgh2hsv(RGB);%将RGB转换为HSV,这条自己改成你所使用的图
H=HSV(:,:,1);%提取64×64×3维矩阵中的64×64×1矩阵
S=HSV(:,:,2););%提取64×64×3维矩阵中的64×64×2矩阵

V=HSV(:,:,3););%提取64×64×3维矩阵中的64×64×3矩阵

subplot(2,2,1);imshow(H)%显示为2×2图中的图1
subplot(2,2,2);imshow(S)
subplot(2,2,3);imshow(V)
subplot(2,2,4);imshow(RGB)

⑸ matlab如何将二维数组转换为彩色图像(32位无符号整型的二维数组)

这种情况下,你需要有一个colormap,即颜色表,所得到的彩色图像是伪彩色图像。

比如(请使用附件中的sample.mat):

clc;clear;closeall;

loadsample; %其中X是uint32矩阵,map是一个颜色表

figure,imshow(X),title('直接显示');
figure,imshow(X,[]),title('归一化显示为灰度图');
figure,imshow(X,map),title('使用map显示为伪彩色图');
figure,imshow(X,colormap('summer')),title('使用MATLAB内置的颜色表'); %colormap使用请查看帮助

⑹ 如何用matlab将矩阵中的数字变颜色

matlab读取之后是一个RGB三原色组成的三维矩阵,现在需要将图中黑、绿、黄、红(图上有两种红色需要视作一种)四种颜色的像素点分别以0,0.01,1和2来表示,希望得到像素点的二维矩阵,维数等于分辨率,求具体实现的代码

望采纳

⑺ 颜色的空间变换是指

看到好文章,想保存怎么办!下载APP
颜色空间转换(一)

最初九月雪
2014-12-10分享收藏
颜色空间转换

不同彩色空间之间的转换。

1,CMY/CMYK颜色空间

青、品红、黄(CMY)(Cyan、Magenta、Yellow)彩色模型是彩色图象印刷行业使用的彩色空间,在彩色立方体中它们是红、绿、蓝的补色,称为减色基,而红、绿、蓝称为加色基。在CMY模型中,颜色是从白光中减去一定成分得到的。CMY坐标可以从RGB模型中得到:

C = 1 – R

M = 1 – G

Y = 1 – B

由于在印刷时CMY模型不可能产生真正的黑色,因此在印刷业中实际上使用的是CMYK彩色模型,K为第四种颜色,表示黑色(black ink):从CMY 到CMYK的转换:

K := min(C,M,Y)

C := C – K

M := M – K

Y := Y - K

[cpp] view plain
//RGB转换为CMY
void rtRGB2CMY(RtScalar rgb, RtScalar& cmy)
{
cmy.val[0] = 255 - rgb.val[0];
cmy.val[1] = 255 - rgb.val[1];
cmy.val[2] = 255 - rgb.val[2];
}

//CMY转换为RGB
void rtCMY2RGB(RtScalar cmy, RtScalar& rgb)
{
rgb.val[0] = 255 - cmy.val[0];
rgb.val[1] = 255 - cmy.val[1];
rgb.val[2] = 255 - cmy.val[2];
}

//CMY转换为CMYK
void rtCMY2CMYK(RtScalar cmy, RtScalar& cmyk)
{
unsigned char temp = 0;

temp = min(min(cmy.val[0], cmy.val[1]), cmy.val[2]);

if (temp == 255 )
{
cmyk = rtScalar(0, 0, 0, 0);
}
else
{
cmyk.val[0] = cmy.val[0] - temp;
cmyk.val[1] = cmy.val[1] - temp;
cmyk.val[2] = cmy.val[2] - temp;
}
cmyk.val[3] = temp;
}

//CMYK转换为CMY
void rtCMYK2CMY(RtScalar cmyk, RtScalar& cmy)
{
cmy.val[0] = cmyk.val[0] + cmyk.val[3];
cmy.val[1] = cmyk.val[1] + cmyk.val[3];
cmy.val[2] = cmyk.val[2] + cmyk.val[3];
}

2,HSI颜色空间

HSI色彩空间是从人的视觉系统出发,用色调(Hue)、色饱和度(Saturation或Chroma)和亮度 (Intensity或Brightness)来描述色彩。HSI色彩空间可以用一个圆锥空间模型来描述。用这种 描述HIS色彩空间的圆锥模型相当复杂,但确能把色调、亮度和色饱和度的变化情形表现得很清楚。 通常把色调和饱和度通称为色度,用来表示颜色的类别与深浅程度。由于人的视觉对亮度的敏感 程度远强于对颜色浓淡的敏感程度,为了便于色彩处理和识别,人的视觉系统经常采用HSI色彩空间, 它比RGB色彩空间更符合人的视觉特性。在图像处理和计算机视觉中大量算法都可在HSI色彩空间中 方便地使用,它们可以分开处理而且是相互独立的。因此,在HSI色彩空间可以大大简化图像分析 和处理的工作量。HSI色彩空间和RGB色彩空间只是同一物理量的不同表示法,因而它们之间存在着 转换关系。

HSI 色彩模型是从人的视觉系统出发,用 H 代表色相 (Hue)、S 代表饱和度 (Saturation) 和 I 代表亮度 (Intensity) 来描述色彩。饱和度与颜色的白光光量刚好成反比,它可以说是一个颜色鲜明与否的指标。因此如果我们在显示器上使用 HIS 模型来处理图像,将能得到较为逼真的效果。
色相 (Hue):指物体传导或反射的波长。更常见的是以颜色如红色,橘色或绿色来辨识,取 0 到 360 度的数值来衡量。
饱和度 (Saturation):又称色度,是指色彩的强度或纯度。饱和度代表灰色与色调的比例,并以 0% (灰色) 到 100% (完全饱和) 来衡量。
亮度 (Intensity):是指颜色的相对明暗度,通常以 0% (黑色) 到 100% (白色) 的百分比来衡量。





[cpp] view plain
//RGB转换为HSI
void rtRGB2HSI(RtScalar rgb, RtScalar& hsi)
{
double maxv = 0, minv = 0, angle = 0;
RtScalar temp;

temp.val[0] = rgb.val[0] / 255.0;
temp.val[1] = rgb.val[1] / 255.0;
temp.val[2] = rgb.val[2] / 255.0;

maxv = max(max(temp.val[0], temp.val[1]), temp.val[2]);
minv = min(min(temp.val[0], temp.val[1]), temp.val[2]);

hsi.val[2] = (temp.val[0] + temp.val[1] + temp.val[2]) / 3.0;
hsi.val[1] = 1.0 - minv/hsi.val[2];

angle = (temp.val[0] + temp.val[0] - temp.val[1] - temp.val[2]) / 2.0 * sqrt((temp.val[0] - temp.val[1])*(temp.val[0] - temp.val[1]) + (temp.val[0] - temp.val[2])*(temp.val[1] - temp.val[2]));

if (temp.val[2] <= temp.val[1])
hsi.val[0] = angle / PI * 180.0;
else
hsi.val[0] = (2 * PI - angle)/PI * 180.0;
}

//HSI转换为RGB
void rtHSI2RGB(RtScalar hsi, RtScalar& rgb)
{
int flag = 0;
double t1 = 0, t2 = 0, tv1 = 0, tv2 = 0, tv3 = 0;
RtScalar temp;
temp = hsi;
temp.val[0] = hsi.val[0] * PI / 180.0;

t1 = 2.0 * PI / 3.0;
t2 = 2.0 * t1;

if (temp.val[0] >= t1 && temp.val[0] < t2)
{
flag = 1;
temp.val[0] -= t1;
}
if (temp.val[0] >= t2)
{
flag = 2;
temp.val[0] -= t2;
}

tv1 = (temp.val[2] * (1 - temp.val[1])) * 255.0;
tv2 = (temp.val[2] * (1 + temp.val[1] * cos(temp.val[0]) / cos(PI / 3 - temp.val[0]))) * 255.0;
tv3 = (3.0 * temp.val[2] - tv1 - tv2) * 255.0;

switch (flag)
{
case 0:
rgb = rtScalar(tv2, tv3, tv1, 0);
break;
case 1:
rgb = rtScalar(tv1, tv2, tv3, 0);
break;
case 2:
rgb = rtScalar(tv3, tv1, tv2, 0);
break;
}
}

3,YUV颜色空间
在现代彩色电视系统中,通常采用三管彩色摄像机或彩色CCD(点耦合器件)摄像机,它把摄得的彩色图像 信号,经分色、分别放大校正得到RGB,再经过矩阵变换电路得到亮度信号Y和两个色差信号R-Y、B-Y, 最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去。这就是我们常用的YUV色彩空间。 采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量, 那么这样表示的图就是黑白灰度图。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机 的兼容问题,使黑白电视机也能接收彩色信号。根据美国国家电视制式委员会,NTSC制式的标准,当白光的 亮度用Y来表示时,它和红、绿、蓝三色光的关系可用如下式的方程描述:Y=0.3R+0.59G+0.11B 这就是常用 的亮度公式。色差U、V是由B-Y、R-Y按不同比例压缩而成的。如果要由YUV空间转化成RGB空间,只要进行 相反的逆运算即可。与YUV色彩空间类似的还有Lab色彩空间,它也是用亮度和色差来描述色彩分量,其中L为 亮度、a和b分别为各色差分量。

YUV与RGB相互转换的公式如下(RGB取值范围均为0-255):

Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B

R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U

[cpp] view plain
// RGB转换为YUV
void rtRGB2YUV(RtScalar rgb, RtScalar& yuv)
{
yuv.val[0] = 0.299*rgb.val[0] + 0.587*rgb.val[1] + 0.114*rgb.val[2]; // y
yuv.val[1] = -0.147*rgb.val[0] - 0.289*rgb.val[1]+ 0.436*rgb.val[2]; // u
yuv.val[2] = 0.615*rgb.val[0] - 0.515*rgb.val[1] - 0.1*rgb.val[2]; // v
}

// YUV转换为RGB
void rtYUV2RGB(RtScalar yuv, RtScalar& rgb)
{
rgb.val[0] = yuv.val[0] + 1.14*yuv.val[2]; // r
rgb.val[1] = yuv.val[0] - 0.39*yuv.val[1] - 0.58*yuv.val[2];
rgb.val[2] = yuv.val[0] + 2.03*yuv.val[1];
}

⑻ 求助:将一个给定矩阵按照自己定义的颜色条显示图像

没人交流啊,自己顶一个吧。查到colormapeditor函数,可以自己定义颜色条,先设置颜色条的阶数,可通过类似于colormap(hot(64))这样的命令设置成64阶的,再设置颜色条的最小值、最大值,每个值对应的颜色,颜色条两个颜色节点之间的值和颜色都默认是线性插值的。对于一些特殊的值,可以微调到特定的颜色。这样,自己定义好一个颜色条之后,保存。下次画任何图都可以加载这个颜色条。理论上,问题圆满解决。可是,实际是,下次再加载次颜色条到任何图像中时,颜色条的取值范围会随着图像像素值的整体取值范围改变,但是颜色范围却不会改变,这就使得颜色映射完全不对了。这是为什么呢正在痛苦的解决之中 查看原帖>>