【实验六 彩色图像的处理(综合性)】

一、实验目的

1.掌握常见的几种颜色模型及各种颜色空间的转换。
2.掌握彩色图像的空间滤波,实现彩色图像的平滑和锐化。
3.采用MATLAB函数和编程实现彩色图像的处理。

二、实验材料

1.软件:MATLAB
2.文件夹:caise
2.png文件:liftingbody.png; peppers.png; RGB.png
3.tif文件:Fig0630(a).tif; flower.tif; peppers_color.tif
4. .m文件,My_hsi2rgb.m;My_rgb2hsi.m

三、实验内容(每一个内容编写一个*.m文件)

1.彩色图像的表达和显示:
(1)生成一幅如图1的的RGB图像(RGB.png),该图像左上角为红色,左下角为蓝色,右上角为绿色,右下角为黑色;
(2)读入真彩色图像(RGB.png),分别显示原图像及其RGB空间的R\G\B分量;
(3)改变R\G\B分量,分别显示出改变后的R\G\B分量及改变后合成的真彩色图像,R1=0.1R,G1=0.3G,B1=0.6B;
(4)用负片函数imcomplement()将RGB图像进行反色变换,显示反色图图像和原始图像;
(5)比较改变的真彩色图像与原始图像的差别,分析R\G\B分量变化对图像的影响。
对比:
在这段代码中,我们对红色、绿色、蓝色三个通道进行了不同程度的加权处理,得到了新的图像。可以看出,加权后的红色通道图像偏暗,绿色通道图像偏亮,而蓝色通道图像则更加鲜艳。这说明,不同颜色通道的加权处理对图像的亮度、色彩饱和度等方面都有一定的影响。

另外,对原始RGB图像进行反色处理后,得到了完全相反的颜色,即红色变成了青色,绿色变成了品红色,蓝色变成了黄色。这说明,颜色空间中的R、G、B分量是相互独立的,并且它们之间的关系非常复杂,使得对图像进行颜色处理和调整时需要考虑多种因素的影响。

% 1-1 创建 RGB 彩色图像
rgb_R=zeros(128,128); % 创建一个128x128的全零矩阵作为红色通道
rgb_R(1:64,1:64)=1; % 在前一半区域设置红色通道为1
rgb_G=zeros(128,128); % 创建一个128x128的全零矩阵作为绿色通道
rgb_G(1:64,65:128)=1; % 在后一半区域设置绿色通道为1
rgb_B=zeros(128,128); % 创建一个128x128的全零矩阵作为蓝色通道
rgb_B(65:128,1:64)=1; % 在后一半区域设置蓝色通道为1
RGB=cat(3,rgb_R,rgb_G,rgb_B); % 将三个通道合并成一个RGB图像
figure(1) % 打开一个新的图形窗口
imwrite(RGB,'RGB.png'); % 将RGB图像保存为文件
I = imread('RGB.png'); % 从文件中读取RGB图像

% 1-2/1-3 分离和显示各个通道
IR = I(: , : , 1); % 提取红色通道
IG = I(: , : , 2); % 提取绿色通道
IB = I(: , : , 3); % 提取蓝色通道
subplot(3,3,1),imshow(I),title('RGB彩色图像') % 显示原始RGB图像
subplot(3,3,4),imshow(IR),title('Red channel') % 显示红色通道图像
subplot(3,3,5),imshow(IG),title('Green channel') % 显示绿色通道图像
subplot(3,3,6),imshow(IB),title('Blue channel') % 显示蓝色通道图像
IR1=0.5*IR;IG1=0.3*IG;IB1=0.8*IB; % 对各个通道进行加权处理
subplot(3,3,7),imshow(IR1),title('Red1=0.5Red ') % 显示加权后的红色通道图像
subplot(3,3,8),imshow(IG1),title('Green1=0.3Green ') % 显示加权后的绿色通道图像
subplot(3,3,9),imshow(IB1),title('Blue1=0.8Blue ') % 显示加权后的蓝色通道图像
I1= cat(3,IR1, IG1, IB1); % 将加权后的通道重新合成为图像
subplot(3,3,2),imshow(I1),title('合成图像') % 显示合成图像

% 1-4 反色处理
I2= imcomplement(I); % 对原始RGB图像进行反色处理
subplot(3,3,3),imshow(I2),title('反色图像') % 显示反色图像

