十二、数字图像处理之彩色图像处理

说明:在彩色空间中,彩色图像用RGB图像索引图像进行处理。

(一)在MATLAB中彩色图像的表示

(1)RGB图像

一幅RGB图像就是M×N×3大小的彩色像素的数组,每个彩色像素点都是在特定空间位置的成彩色图像所对应的红绿蓝分量。也可以将它们看做由三个灰度图像形成的“堆栈”,当发送到彩色监视器的红绿蓝输入端时,就在屏幕上产生彩色图像。其分量的数据类决定它们的取值范围,如:数据类是double,其取值范围就是[0,1];数据类是uint8或uint16,其取值范围分别是[0,255]或[0,65535]。用这些分量图像像素值得比特数决定一幅RGB图像的比特深度。

RGB图像由cat操作将红绿蓝分量组合起来,语法如下:

rgb_image = cat(3,fR,fG,fB)     %将三种分量组合

通常,cat(dim,A1,A2…)沿着由dim指定的方式连接数组。如:dim=1,数组就垂直排列;dim=2,数组就水平排列;dim=3,数组就按照三维方式堆叠。

上面是组合起来,用下面的语法提取出三个分量图像:

fR = rgb_image(:,:,1);   %提取红色
fG= rgb_image(:,:,2);    %提取绿色
fB = rgb_image(:,:,3);   %提取蓝色

实验代码如下:

rgb_image = imread('C:\Users\Public\Pictures\Sample Pictures\school.jpeg');
imshow(rgb_image),title('原图像')
fR = rgb_image(:,:,1);   %提取红色
fG= rgb_image(:,:,2);    %提取绿色
fB = rgb_image(:,:,3);   %提取蓝色
subplot(221),imshow(fR),title('r');
subplot(222),imshow(fG),title('g');
subplot(223),imshow(fB),title('b');
>> rgb_image1 = cat(3,fR,fG,fB);  %将提取的红绿蓝进行组合得到的图像
>> subplot(224),imshow(rgb_image1)

在这里插入图片描述
在这里插入图片描述
常常用RGB彩色立方体显示光的原色和二次色,如图:
在这里插入图片描述
彩色立方体

为了从任何透视方向观测这个彩色立方体,可以创建下面的自定义函数rgbcube

function rgbcube(vx,vy,vz)
vertices_matrix = [0 0 0;0 0 1;0 1 0;0 1 1 ;1 0 0;1 0 1;1 1 0;1 1 1];
faces_matrix = [1 5 6 2;1 3 7 5;1 2 4 3;2 4 8 6;3 7 8 4;5 6 8 7];
colors =vertices_matrix;

patch('Vertices',vertices_matrix,'Faces',faces_matrix,'FaceVertexCData',colors,'FacesColor','interp','EdgeAlpha',0)

if nargin == 0
    vx = 10;vy = 10;vz = 4;
elseif nargin ~=3
    error('Wrong number of inputs.')
end
axis off
view([vx,vy,vz])
axis square

根据提示输入rgbcube(vx,vy,vz),便会在MATLAB桌面上生成从点(vx,vy,vz)处观察到的RGB立方体,结果由函数print存储在磁盘上。

实验代码如下:

rgb_image = imread('C:\Users\Public\Pictures\Sample Pictures\dingdangmao.jpg');
subplot(221),imshow(rgb_image),title('rgb图像');
fR = rgb_image(:,:,1);   %提取红色
fG= rgb_image(:,:,2);    %提取绿色
fB = rgb_image(:,:,3);   %提取蓝色
subplot(222),imshow(fR),title('r');
subplot(223),imshow(fG),title('g');
subplot(224),imshow(fB),title('b');

实验结果:
在这里插入图片描述
结论:
将一幅rgb图像提取其红绿蓝三种分量时,会发现原图像中白色和黑色的部分基本不会发生变化,提取后和提取前都是存在黑色和白色的。在提取红色的图像中发现,原图像中红色很明显的部分提取后变成白色,叮当猫的脸(蓝色部分)在提取之后的图像显示中,也有些变成了白色,那为什么没有整个范围都变成了呢?应该是原图中的蓝色并不是饱和的蓝色,而是掺杂着白色的“淡蓝色”,因此将蓝色提取的时候并没有完全提取。对比学校风景图来说,卡通图像更加容易提取,而风景图颜色分界不明显,因此提取红绿蓝三种的时候,其提取的效果并没有卡通图像的明显、直观。

