彩色图像处理

一、 实验目的

1.掌握常见的几种颜色模型及各种颜色空间的转换。

2.掌握彩色图像的空间滤波,实现彩色图像的平滑和锐化。

3.采用MATLAB函数和编程实现彩色图像的处理。

 

二、实验内容和步骤

1.彩色图像的表显示:

1生成一幅如图1RGB图像(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分量及改变后合成的真彩色图像,R10.1RG1=0.3GB1=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分量;

第一组:H10.5HS1=SI=I

第二组:H2HS2=0.5SI=I

第三组:H3HS3=SI3=0.5I

第四组:H30.5HS3=0.5SI3=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)进行不同空间分解并滤波:

1RGB空间分解,并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 11 -8 11 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二值化');

 

 

实验结果:

 

 

 

 

 

三、 问题与讨论

  1. 怎样将彩色图像转换到灰度图像?

答:rgb2gray(RGB);

  1. 彩色图像和灰度图像处理上有何不同?

答:彩色图像在进行图像处理时,有的操作不能直接进行,或是转换为灰度或是转换为二维。

3.如何实现彩色图像的空间滤波?

答:可以用edge()函数,也可以用imfilter()函数对彩色图像选择合适的算子进行空间滤波。

四、总结

1.实验收获(即通过实验学会了什么)

通过实验,我了解了各种颜色空间的转换以及实现彩色图像的平滑和锐化

matlab彩色图像的各种处理函数也有了进一步的认识。

2.实验不足(即通过实验发现哪些方面还没有掌握)

实验过程中对hsi2rgb这些函数的具体实现有些困难,感觉自己对它的原理的掌握还是有些欠缺和不足,这方面待改进。

 

posted @ 2022-12-06 20:37  安良  阅读(864)  评论(0)    收藏  举报