2.彩色模型的转换:
(1)将彩色图像(peppers.pgn)进行RGB空间分解,分别显示原始图像及其R\G\B分量;
(2)根据转换原理将原始图像从RGB空间转换到HSI空间,分别显示H\S\I分量;
(3)改变H\S\I分量,分别显示出改变后的H\S\I分量;
第一组:H1=0.5H;S1=S;I=I
第二组:H2=H;S2=0.5S;I=I
第三组:H3=H;S3=S;I3=0.5I
第四组:H3=0.5H;S3=0.5S;I3=0.5I
(4)根据转换原理将改变的图像数据从HIS空间转换回RGB空间,再合成真彩色图像并显示;
(5)比较改变的真彩色图像与原始图像的差别,分析H\S\I分量变化对图像的影响。
对比:

  • H通道加权:通过将原始H通道乘以0.5进行加权处理,可以观察到图像的色调发生了变化。加权后的H通道图像变得更暗或更亮,取决于乘以的权重值。这可能会改变图像的整体色调。

  • S通道加权:通过将原始S通道乘以0.5进行加权处理,可以观察到图像的饱和度发生了变化。加权后的S通道图像变得更淡或更鲜艳,取决于乘以的权重值。这可能会影响图像的颜色饱和度。

  • I通道加权:通过将原始I通道乘以0.5进行加权处理,可以观察到图像的亮度发生了变化。加权后的I通道图像变得更暗或更亮,取决于乘以的权重值。这可能会影响图像的整体亮度。

figure(1); % 打开一个新的图形窗口
A= imread('peppers.png'); % 读取彩色图像
R = A(: , : , 1); % 提取红色通道
G = A(: , : , 2); % 提取绿色通道
B = A(: , : , 3); % 提取蓝色通道
subplot(3,3,1),imshow(A),title('RGB彩色图像') % 显示原始RGB图像
subplot(3,3,4),imshow(R),title('Red channel') % 显示红色通道图像
subplot(3,3,5),imshow(G),title('Green channel') % 显示绿色通道图像
subplot(3,3,6),imshow(B),title('Blue channel') % 显示蓝色通道图像

HSI=MY_rgb2hsi(A);  % RGB转HSI
H = HSI(: , : , 1); % 提取H通道
S = HSI(: , : , 2); % 提取S通道
I =HSI(: , : , 3);  % 提取I通道
subplot(3,3,7),imshow(H),title('H channel') % 显示H通道图像
subplot(3,3,8),imshow(S),title('S channel') % 显示S通道图像
subplot(3,3,9),imshow(I),title('I channel') % 显示I通道图像

figure(2) % 打开第二个图形窗口
subplot(4,3,1),imshow(A),title('RGB彩色图像'); % 显示原始RGB图像
subplot(4,3,4),imshow(H),title('H channel') % 显示H通道图像
subplot(4,3,5),imshow(S),title('S channel') % 显示S通道图像
subplot(4,3,6),imshow(I),title('I channel') % 显示I通道图像

H1=0.5*H; % 对H通道进行加权处理
S2=0.5*S; % 对S通道进行加权处理
I3=0.5*I; % 对I通道进行加权处理
subplot(4,3,7),imshow(H1),title('H1=0.5H') % 显示加权后的H通道图像
subplot(4,3,8),imshow(S2),title('S2=0.5S') % 显示加权后的S通道图像
subplot(4,3,9),imshow(I3),title('I3=0.5S') % 显示加权后的I通道图像

H1SI = cat(3, H1, S, I); % 将加权后的通道重新合成为HSI图像
RGB1=MY_hsi2rgb(H1SI); % HSI转RGB
subplot(4,3,10),imshow(RGB1),title('H1=0.5H,S1=S,I1=I') % 显示合成后的RGB图像

HS2I = cat(3, H, S2, I); % 将加权后的通道重新合成为HSI图像
RGB2=MY_hsi2rgb(HS2I); % HSI转RGB
subplot(4,3,11),imshow(RGB2),title('H2=H,S2=0.5S,I2=I') % 显示合成后的RGB图像

HSI3 = cat(3, H, S, I3); % 将加权后的通道重新合成为HSI图像
RGB3=MY_hsi2rgb(HSI3); % HSI转RGB
subplot(4,3,12),imshow(RGB3),title('H3=H,S3=S,I3=0.5I') % 显示合成后的RGB图像