(2)索引图像

索引图像有整数数据矩阵X和彩色映射矩阵map。矩阵map由m×3大小、double类型及范围在[0,1]之间的浮点数构成的数组。map的长度m是定义的颜色数。map的每一行都定义有单色的红、绿、蓝分量。索引图像将像素的亮度值“直接映射”到彩色值。每个像素的颜色由对应的整数矩阵X的值作为指向map的索引决定。如X是double类型,则值1指向map的第一行,值2指向第二行;X是uint8或uint16类型,则值0指向map的第一行。

显示一幅索引图像,可用以下语法实现:

imshow(X,map);
或者
image(X)
colormap(map)

用较少的颜色去近似表达索引,使用函数imapprox

[Y,newmap] = imapprox(X,map,n)

这个函数用newmap返回数组Y,有n种颜色,X可以选择uint8、uint16、double。如果n≤256,则输出Y是uint8;若n>256,则Y是double。当map中的行数比X中的整数值数目少时,X中的多重值将在map中赋以相同的颜色。

指定彩色映射的语法如下:

map(k,:) = [r(k) g(k) b(k)];

将图像背景改变颜色(如绿色),以下三种都可以使用:

whitebg('g');
whitebg('green');
whitebg([0 1 0]);

MATLAB还提供了一些预定义的彩色映射,语法如下:

colormap(map_name)   %预定义的彩色映射
函数描述
autumn从红色到橙色、再到黄色平缓变换
bone对蓝色分量用较高的值进行灰度级的彩色映射
colorcube在RGB彩色空间中包含许多有规律放置的颜色,试图提供更多的灰度级、纯红、纯绿、纯蓝
cool由从青到深红色调平滑变化的颜色分量组成
copper由黑到浅铜色平缓变化
flag由红、白、黑和蓝颜色分量组成。这个彩色映射随着每个索引增量完全改变颜色
gray返回线性灰度级的彩色映射
hot由黑通过红、橙、黄,再到白色平缓变化
hsv色调-饱和度-亮度彩色模型的色调分量变化。彩色由红,通过黄、绿、青、蓝、深红,再到红。这个彩色映射对于显示周期函数特别合适
jet范围由蓝到红,且经过青、黄、橙
lines产生的彩色映射由ColorOrder属性和灰度色调决定
pink包含粉红的大青色调。粉红彩色映射提供灰度照片的棕色色调
prism重复6种颜色:红、橙、黄、绿、蓝、紫
spring由深红和黄色色调组成
summer由绿色和黄色色调组成
winter由蓝色和绿色色调组成
white全是白色映射

(3)处理RGB图像和索引图像的函数

通常,我们使用rgb_image表示RGB图像,用gray_image表示灰度图像,bw表示二值图像。函数dither表示用“抖动”方法从RGB图像创建索引图像,grayslice表示从灰度图像通过阈值处理创建索引图像,gray2ind表示从灰度图像创建索引图像,rgb2ind表示从RGB图像创建索引图像,等等。

语法如下:

bw = dithch(gray_image);    %用抖动处理灰度图像变成二值图像
X = grayslice(gray_image,v);  %用阈值处理对灰度图像以产生索引图像
[X,map] = gray2ind(gray_image,n);   %灰度图像变成索引图像
gray_image = ind2gray(X,map);   %索引图像变成灰度图像
[X,map] = rgb2ind(rgb_image,n,dithch_option);    RGB图像变成索引图像
rgb_image = ind2rgb(X,map);    %索引图像变成RGB图像
gray_image = rgb2gray(rgb_image)    %RGB图像变成灰度图像

实验代码如下:

[X1,map1] = rgb2ind(f,8,'nodither');    %rgb图像变成索引图像,不执行抖动
subplot(221),imshow(X1,map1),title('没有进行抖动且将彩色数目减少到8');
[X2,map2] = rgb2ind(f,8,'dither');    %rgb图像变换索引图像
subplot(222),imshow(X2,map2),title('进行抖动且将彩色数目减少到8');
g = rgb2gray(f);     %RGB图像变成灰度图像
g1 = dither(g);      %用抖动处理灰度图像
subplot(223),imshow(g),title('变成灰度图像');
subplot(224),imshow(g1),title('经抖动后的灰度图像')

