彩色图像处理
一、 实验目的
1.掌握常见的几种颜色模型及各种颜色空间的转换。
2.掌握彩色图像的空间滤波,实现彩色图像的平滑和锐化。
3.采用MATLAB函数和编程实现彩色图像的处理。
二、实验内容和步骤
1.彩色图像的表达和显示:
(1)生成一幅如图1的的RGB图像(RGB.png),该图像左上角为红色,左下角为蓝色,右上角为绿色,右下角为黑色;
图1 RGB彩色图像
实验代码:
RGB_R=zeros(128,128);
RGB_R(1:64,1:64)=1;
RGB_G=zeros(128,128);
RGB_G(1:64,65:128)=1;
RGB_B=zeros(128,128);
RGB_B(65:128,1:64)=1;
RGB=cat(3,RGB_R,RGB_G,RGB_B); %合成RGB分量
imshow(RGB);
实验结果:
(2)读入真彩色图像(RGB.png),分别显示原图像及其RGB空间的R\G\B分量;
实验代码:
RGB=imread('E:\实验六\RGB.png');
subplot(2,2,1),imshow(RGB),title('原图');
R=RGB(:,:,1);
subplot(2,2,2),imshow(R),title('R');
G=RGB(:,:,2);
subplot(2,2,3),imshow(G),title('G');
B=RGB(:,:,3);
subplot(2,2,4),imshow(B),title('B');
实验截图:
(3)改变R\G\B分量,分别显示出改变后的R\G\B分量及改变后合成的真彩色图像,R1=0.1R,G1=0.3G,B1=0.6B;
实验代码:
RGB=imread('E:\实验六\RGB.png');
R=0.1*RGB(:,:,1);
subplot(2,2,1),imshow(R),title('0.1R');
G=0.3*RGB(:,:,2);
subplot(2,2,2),imshow(G),title('0.3G');
B=0.6*RGB(:,:,3);
subplot(2,2,3),imshow(B),title('0.6B');
RGB=cat(3,R,G,B);
subplot(2,2,4),imshow(RGB),title('合成');
实验截图:
(4)用负片函数imcomplement()将RGB图像进行反色变换,显示反色图图像和原始图像;
实验代码:
I=imread('E:\实验六\RGB.png');
I1=imcomplement(I);%求图像的补,即对图像进行求反运算,赋值给I1
subplot(1,2,1),imshow(I,[]),title('原图');
subplot(1,2,2),imshow(I1,[]),title('反色图');
实验截图:
(5)比较改变的真彩色图像与原始图像的差别,分析R\G\B分量变化对图像的影响。
由图可知,分量的减少导致相应的颜色变少,进而合成的真彩图显示出来的颜色更加暗淡。
2.彩色模型的转换:
(1)将彩色图像(peppers.pgn)进行RGB空间分解,分别显示原始图像及其R\G\B分量;
实验代码:
RGB=imread('E:\实验六\peppers.png');
subplot(2,2,1),imshow(RGB),title('原图');
R=RGB(:,:,1);
subplot(2,2,2),imshow(R),title('R');
G=RGB(:,:,2);
subplot(2,2,3),imshow(G),title('G');
B=RGB(:,:,3);
subplot(2,2,4),imshow(B),title('B');
实验截图:
(2)根据转换原理将原始图像从RGB空间转换到HSI空间,分别显示H\S\I分量;
实验代码:
RGB=imread('E:\实验六\peppers.png');
hsi=rgb2hsi(RGB);
rgb2hsi.m:
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);
subplot(2,2,1),imshow(hsi),title('hsi');
subplot(2,2,2),imshow(H),title('H');
subplot(2,2,3),imshow(S),title('S');
subplot(2,2,4),imshow(I),title('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
实验代码:
主要代码:
RGB=imread('E:\实验六\peppers.png');
hsi=rgb2hsi(RGB);
rgb2hsi.m
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);
subplot(2,2,1),imshow(hsi),title('hsi');
subplot(2,2,2),imshow(H),title('H');
subplot(2,2,3),imshow(S),title('S');
subplot(2,2,4),imshow(I),title('I');
第一组:
H=0.5*H;
S=S;
I=I;
实验截图:
第二组:
H=H;
S=0.5*S;
I=I;
实验结果:
第三组:
H=H;
S=S;
I=0.5*I;
实验结果:
第四组:
H=0.5*H;
S=0.5*S;
I=0.5*I;
实验结果:
(3)根据转换原理将改变的图像数据从HSI空间转换回RGB空间,再合成真彩色图像并显示;
实验代码:
Umtiled.m:
RGB=imread('E:\实验六\peppers.png');
subplot(1,3,1),imshow(RGB),title('原图');
hsi=rgb2hsi(RGB);
subplot(1,3,2),imshow(hsi),title('hsi');
RGB=hsi2rgb(hsi);
subplot(1,3,3),imshow(RGB),title('RGB');
rgb2hsi.m:
function hsi = rgb2hsi(rgb)
rgb = im2double(rgb);
r = rgb(:, :, 1);
g = rgb(:, :, 2);
b = rgb(:, :, 3);
% Implement the conversion equations.
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;
% Combine all three results into an hsi image.
hsi = cat(3, H, S, I);
hsi2rgb.m:
function rgb = hsi2rgb(hsi)
H = hsi(:, :, 1) * 2 * pi;
S = hsi(:, :, 2);
I = hsi(:, :, 3);
% Implement the conversion equations.
R = zeros(size(hsi, 1), size(hsi, 2));
G = zeros(size(hsi, 1), size(hsi, 2));
B = zeros(size(hsi, 1), size(hsi, 2));
% RG sector (0 <= H < 2*pi/3).
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));
% BG sector (2*pi/3 <= H < 4*pi/3).
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));
% BR sector.
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));
% Combine all three results into an RGB image. Clip to [0, 1] to
% compensate for floating-point arithmetic rounding effects.
rgb = cat(3, R, G, B);
rgb = max(min(rgb, 1), 0);
实验结果:
(4)比较改变的真彩色图像与原始图像的差别,分析H\S\I分量变化对图像的影响。
答:从图像来看彩色原图和真彩图像没差别,H代表色调,H变化会图像的相对明暗程度发生变化,S代表饱和度会导致颜色更鲜艳或黯淡,I代表亮度是对颜色明亮程度的控制。
3.彩色图像空间滤波:
(1)将彩色图像(peppers.pgn)进行不同空间分解并滤波:
1)RGB空间分解,并对R/G/B分量采用函数imfilter()分别进行均值滤波(参数:使用15×15像素的平均滤波器;’replicate’),再合成彩色图像;
实验代码:
%彩色图像空间滤波
clc;
clear all;
close all;
%提取3个分量图像
f=imread('E:\实验六\peppers.png'); %加载彩色图像
subplot(2,3,1);imshow(f);title('原图');
%显示原图像
fr=f(:,:,1); %提取R通道分量图像
fg=f(:,:,2); %提取G通道分量图像
fb=f(:,:,3); %提取B通道分量图像
%分别过滤每个分量图像
w = fspecial('average', 15);
fr_filter=imfilter(fr,w,'replicate'); %平滑红色分量图像
fg_filter=imfilter(fg,w,'replicate'); %平滑绿色分量图像
fb_filter=imfilter(fb,w,'replicate'); %平滑蓝色分量图像
%显示滤波后的三通道图像
subplot(2,3,2);imshow(fr_filter);title('R滤波后');
subplot(2,3,3);imshow(fg_filter);title('G滤波后');
subplot(2,3,4);imshow(fb_filter);title('B滤波后');
%重建滤波后的RGB图像
ff=cat(3,fr_filter,fg_filter,fb_filter); %构造多维数组,即合并3分量图像为一副彩色图像
%显示重建后的图像
subplot(2,3,5),imshow(ff);title('重建后');
实验结果:
2)HSI空间分解,并对I分量采用函数imfilter()进行均值滤波(参数:使用15×15像素的平均滤波器;’replicate’)后,再合成彩色图像;
实验代码:
Utlimed.m:
f=imread('E:\实验六\peppers.png');
subplot(1,3,1),imshow(f),title('原图');
f=rgb2hsi(f);
subplot(1,3,2),imshow(f),title('hsi');
f=hsi2rgb(f);
subplot(1,3,3),imshow(f),title('I分量滤波后rgb');
在hsi2rgb.m中对I分量滤波:
w=fspecial('average', 15);
I=imfilter(I,w,'replicate');
实验结果:
3)用减法函数imsubtract ()将两种不同方式的滤波后合成的图像相减,比较差异性。
实验代码:
%彩色图像空间滤波
clc;
clear all;
close all;
%提取3个分量图像
f=imread('E:\实验六\peppers.png'); %加载彩色图像
%显示原图像
fr=f(:,:,1); %提取R通道分量图像
fg=f(:,:,2); %提取G通道分量图像
fb=f(:,:,3); %提取B通道分量图像
%分别过滤每个分量图像
w = fspecial('average', 15);
fr_filter=imfilter(fr,w,'replicate'); %平滑红色分量图像
fg_filter=imfilter(fg,w,'replicate'); %平滑绿色分量图像
fb_filter=imfilter(fb,w,'replicate'); %平滑蓝色分量图像
%显示滤波后的三通道图像
%重建滤波后的RGB图像
ff=cat(3,fr_filter,fg_filter,fb_filter); %构造多维数组,即合并3分量图像为一副彩色图像
%显示重建后的图像
f=rgb2hsi(f);
f=hsi2rgb(f);
A=im2double(ff);
B=f;
C=imsubtract(A,B); %进行图像减法
subplot(1,3,1),imshow(A),title('r/g/b分量滤波后图'); %显示原图像
subplot(1,3,2),imshow(B),title('I分量滤波后的rgb图'); %显示原图像
subplot(1,3,3),imshow(C),title('减法');
实验结果:
(2)用函数imfilter()直接对彩色图像进行平滑滤波并显示(参数:使用像素的平均滤波器;’replicate’);
实验代码:
%彩色图像空间滤波
clc;
clear all;
close all;
f=imread('E:\实验六\peppers.png'); %加载彩色图像
w = fspecial('average', 25);
f=imfilter(f,w,'replicate');
imshow(f);
实验结果:
(3)用拉普拉斯滤波器模板([1 1 1;1 -8 1;1 1 1])对彩色图像进行锐化处理并显示(参数:’replicate’);
实验代码:
%彩色图像空间滤波
clc;
clear all;
close all;
f=imread('E:\实验六\peppers.png'); %加载彩色图像
m=[1 1 1;1 -8 1;1 1 1];
%w = fspecial('laplacian', 0);
f=imfilter(f,m,'replicate');
imshow(f);
实验结果:
(4)显示采用几种方式进行空间滤波后的彩色图像,并比较分析原始图像和几种不同方式滤波的结果。
实验代码:
%彩色图像空间滤波
clc;
clear all;
close all;
f=imread('E:\实验六\peppers.png'); %加载彩色图像
r1=[ -1 0 1;-2 0 2;-1 0 1];
f1=imfilter(f,r1,'replicate');
subplot(1,2,1),imshow(f1),title('sobel');
r1=[-1 0;0 1];
r2=[0 -1;1 0];
I1=imfilter(f,r1);
I2=imfilter(f,r2);
f2=(abs(I1)+abs(I2));
subplot(1,2,2),imshow(f2),title('robert');
实验结果:
4. 彩色图像边缘检测:
(1)利用边缘检测函数edge ()对彩色图像(flower.tif)进行边缘检测,检测算子分别选择'roberts'、'sobel'、'prewitt'(其他参数选择:default)。
实验代码:
%彩色图像空间滤波
clc;
clear all;
close all;
f=imread('E:\实验六\flower.tif'); %加载彩色图像
I=double(f(:,:,1));
I1=edge(I,'sobel');
I2=edge(I,'roberts');
I3=edge(I,'prewitt');
figure;
subplot(2,2,1),imshow(f),title('原图');
subplot(2,2,2),imshow(I1),title('sobel算子边缘检测图');
subplot(2,2,3),imshow(I2),title('roberts算子边缘检测图');
subplot(2,2,4),imshow(I3),title('prewitt算子边缘检测图');
实验结果:
(2)将图像(Fig0630(a).tif)从RGB空间转化到HSI空间,分解得到H,S,I各个分量的图像。对H分量采用合适的阈值(最大色调的10%,可以尝试不同值,观测分割的结果)将H分量图转化成二值图像(B),将二值图像与H分量图相乘(C),观测相乘后所得到的的图(C图)的直方图,找到合适的阈值(参考值为0.9)将C图进行二值化,分割出图像中感兴趣区域。.
实验代码:
%彩色图像空间滤波
clc;
clear all;
close all;
f=imread('E:\实验六\Fig0630(a).tif'); %加载彩色图像
subplot(3,3,1),imshow(f),title('原图');
hsi=rgb2hsi(f);
subplot(3,3,2),imshow(hsi),title('hsi');
H =hsi(:, :, 1) * 2 * pi;
subplot(3,3,3),imshow(H),title('H');
S = hsi(:, :, 2);
subplot(3,3,4),imshow(S),title('S');
I = hsi(:, :, 3);
subplot(3,3,5),imshow(I),title('I');
H1=0.1*H;
B=im2bw(H1);
subplot(3,3,6),imshow(B),title('二值');
C=immultiply(H,B);
subplot(3,3,7),imshow(C),title('相乘');
subplot(3,3,8),imhist(C),title('直方图');
B1=im2bw(C,0.9);
subplot(3,3,9),imshow(B1),title('阈值0.9二值化');
实验结果:
三、 问题与讨论
- 怎样将彩色图像转换到灰度图像?
答:rgb2gray(RGB);
- 彩色图像和灰度图像处理上有何不同?
答:彩色图像在进行图像处理时,有的操作不能直接进行,或是转换为灰度或是转换为二维。
3.如何实现彩色图像的空间滤波?
答:可以用edge()函数,也可以用imfilter()函数对彩色图像选择合适的算子进行空间滤波。
四、总结
1.实验收获(即通过实验学会了什么)
通过实验,我了解了各种颜色空间的转换以及实现彩色图像的平滑和锐化。
对matlab彩色图像的各种处理函数也有了进一步的认识。
2.实验不足(即通过实验发现哪些方面还没有掌握)
实验过程中对hsi2rgb这些函数的具体实现有些困难,感觉自己对它的原理的掌握还是有些欠缺和不足,这方面待改进。