H1S2I3 = cat(3, H1, S2, I3); % 将加权后的通道重新合成为HSI图像
RGB4=MY_hsi2rgb(H1S2I3); % HSI转RGB
subplot(4,3,2),imshow(RGB4),title('H1=0.5H,S2=0.5S,I3=0.5S') % 显示合成后的RGB图像

3.彩色图像空间滤波:
(1)将彩色图像(peppers.pgn)进行不同空间分解并滤波:
1)RGB空间分解,并对R/G/B分量采用函数imfilter()分别进行均值滤波(参数:使用15×15像素的平均滤波器;’replicate’),再合成彩色图像;
2)HSI空间分解,并对I分量采用函数imfilter()进行均值滤波(参数:使用15×15像素的平均滤波器;’replicate’)后,再合成彩色图像;
3)用减法函数imsubtract ()将两种不同方式的滤波后合成的图像相减,比较差异性。
(2)用函数imfilter()直接对彩色图像进行平滑滤波并显示(参数:使用像素的平均滤波器;’replicate’);
(3)用拉普拉斯滤波器模板([1 1 1;1 -8 1;1 1 1])对彩色图像进行锐化处理并显示(参数:’replicate’);
(4)显示采用几种方式进行空间滤波后的彩色图像,并比较分析原始图像和几种不同方式滤波的结果。

对比:
首先,通过imread函数读取了一张名为peppers.png的RGB图像,并使用im2double函数将其转换为double类型。然后,分别提取了RGB空间中的三个通道,并创建了一个15x15的平均滤波器,对每个通道进行了均值滤波,得到了RGB空间的RGB分量均值滤波图像。同时,也将原始图像与滤波后的图像相减,得到了RGB空间滤波边缘图像。

接着,使用自己编写的MY_rgb2hsi函数将RGB图像转换为HSI图像,分别提取了HSI空间中的三个通道,并对其中的I通道进行了均值滤波,得到了HSI空间的I分量均值滤波图像。同样地,也将原始图像与滤波后的图像相减,得到了HSI空间滤波边缘图像。

接下来,计算了两种模型均值滤波的差异,并将其显示出来。

然后,创建了一个25x25的平均滤波器,对原始图像进行了直接平滑滤波,并将其与原始图像相减,得到了直接空间滤波边缘图像。

最后,定义了拉普拉斯算子模板,并使用imfilter函数对原始图像进行了拉普拉斯算子滤波,得到了拉普拉斯算子滤波图像。同时,也将其与原始图像相加,得到了拉普拉斯算子锐化增强图像。

最后,在subplot函数中设置了多个子图,将以上处理结果依次显示出来,并使用title函数添加图像标题以方便比较和分析。

% 3-1-1 RGB空间均值滤波
A = imread('peppers.png'); % 读取图像
A = im2double(A); % 转换为double类型
fR = A(:, :, 1); % 提取红色通道
fG = A(:, :, 2); % 提取绿色通道
fB = A(:, :, 3); % 提取蓝色通道
w1 = fspecial('average', 15); % 创建一个15x15的平均滤波器
fR_filtered = imfilter(fR, w1, 'replicate'); % 对红色通道进行均值滤波
fG_filtered = imfilter(fG, w1, 'replicate'); % 对绿色通道进行均值滤波
fB_filtered = imfilter(fB, w1, 'replicate'); % 对蓝色通道进行均值滤波
RGB1 = cat(3, fR_filtered, fG_filtered, fB_filtered); % 合成RGB图像
fen1 = imsubtract(A, RGB1); % 计算原始图像与滤波后图像的差异

% 3-1-2 HSI空间均值滤波
HSI = MY_rgb2hsi(A); % RGB转HSI
fH = HSI(:, :, 1); % 提取H通道
fS = HSI(:, :, 2); % 提取S通道
fI = HSI(:, :, 3); % 提取I通道
fI_filtered = imfilter(fI, w1, 'replicate'); % 对I通道进行均值滤波
HSI1 = cat(3, fH, fS, fI_filtered); % 合成HSI图像
RGB2 = MY_hsi2rgb(HSI1); % HSI转RGB
fen2 = imsubtract(A, RGB2); % 计算原始图像与滤波后图像的差异

% 3-1-3 两种模型均值滤波结果的差异
diff = imsubtract(RGB1, RGB2); % 两种平滑滤波的差异