实验结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述结论:
从上面三幅图看出,卡通图像降低彩色数目之后索引的图,小鸡的面部细节丢失,由于小鸡是卡通绘制的图像,因此抖动并降低彩色数目的效果并不是很明显。对比后面两幅花朵的图像来说,将彩色数目降低至8之后的索引图,大多数细节都已经丢失了,只留下大部分的轮廓。从实验中还发现,灰度级接近的图像抖动后的效果基本无法识别图像内容,但如最后一幅图灰度级跨度比较大,因此白色和黑色部分还可以看的清楚大概内容。索引图只存在指定的彩色数目,并没有rgb图像颜色那么丰富。

(二)彩色空间之间的转换

为什么要引进其他的彩色空间模型呢?
是由于RGB彩色模型不能适用于现实中所有的情况,各种彩色模型是对特定的情况来使用的。相比原始的RGB图像,HSI图像对颜色信息的利用率更高,更适合于图像分析图像分割等场景。

(1)NTSC彩色空间

NTSC彩色空间用于模拟电视,它的优势是灰度信息彩色数据是分离开的,所以同一信号可以用于彩色电视机和黑白电视机。在NTSC格式中,图像数据由三部分组成:亮度(Y)、色调(I)和饱和度(Q)。亮度描述灰度信息,其他两个分量携带电视信号的彩色信息。

yiq和rgb之间的相互转换为:

yiq_image = rgb2ntsc(rgb_image);     %rgb转换为yiq
rgb_image = ntsc2rgb(yiq_image);    %yiq转换为rgb
subplot(121),imshow(yiq_image);
subplot(122),imshow(rgb_image);

其中,第一公式:输入RGB图像可以是uint8、uint16、double,输出为double。分量图像yiq_image(:,:,1)是亮度、yiq_image(:,:,2)是色调、yiq_image(:,:,3)是饱和度。
第二公式:输入和输出粗都是double类型。
在这里插入图片描述
在这里插入图片描述

(2)YCbCr彩色空间

YCbCr彩色空间主要用于数字视频,在这种格式中,Y代表亮度信息,Cb代表蓝色分量和参考值的差,Cr代表红色分量和参考值的差。

rgb和YCbCr转换公式为:

ycbcr_image = rgb2ycbcr(rgb_image);     %rgb转换为ycbcr
rgb_image = ycbcr2rgb(ycbcr_image);     %ycbcr转换为rgb
subplot(121),imshow(ycbcr_image);
subplot(122),imshow(rgb_image);

其中,以上公式的输入和输出图像是同类型的。
在这里插入图片描述
在这里插入图片描述

(3)HSV彩色空间

主要是人们用来从颜色轮或调色板中挑选颜色时使用的彩色系统之一。HSV六面椎体如图所示:
在这里插入图片描述V=0,轴的末端为黑色;V=1,轴的末端为白色。

rgb和HSV转换公式为:

hsv_image = rgb2hsv(rgb_image);      %rgb转换为hsv
rgb_image = hsv2rgb(hsv_image);      %hsv转换为rgb
subplot(121),imshow(hsv_image);
subplot(122),imshow(rgb_image);

其中,第一公式:输入RGB图像可以是uint8、uint16、double,输出为double。
第二公式:输入和输出粗都是double类型。
在这里插入图片描述
在这里插入图片描述

(4)CMY和CMYK彩色空间

CMY彩色空间指的是青色、紫红色、黄色,这三种也称为光的二次色或是颜料的原色。K指的是纯黑色。常用于彩色打印机复印机

rgb和CMY转换公式为:

cmy_image = imcomplement(rgb_image);
rgb_image = imcomplement(cmy_image);
subplot(121),imshow(cmy_image);
subplot(122),imshow(rgb_image);

在这里插入图片描述
在这里插入图片描述

(5)HSI彩色空间

