一、实验目的:
(1)进一步掌握图像处理工具Matlab,熟悉基于Matlab的图像处理函数。
(2)掌握各种图像增强方法。
二、实验原理(略)
三、实验步骤(包括分析、代码和波形)
首先来看看这个实验的内容。
1.打开一幅彩色图像Image1,使用Matlab图像处理函数,对其进行下列变换:
(1)将Image1灰度化为gray,统计并显示其灰度直方图;
(2)对gray进行分段线性变换;
(3)对gray进行直方图均衡化;
(4)对gray进行伪彩色增强;
(5)对gray添加噪声并平滑;
(6)对gray利用Sobel算子锐化;
(7)实验要求中的拓展内容。
实验的思路是很明确的,结合原理中的讨论,我们只要按照题目的要求依据参考代码、查看运行并进行验证就可以了,不需要计算。
**下面是第(1)小题的代码。**该部分将Image1灰度化为gray,统计并显示其灰度直方图;
Image1=im2double(imread('fj.jpg'));
gray=rgb2gray(Image1);
imhist(gray);
[h,w]=size(gray);
NewImage1=zeros(h,w);
a=80/256; b=180/256; c=30/256; d=220/256;
for x=1:w
for y=1:h
if gray(y,x)<a
NewImage1(y,x)=gray(y,x)*c/a;
elseif gray(y,x)<b
NewImage1(y,x)=(gray(y,x)-a)*(d-c)/(b-a)+c;
else
NewImage1(y,x)=(gray(y,x)-b)*(255-d)/(255-b)+d;
end
end
end
figure,imshow(NewImage1),title('分段线性变换');
得到的灰度直方图如下图:
**下面是第(2)小题的代码。**对gray进行分段线性变换
Image1=im2double(imread('fj.jpg'));
gray=rgb2gray(Image1);
imhist(gray);
[h,w]=size(gray);
NewImage1=zeros(h,w);
a=80/256; b=180/256; c=30/256; d=220/256;
for x=1:w
for y=1:h
if gray(y,x)<a
NewImage1(y,x)=gray(y,x)*c/a;
elseif gray(y,x)<b
NewImage1(y,x)=(gray(y,x)-a)*(d-c)/(b-a)+c;
else
NewImage1(y,x)=(gray(y,x)-b)*(255-d)/(255-b)+d;
end
end
end
figure,imshow(NewImage1),title('分段线性变换');
**下面是第(3)小题的代码。**对gray进行直方图均衡化;
NewImage2=histeq(gray);
figure,imshow(NewImage2),title('直方图均衡化');
**下面是第(4)小题的代码。**对gray进行伪彩色增强
NewImage3=zeros(h,w,3);
for x=1:w
for y=1:h
if gray(y,x)<64/256
NewImage3(y,x,1)=0;
NewImage3(y,x,2)=4*gray(y,x);
NewImage3(y,x,3)=1;
elseif gray(y,x)<128/256
NewImage3(y,x,1)=0;
NewImage3(y,x,2)=1;
NewImage3(y,x,3)=2-4*gray(y,x);
elseif gray(y,x)<192/256
NewImage3(y,x,1)=4*gray(y,x)-2;
NewImage3(y,x,2)=1;
NewImage3(y,x,3)=0;
else
NewImage3(y,x,1)=1;
NewImage3(y,x,2)=4-4*gray(y,x);
NewImage3(y,x,3)=0;
end
end
end
figure,imshow(NewImage3);
**下面是第(5)小题的代码。**对gray添加噪声并平滑
noiseIsp=imnoise(gray,'salt & pepper',0.1);
noiseIg=imnoise(gray,'gaussian');
result1=medfilt2(noiseIsp);
result2=medfilt2(noiseIg);
figure;
subplot(121),imshow(result1),title('椒盐噪声3×3中值滤波');
subplot(122),imshow(result2),title('高斯噪声3×3中值滤波');
下面是第(6)小题的代码。该部要求对gray利用Sobel算子锐化
H1=[-1 -2 -1;0 0 0;1 2 1];
H2=[-1 0 1;-2 0 2;-1 0 1];
R1=imfilter(gray,H1);
R2=imfilter(gray,H2);
edgeImage=abs(R1)+abs(R2);
sharpImage=gray+edgeImage;
figure;
subplot(121),imshow(edgeImage),title('Sobel梯度图像');
subplot(122),imshow(sharpImage),title('Sobel锐化图像');
2.实验要求中的拓展内容
(1)对以上处理变换参数,查看处理效果;
(2)更改伪彩色增强方法为热金属编码或彩虹编码;
(3)设计不同的平滑滤波、锐化滤波方法,查看处理效果;
(4)自行设计方法,实现对彩色图像增强处理。
下面是拓展第(1)小题的代码。处理变换参数,查看处理效果
(略,可参考上一部分代码,由于太多了,就不重复放上来了)
下面是拓展第(2)小题的代码。该小题要求更改伪彩色增强方法为热金属编码或彩虹编码。
彩虹编码:
Image1=imread('lotus.bmp');
%转换为灰度
gray=rgb2gray(Image1);
[h,w]=size(gray);
%新图像的矩阵
NewImage3=zeros(h,w,3);
for x=1:h
for y=1:w
if gray(x,y)<96
NewImage3(x,y,1)=0;
elseif gray(x,y)<128
NewImage3(x,y,1)=255*(gray(x,y)-96)/32;
else
NewImage3(x,y,1)=255;
end
end
end
for x=1:h
for y=1:w
if gray(x,y)<32
NewImage3(x,y,2)=0;
elseif gray(x,y)<64
NewImage3(x,y,2)=255*(gray(x,y)-32)/32;
elseif gray(x,y)<128
NewImage3(x,y,2)=255;
elseif gray(x,y)<192
NewImage3(x,y,2)=255*(192-gray(x,y))/64;
else
NewImage3(x,y,2)=255*(gray(x,y)-192)/64;
end
end
end
for x=1:h
for y=1:w
if gray(x,y)<32
NewImage3(x,y,3)=255*gray(x,y)/32;
elseif gray(x,y)<64
NewImage3(x,y,3)=255;
elseif gray(x,y)<96
NewImage3(x,y,3)=255*(96-gray(x,y))/32;
elseif gray(x,y)<192
NewImage3(x,y,3)=0;
else
NewImage3(x,y,3)=255*(gray(x,y)-192)/64;
end
end
end
imshow(NewImage3),title('彩虹编码')
下面是拓展第(3)小题的代码。该小题设计不同的平滑滤波、锐化滤波方法,查看处理效果。
1.基于Robert交叉梯度的图像锐化:
I = imread('fj.jpg');
imshow(I);
I = double(I); % 转换为double型,这样可以保存负值,否则uint8型会把负值截掉
w1 = [-1 0; 0 1]
w2 = [0 -1; 1 0]
G1 = imfilter(I, w1, 'corr', 'replicate'); % 以重复方式填充边界
G2 = imfilter(I, w2, 'corr', 'replicate');
G = abs(G1) + abs(G2); % 计算Robert梯度
figure, imshow(G, []);
figure, imshow(abs(G1), []);
figure, imshow(abs(G2), []);
2. 平滑滤波代码
I = imread('fj.jpg');
J1=imnoise(I,'salt & pepper',0.02); %加均值为0,方差为0.02的椒盐噪声
J2=imnoise(I,'gaussian',0.02); %加均值为0,方差为0.02的高斯噪声。
g1=rgb2gray(J1);
g2=rgb2gray(J2);
figure('units','normalized','position',[0 0 1 1]);
subplot(2,4,1),imshow(J1),xlabel('椒盐噪声'); %显示有椒盐噪声图像
subplot(2,4,2),imshow(J2),xlabel('高斯噪声'); %显示有高斯噪声图像
% % 邻域平均法 neighborhood averaging
% imfilter 可进行多维图像(RGB等)进行空间滤波,且可选参数较多
% filter2 / medfilt2 只能对二维图像(灰度图)进行空间滤波,
% 两个函数结果类型不一样,只需要在I1=filter2(h,I)后面加上I1=uint8(I1)进行类型转换,结果就是一样的。
K1 = filter2(fspecial('average',3),g1); % 对椒盐噪声进行 3*3 模板平滑滤波
K2 = filter2(fspecial('average',11),g1);
k3 = imfilter(I,fspecial('average',3),'replicate');
K4 = filter2(fspecial('average',3),g2); % 对高斯噪声进行 3*3 模板平滑滤波
subplot(2,4,3),imshow(uint8(K1)),xlabel({'对椒盐噪声进行';'3*3 模板平滑滤波'});
subplot(2,4,4),imshow(uint8(K1)),xlabel({'对椒盐噪声进行';'11*11 模板平滑滤波'});
subplot(2,4,5),imshow(k3),xlabel('3*3 imfilter空间滤波');
subplot(2,4,6),imshow(uint8(K4)),xlabel('对高斯噪声进行 3*3 模板平滑滤波');
% 中值滤波
I1= medfilt2(g1,[3,3]); % 对有椒盐噪声图像进行5×5方形窗口中值滤波
I2= medfilt2(g2,[3,3]); % 对有高斯噪声图像进行5×5方形窗口中值滤波
subplot(2,4,7),imshow(I1),xlabel({'椒盐噪声进行';'3*3 中值滤波'});
subplot(2,4,8),imshow(I2),xlabel({'高斯噪声进行';'3*3 中值滤波'});
(平滑滤波)
**下面是拓展第(4)小题的代码。**自行设计方法,实现对彩色图像增强处理。
对RGB图像直接线性变换进行彩色增强
clear;clc;
rgb = imread('fj.jpg');
[o p q]=size(rgb);
r(:,:,1)=rgb(:,:,1);
r(:,:,2)=zeros(o,p);
r(:,:,3)=zeros(o,p);
r=r*1.4;
g(:,:,2)=rgb(:,:,2);
g(:,:,1)=zeros(o,p);
g(:,:,3)=zeros(o,p);
g=g*1.4;
b(:,:,3)=rgb(:,:,3);
b(:,:,2)=zeros(o,p);
b(:,:,1)=zeros(o,p);
b=b*1.4;
rgb_new(:,:,1)=r(:,:,1);
rgb_new(:,:,2)=g(:,:,2);
rgb_new(:,:,3)=b(:,:,3);
figure;
subplot(121);imshow(rgb);title('原始rgb图像');
%subplot(231);imshow(r);title('红色分量图像');
%subplot(232);imshow(g);title('绿色分量图像');
%subplot(233);imshow(b);title('蓝色分量图像');
subplot(122);imshow(rgb_new);title('增强后rgb图像');
四、实验总结
进一步掌握图像处理工具Matlab,熟悉基于Matlab的图像处理函数。通过实验深入了解了掌握各种图像增强方法,例如掌握了将Image1灰度化为gray,统计并显示其灰度直方图;对gray进行分段线性变换;对gray进行直方图均衡化;对gray进行伪彩色增强;对gray添加噪声并平滑;对gray利用Sobel算子锐化方法等内容,为接下来的学习进一步打下了基础。