% 3-2 直接平滑滤波
w2 = fspecial('average', 25); % 创建一个25x25的平均滤波器
I_filtered = imfilter(A, w2, 'replicate'); % 对图像进行直接平滑滤波
fen3 = imsubtract(A, I_filtered); % 计算原始图像与直接平滑滤波后图像的差异

% 3-3 拉普拉斯算子滤波
lapmask = [1 1 1; 1 -8 1; 1 1 1]; % 定义拉普拉斯算子模板
J = single(A); % 转换为单精度浮点数
J_filtered = imfilter(A, lapmask, 'replicate'); % 对图像进行拉普拉斯算子滤波
fen4 = imadd(A, J_filtered); % 对原始图像进行锐化增强

% 3-4 显示图像和处理结果
subplot(3, 4, 1), imshow(A); title('原图像'); % 显示原图像
subplot(3, 4, 5), imshow(RGB1); title('RGB空间RGB分量均值滤波图像'); % 显示RGB空间均值滤波后图像
subplot(3, 4, 6), imshow(fen1); title('RGB空间滤波边缘图像'); % 显示RGB空间滤波边缘图像
subplot(3, 4, 7), imshow(RGB2); title('HSI空间I分量均值滤波图像'); % 显示HSI空间均值滤波后图像
subplot(3, 4, 8), imshow(fen2); title('HSI空间滤波边缘图像'); % 显示HSI空间滤波边缘图像
subplot(3, 4, 3), imshow(diff); title('两种模型均值滤波结果的差异图像'); % 显示两种模型均值滤波结果的差异图像
subplot(3, 4, 9), imshow(I_filtered); title('直接平滑滤波图像'); % 显示直接平滑滤波后图像
subplot(3, 4, 10), imshow(fen3); title('直接空间滤波边缘图像'); % 显示直接空间滤波边缘图像
subplot(3, 4, 11), imshow(J_filtered); title('拉普拉斯算子滤波图像'); % 显示拉普拉斯算子滤波图像
subplot(3, 4, 12), imshow(fen4); title('拉普拉斯算子锐化增强图像'); % 显示拉普拉斯算子锐化增强图像
  1. 彩色图像边缘检测:
    (1)利用边缘检测函数edge ()对彩色图像(flower.tif)进行边缘检测,检测算子分别选择’roberts’、‘sobel’、‘prewitt’(其他参数选择:default)。
    (2)将图像(Fig0630(a).tif)从RGB空间转化到HSI空间,分解得到H,S,I各个分量的图像。对H分量采用合适的阈值(最大色调的10%,可以尝试不同值,观测分割的结果)将H分量图转化成二值图像(B),将二值图像与H分量图相乘(C),观测相乘后所得到的的图(C图)的直方图,找到合适的阈值(参考值为0.9)将C图进行二值化,分割出图像中感兴趣区域。
% 4-1 HSI空间分析
f = imread('Fig0630(a).tif'); % 读取图像
R = double(f(:,:,1))/255; % 提取红色通道并归一化到[0, 1]
G = double(f(:,:,2))/255; % 提取绿色通道并归一化到[0, 1]
B = double(f(:,:,3))/255; % 提取蓝色通道并归一化到[0, 1]

H = acos(0.5*((R-G)+(R-B))./sqrt((R-G).^2+(R-B).*(G-B)+eps)); % 计算H通道
H(B>G) = 2*pi - H(B>G); % 根据B>G的情况对H进行调整
H = H/(2*pi); % 归一化到[0, 1]

S = 1 - 3./(sum(double(f),3)+eps).*min(double(f),[],3); % 计算S通道
I = sum(f,3)./3; % 计算I通道

hsi = cat(3,H,S,I); % 合成HSI图像
H = hsi( :, :, 1); % 提取H通道
S = hsi( :, :, 2); % 提取S通道
I = hsi( :, :, 3); % 提取I通道

T = graythresh(H); % 自适应阈值化选取阈值
B = im2bw(H,T); % 对H通道进行二值化
C = B.*H; % 通过掩膜B提取感兴趣的区域C

subplot(3, 2, 1), imshow(hsi); title('(a)HSI'); % 显示HSI图像
subplot(3, 2, 2), imshow(H); title('(b)H'); % 显示H通道
subplot(3, 2, 3), imshow(S); title('(c)S'); % 显示S通道
subplot(3, 2, 4), imshow(I); title('(d)I'); % 显示I通道
subplot(3, 2, 5), imshow(B); title('(d)B');  % 显示二值化后的H通道
subplot(3, 2, 6), imshow(im2bw(C,0.9)); title('(d)C'); % 显示感兴趣区域C