HSI彩色空间是指人们在观察和描述彩色物体时,常用色调、饱和度和亮度进行描述。色调是描述纯色的颜色属性,饱和度则是纯色被白光冲淡程度的度量,而亮度是一种主观感觉,无法度量。

1、 将颜色从RGB转换为HSI
给出一幅RGB彩色格式的图像,每个RGB像素的H分量可由下面的式子得到,
在这里插入图片描述
其中,在这里插入图片描述
饱和度由下面的式子给出:
在这里插入图片描述
亮度由下面式子给出:
在这里插入图片描述
rgb转换为hsi的函数为:

function hsi = rgb2hsi(rgb)
rgb = im2double(rgb);
r = rgb(:, :, 1);
g = rgb(:, :, 2);
b = rgb(:, :, 3);

num = 0.5*((r - g) + (r - b));
den = sqrt((r - g).^2 + (r - b).*(g - b));
theta = acos(num./(den + eps));

H = theta;
H(b > g) = 2*pi - H(b > g);
H = H/(2*pi);

num = min(min(r, g), b);
den = r + g + b;
den(den == 0) = eps;
S = 1 - 3.* num./den;

H(S == 0) = 0;

I = (r + g + b)/3;

hsi = cat(3, H, S, I);

2、将颜色从HSI转换为RGB

我们用360°乘以H,将色调的值还原成原来的范围——[0°,360°]。
RG区域(0°≤H<120°):
在这里插入图片描述
GB区域(120°≤H<240°):
在这里插入图片描述
BR区域(240°≤H≤360°):
在这里插入图片描述
在这里插入图片描述
hsi转换为rgb的函数为:

function rgb = hsi2rgb(hsi)
H = hsi(:, :, 1) * 2 * pi;
S = hsi(:, :, 2);
I = hsi(:, :, 3);

R = zeros(size(hsi, 1), size(hsi, 2));
G = zeros(size(hsi, 1), size(hsi, 2));
B = zeros(size(hsi, 1), size(hsi, 2));

idx = find( (0 <= H) & (H < 2*pi/3));
B(idx) = I(idx) .* (1 - S(idx));
R(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx)) ./ ...
                                          cos(pi/3 - H(idx)));
G(idx) = 3*I(idx) - (R(idx) + B(idx));

idx = find( (2*pi/3 <= H) & (H < 4*pi/3) );
R(idx) = I(idx) .* (1 - S(idx));
G(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx) - 2*pi/3) ./ ...
                    cos(pi - H(idx)));
B(idx) = 3*I(idx) - (R(idx) + G(idx));

idx = find( (4*pi/3 <= H) & (H <= 2*pi));
G(idx) = I(idx) .* (1 - S(idx));
B(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx) - 4*pi/3) ./ ...
                                           cos(5*pi/3 - H(idx)));
R(idx) = 3*I(idx) - (G(idx) + B(idx));

rgb = cat(3, R, G, B);
rgb = max(min(rgb, 1), 0);

实验代码如下:

rgb_image = imread('C:\Users\Public\Pictures\Sample Pictures\school.jpeg');
>>  hsi = rgb2hsi(rgb_image);
>> subplot(121),imshow(hsi),title('rgb变成hsi')
>> rgb = hsi2rgb(hsi);
>> subplot(122),imshow(rgb)

在这里插入图片描述在这里插入图片描述在这里插入图片描述

(6)独立于设备的彩色空间

  • 图像处理工具箱支持的独立于设备的彩色空间
彩色空间描述
XYZ最初于1931年引入的CIE彩色空间规范
xyY提供了归一化颜色值的CIE规范,大写的Y值表示亮度,与XYZ中的一样
nvL试图使颜色平面在视觉上更一致的CIE规范,L是亮度,与XYZ中的一样
u’v’L为了改进一致性,u和v被重新标定的CIE规范
L* a* b*试图使亮度在视觉上更一致的CIE规范,L*是L的非线性尺度,它对白色基准点是归一化的
L*ch这样的c是浓度,h是色调,这些值是Lab中a和b*的极坐标变换
  • 微软和惠普为了解决图像不能准确地预知在用户浏览器上显示时图像的颜色,提出了新的默认彩色空间标准,称作sRGB。目前,这种标准已经被计算机界广泛接受。