% 4-2 颜色分割
f = imread('peppers.png'); % 读取图像
mask = roipoly(f); % 交互式地提取感兴趣的区域

red = immultiply(mask,f(:,:,1)); % 提取感兴趣区域的红色通道
green = immultiply(mask,f(:,:,2)); % 提取感兴趣区域的绿色通道
blue = immultiply(mask,f(:,:,3)); % 提取感兴趣区域的蓝色通道
g = cat(3,red,green,blue); % 合成感兴趣区域的图像

imshow(f),title('原图') % 显示原图
figure,imshow(g);title('用函数roipoly交互式地提取感兴趣的区域') % 显示交互式提取的感兴趣区域

[M,N,K] = size(g); % 获取图像尺寸
I = reshape(g,M*N,3); % 将图像数据转换为行向量
idx = find(mask); % 找到感兴趣区域的索引
I = double(I(idx,1:3)); % 提取感兴趣区域的颜色信息并转换为double类型

[C,m] = covmatrix(I); % 计算协方差矩阵和均值向量
d = diag(C); % 提取协方差矩阵的对角线元素
sd = sqrt(d); % 计算标准差

E25 = colorseg('euclidean',f,25,m); % 使用欧氏距离进行分割,阈值为25
figure,subplot(2,2,1),imshow(E25);title('(a)使用euclidean,T=25分割效果');

E50 = colorseg('euclidean',f,50,m); % 使用欧氏距离进行分割,阈值为50
subplot(2,2,2),imshow(E50);title('(b)使用euclidean,T=50分割效果');

E75 = colorseg('euclidean',f,75,m); % 使用欧氏距离进行分割,阈值为75
subplot(2,2,3),imshow(E75);title('(c)使用euclidean,T=75分割效果');

E100 = colorseg('euclidean',f,100,m); % 使用欧氏距离进行分割,阈值为100
subplot(2,2,4),imshow(E100);title('(d)使用euclidean,T=100分割效果');

M25 = colorseg('mahalanobis',f,25,m,C); % 使用马氏距离进行分割,阈值为25
figure,subplot(2,2,1),imshow(M25);title('(e)使用mahalanobis,T=25分割效果');

M50 = colorseg('mahalanobis',f,50,m,C); % 使用马氏距离进行分割,阈值为50
subplot(2,2,2),imshow(M50);title('(f)使用mahalanobis,T=50分割效果');

M75 = colorseg('mahalanobis',f,75,m,C); % 使用马氏距离进行分割,阈值为75
subplot(2,2,3),imshow(M75);title('(g)使用mahalanobis,T=75分割效果');

M100 = colorseg('mahalanobis',f,100,m,C); % 使用马氏距离进行分割,阈值为100
subplot(2,2,4),imshow(M100);title('(h)使用mahalanobis,T=100分割效果');

四、问题与讨论

1.怎样将彩色图像转换到灰度图像?
将彩色图像转换为灰度图像通常有几种方法,包括:

  • 平均值法:将红、绿、蓝三个通道的像素值取平均作为灰度值。 加权平均法:根据人眼对不同颜色敏感程度的差异,通过加权计算得到灰度值。
  • 分量法:利用颜色空间的转换公式,如RGB到YUV的转换,然后提取亮度分量作为灰度图像。

2.彩色图像和灰度图像处理上有何不同?
彩色图像和灰度图像在处理上有一些不同:

  • 彩色图像在处理时需要考虑到不同颜色通道的影响,例如颜色分割、颜色识别等问题需要针对不同通道进行处理;而灰度图像只有一个通道,处理起来相对简单。
  • 在某些应用中,彩色图像可能需要进行色彩增强、色彩平衡等处理,而灰度图像则只需要考虑亮度和对比度的调整。

3.如何实现彩色图像的空间滤波?
实现彩色图像的空间滤波可以使用以下步骤:

  • 选择合适的滤波器(如高斯滤波器、均值滤波器等)。
  • 对原始彩色图像的每个颜色通道进行滤波操作,得到滤波后的图像。
  • 可以选择在不同颜色通道上采用不同的滤波器参数,以实现特定的效果。
  • 最后将各个通道的滤波结果合成为最终的彩色图像。
  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值