为了将CIE和sRGB之间进行转换,可以用函数makecform和applycform进行转换。函数makecform用于创建cform结构,而函数applycform使用cform结构转换颜色。

cform = makecform(type);
g = applycform(f,cform);

其中,'type’类型有:‘lab2lch’、‘lch2lab’、‘lab2srgb’、‘srgb2lab’、'lab2xyz、‘xyz2lab’、‘srgb2xyz’、‘xyz2srgb’、‘upvpl2xyz’、'xyz2upvpl’等。

实验代码如下:

L = linspace(40,80,1024);   %构建线性斜坡
radius = 70;
theta = linspace(0,pi,1024);
a = radius*cos(theta);
b = radius*sin(theta);      %设置平面中的彩色极角
L=repmat(L,100,1);
a=repmat(a,100,1);
b=repmat(b,100,1);
lab_scale = cat(3,L,a,b);  %制作一幅彩色标尺图像
cform = makecform('lab2srgb');
rgb_scale = applycform(lab_scale,cform);
imshow(rgb_scale)    %显示彩色标尺

实验结果:
在这里插入图片描述

  • -ICC是用于文本的彩色打印。为了在不同的输入、输出和显示设备上得到高质量的彩色重现。其主要目的之一是创建标准化的、维护和提升ICC彩色剖面的标准。用函数iccread读取剖面文件,基本语法是:
p =iccread(filename)%读取剖面文件
cform = makecform('icc',src_profile,dest_profile);%src_profile是源设备剖面文件名,dest_profile是目标设备剖面文件名

指定渲染意图的语法:
cform = makecform('icc',src_profile,dest_profile,'SourceRenderingIntent',src_intent,'DestRenderingIntent',dest_intent)

其中,src_intent和dest_intent的选择有:‘Perceptual’(默认)、‘AbsoluteColorimetric’(绝对色度的)、‘RelativeColorimetric’(相对色度的)、‘Saturation’(饱和的)。

实验代码:

f = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0604(a).tif');
fp = padarray(f,[40 40],255,'both');
fp = padarray(f,[4 4],230,'both');
subplot(121),imshow(fp),title('原图像');  %显示填充的图像

p_srgb = iccread('sRGB.icm');
p_snap = iccread('SNAP2007.icc');
cform1 = makecform('icc',p_srgb,p_snap);
fp_newsprint = applycform(fp,cform1);
cform2 = makecform('icc',p_snap,p_srgb,'SourceRenderingIntent','AbsoluteColorimetric','DestRenderingIntent','AbsoluteColorimetric');
fp_proof = applycform(fp_newsprint,cform2);
subplot(122),imshow(fp_proof),title('模拟打印在报纸上的图像');

实验结果:
在这里插入图片描述在这里插入图片描述

注意!
SNAP2007.icc 这个文件是需要在网上下载的!

(三)彩色图像处理的基础知识

我们将彩色图像处理细分成三个主要领域,分别是颜色变换(彩色映射)、单独彩色平面的空间处理、颜色向量的处理。

第一种是每个彩色平面的像素,严格以像素值为基础,类似于灰度变换处理;
第二种涉及各个彩色平面的空间滤波,类似于空间滤波;
第三种涉及以同时处理彩色图像的所有分量为基础的处理技术。

如图是灰度图像和RGB图像的空间模板:
在这里插入图片描述

(四)彩色变换

彩色变换是指将红、绿、蓝系统表示的图像变换为用明度、色别、饱和度系统表示的图像的处理方法。HIS彩色空间和HSV彩色空间分别是利用色调、亮度及饱和度等信息来量化RGB色彩。这在图像地物识别与分类的过程中,大大的提高了人眼对地物色彩的感知,这两种色彩变换被广泛应用于图像地物识别与分类过程中。(来自百度百科)
用数学表达式来描述是,对于彩色图像,我们限定如下的形式变换:
在这里插入图片描述

其中,i =1,2,…n。ri和si是输入和输出图像的彩色分量,n是ri的彩色空间的维数,而且Ti是全彩色变换函数。(此公式用于处理RGB中单色图像

当用伪彩色和全彩色映射时,尤其涉及人类观察和说明的时候,直接产生候选函数的图形描述,并在被处理图像上观察综合效果的方法,是选择合适映射函数的最好方法。以下介绍两种方法指定使用了控制点的映射函数:线性内插三次样条内插,基本语法如下:

Z = interpiq(x,y,xi);   %线性内插
Z = spline(x,y,xi);   %三次样条内插

实验编写代码如下:

Z = interpiq([0 255],'[0 255],'[0:255]);    %产生Z=[0,1,2...255]'

将控制点输入到interpiq和spline函数并实时地显示被处理的图像的结果,语法为:

g = ice('property name','property value',...)

在上面公式中,'property name’和’property value’必须成对出现,并且点指出由相应的输入对组成的模式的重复。

常用ice函数语法使用的示例为:

ice  %只有ice图示
g = ice('image',f);   %展示并返回g
g = ice('image',f,'wait','off');    %展示g和返回句柄
g = ice('image',f,'space','hsi');    %RGB图像f以hsi显示

PS.当指定的彩色空间不同于RGB时,输入图像(不管是单色还是RGB)在执行任何映射之前,需要被变换到指定的空间。对于输出来说,映射后的图像转换为RGB。

为了得到图形目标的属性,可以用如下函数:

h = get(g)   %返回全部特性以及由句柄g识别的图形目标的当前可用值

比如要获得特殊的特性,可以输入h.properName

根据上面函数,实验代码如下:

 f = imread('C:\Users\Public\Pictures\Sample Pictures\fengjing.jpg');
 g = ice('image',f,'wait','off'); 

(图一)
在这里插入图片描述(图二)
在这里插入图片描述在这里插入图片描述(图三)
在这里插入图片描述在这里插入图片描述
分析:将句柄向下移动,使得上面图像的对比度降低,彩色图像整体变得暗了。使用非平滑曲线时,图像灰度级之前过度比较自然,比如说图像中的波纹(或者山脉);但在使用平滑曲线时,可以看出波纹的细节更加突出了。

(图四)
在这里插入图片描述在这里插入图片描述
分析:在增加控制点后,发现图像的对比度、色调、亮度及RGB各个分量都会发生变化,最后使得图像整体也发生变化。这种常见在艺术照、图片发布之前,调整图像中的色调、对比度等,通俗来说,这就是常见的P图。但发现一个问题,这种调整图像是通过调整整幅图而言的,那么有没有一种可以局部调整的方式呢?

用hsi句柄调整图像,代码如下:

f = imread('C:\Users\Public\Pictures\Sample Pictures\egg.jpeg');
g = ice('image',f,'space','hsi');

(图五)
在这里插入图片描述(图六)
在这里插入图片描述在这里插入图片描述
(图七)
在这里插入图片描述在这里插入图片描述在这里插入图片描述

彩色变换的应用:
1、将图像进行反转(负片)
2、彩色分量的反映射(将红绿蓝变成其对应的补色)
3、单色和彩色的对比度增强和减弱
4、伪彩色映射
5、色彩平衡
6、基于直方图的映射

负片效果:
在这里插入图片描述反映射效果:
(原图像)
在这里插入图片描述(反映射)
在这里插入图片描述其他应用也是通过修改句柄和其他参数而得到的,这里就不一一展示了。

(五)彩色图像的空间滤波

(1)平滑处理

RGB向量的数学表示为:
在这里插入图片描述
从上式可以看出,需要得到的结果是由每个分量执行邻域均值获得的,因此想要平滑彩色图像,就需要用邻域平均的平滑对每个图像平面的基础上处理。

线性空间滤波的步骤为:

1、抽取3个分量图像:

fr = fc(:,:,1);
fg = fc(:,:,2);
fb = fc(:,:,3);

2、分别过滤每个分量图像:

fR_filtered = imfilter(fR,w,'replicate');    %平滑红色分量
fG_filtered = imfilter(fG,w,'replicate');    %平滑绿色分量
fB_filtered = imfilter(fB,w,'replicate');    %平滑蓝色分量

3、重建滤波过的RGB图像:

fc_filtered = cat(3,fR_filtered,fG_filtered,fB_filtered);

可以将上面三个步骤合成一步:

fc_filtered = imfilter(fc,w,'replicate');

实验代码:

fc = imread('C:\Users\Public\Pictures\Sample Pictures\cat.jpg');
subplot(331),imshow(fc),title('原图像');
h = rgb2hsi(fc);
subplot(332),imshow(h),title('rgb转换成hsi');
H = h(:,:,1);
S = h(:,:,2);
I = h(:,:,3);
subplot(333),imshow(H),title('H');
subplot(334),imshow(S),title('S');
subplot(335),imshow(I),title('I');
w = fspecial('average',25);
subplot(336),imshow(w,[]),title('均值模板');
I_filtered = imfilter(I,w,'replicate');
subplot(337),imshow(I_filtered),title('对亮度进行滤波');
h = cat(3,H,S,I_filtered);
subplot(338),imshow(h),title('对亮度进行滤波后组合起来的图像');
f = hsi2rgb(h);
subplot(339),imshow(f),title('将图像进行反变换')

在这里插入图片描述在这里插入图片描述结论:将彩色图像进行亮度滤波后的平滑处理,使得图像整体变得模糊,是因为经过平滑处理后,亮度分量的变化减少了,但色调和饱和度分量没有变化。彩色图像和灰度图像平滑处理的不同之处在于,灰度平滑处理是将尖锐的边缘变得平滑,虽然彩色图像也是这样,但彩色图像包括亮度、饱和度、色调三个方面,因此平滑处理的是将三种分别平滑再组合起来得到一幅平滑彩色图像。

仅对rgb进行滤波,实验代码如下:

fc = imread('C:\Users\Public\Pictures\Sample Pictures\fengjing2.jpg');
subplot(331),imshow(fc),title('原图像');
fr = fc(:,:,1);
fg = fc(:,:,2);
fb = fc(:,:,3);
subplot(332),imshow(fr),title('fr');
subplot(333),imshow(fg),title('fg');
subplot(334),imshow(fb),title('fb');
w = fspecial('average',25);
fR_filtered = imfilter(fr,w,'replicate');    %平滑红色分量
fG_filtered = imfilter(fg,w,'replicate');    %平滑绿色分量
fB_filtered = imfilter(fb,w,'replicate');    %平滑蓝色分量
subplot(335),imshow(fR_filtered),title('对红色进行滤波');
subplot(336),imshow(fG_filtered),title('对绿色进行滤波');
subplot(337),imshow(fB_filtered),title('对蓝色进行滤波');
h = cat(3,fR_filtered,fG_filtered,fB_filtered);
subplot(338),imshow(h),title('组合起来的图像');
f = hsi2rgb(h);
subplot(339),imshow(f),title('将图像进行反变换')

在这里插入图片描述

(2)锐化处理

图像锐化我们使用拉普拉斯模板,正如上面叙述那样,分别计算每个分量图像的拉普拉斯得到全彩色图像的拉普拉斯。

实验代码:

fb = imread('C:\Users\Public\Pictures\Sample Pictures\fengjing2.jpg');
subplot(121),imshow(fb),title('原始图像')
lapmask = [1 1 1;1 -8 1;1 1 1];    %拉普拉斯模板
fb = tofloat(fb);             %将其变成浮点型
fen = fb - imfilter(fb,lapmask,'replicate');    %锐化滤波
subplot(122),imshow(fen),title('锐化后图像')

在这里插入图片描述在这里插入图片描述

(六)直接在RGB矢量空间中的处理

首先,我们需要分清楚两种概念:第一,基于单独彩色平面的处理;第二,直接在RGB矢量空间中的处理。

(1)使用梯度的彩色边缘检测

说明:回顾灰度边缘检测,我们一般先求出图像的梯度或者二阶微分,然后根据梯度和二阶差分的大小,以及最大变化率方向来寻找可能存在的图像边缘。彩色图像的每个像素包含红绿蓝三个分量,这样每个像素可以由一个三维向量来表示。但是在进行图像边缘检测的时候,我们遇到一个问题,那就是向量并不存在梯度概念。单独对每个颜色分量进行边缘检测,其梯度不能反映图像整体彩色的差异变化
为了进行处理,可以用sobel算子进行偏微分计算,计算彩色图像的梯度语法为:

[VG,A,PPG] = colorgrad(f,T)

其中,f是RGB图像,T是[0,1]范围内的阈值选项(默认值为0),VG是RGB向量梯度,A是以弧度计的角度,PPG是由单独彩色平面的2D梯度之和形成的梯度图像。

实验代码:

f = imread('C:\Users\Public\Pictures\Sample Pictures\cat.jpg');
[VG,A,PPG] = colorgrad(f)
subplot(121),imshow(VG),title('在rgb空间计算梯度图像');
subplot(122),imshow(PPG),title('分别在rgb计算梯度然后相加');

在这里插入图片描述在这里插入图片描述

imshow(abs(VG-PPG),[]),title('2种梯度的绝对值');

(2)在RGB向量空间中分割图像

彩色区域分割是为了将图像中的每个RGB像素进行分类,使其在指定的范围内有或没有一种颜色。为了执行这种比较,通常采用欧几里得距离来进行度量。在这里插入图片描述
令z是RGB空间的任意点,如果它们之间的距离小于指定的阈值T,则z相似于m。

分割是通过函数colorseg实现的,基本语法为:

S = colorseg(method,f,T,parameters)

其中,method选择有’euclidean’(欧几里得)、‘mahalanobis’(马氏距离),f是待分割的RGB彩色图像,T是阈值。若选择’euclidean’(欧几里得),则输入参数为m;若选择’mahalanobis’(马氏距离),则输入参数为m和c。参数m是均值m,c是协方差矩阵C

实验代码:

f = imread('C:\Users\Public\Pictures\Sample Pictures\fengjing2.jpg');
subplot(131),imshow(f),title('原始图像');
mask = roipoly(f);   %获取感兴趣的区域,产生模板
subplot(132),imshow(mask),title('截取的模板范围');
red = immultiply(mask,f(:,:,1));    %immultipy函数为2幅图像对应的元素相乘
green = immultiply(mask,f(:,:,2));
blue = immultiply(mask,f(:,:,3));
g = cat(3,red,green,blue);    %将对应的3个分量进行重新组合
subplot(133),imshow(g),title('最终图像')

在这里插入图片描述

[M,N,K] = size(g);   %k为3
I = reshape(g,M*N,3);   %I为M*N行,3列的重新塑造的数组
idx = find(mask);      %找到彩色像素索引
I = double(I(idx,1:3));    %将I变成双精度型
[C,m] = covmatrix(I);    %计算出协方差矩阵C和均值m
d = diag(C); %方差
sd = sqrt(d);  %标准差
E25 = colorseg('euclidean',f,25,m);    %使用欧几里得距离进行彩色分割
subplot(221),imshow(E25),title('使用欧氏距离25的分割');
E50 = colorseg('euclidean',f,50,m);
subplot(222),imshow(E50),title('使用欧氏距离50的分割');
E75 = colorseg('euclidean',f,75,m);
subplot(223),imshow(E75),title('使用欧氏距离75的分割');
E100 = colorseg('euclidean',f,100,m);
subplot(224),imshow(E100),title('使用欧氏距离100的分割');

(用欧几里得距离分割的效果)
在这里插入图片描述

M25 = colorseg('mahalanobis',f,25,m,C);    %使用马氏距离分割
subplot(221),imshow(M25);
M50 = colorseg('mahalanobis',f,50,m,C);
subplot(222),imshow(M50);
M75 = colorseg('mahalanobis',f,75,m,C);
subplot(223),imshow(M75);
M100 = colorseg('mahalanobis',f,1000,m,C);
subplot(224),imshow(M100)

(用马氏距离分割的效果)
在这里插入图片描述上图显示当马氏距离为50以后,图像基本都变成白色,这是由于分割图像基本被完全分割。因此修改的代码如下:

M25 = colorseg('mahalanobis',f,25,m,C);    %使用马氏距离分割
subplot(221),imshow(M25);
M30 = colorseg('mahalanobis',f,30,m,C);
subplot(222),imshow(M30);
M35 = colorseg('mahalanobis',f,35,m,C);
subplot(223),imshow(M35);
M40 = colorseg('mahalanobis',f,40,m,C);
subplot(224),imshow(M40)

在这里插入图片描述

  • 24
    点赞
  • 134
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值