%gxy(i,j)=c;
%elseiffxy(i,j)>b
%gxy(i,j)=d;
%end
%gxy(i,j)=(d-c)/(b-a)*(fxy(i,j)-a)+c;
%end
%end
%end
%newimg=uint8(gxy*255);
%****************************************************
end
主程序:
clc
clearall
img0=imread('lena.bmp');
figure
(1)
subplot(211),imshow(img0),title('原灰度图(256x256)')
subplot(212),imhist(img0),title('直方图')
a=0.1;b=0.8
c=0;d=1;
img1=GrayTransfrom(img0,a,b,c,d);
figure
(2)
subplot(211),imshow(img1),title('灰度范围的线性变换')
subplot(212),imhist(img1),title('直方图')
gamma=2;
img2=GrayGamma(img0,gamma);
figure(3);imshow(img2);title('伽马为2校正后')
img3=GrayEqualize(img0);
figure(4);
subplot(211),imshow(img3);title('直方图均衡化后')
subplot(212),imhist(img3);title('直方图')
四:
实验结果:
五:
实验心得
本次实验是对图像处理的深入学习,实验中我们通过直方图伽玛校正对图像进行灰度级修正,均衡化后图比较模糊但是亮度饱和,伽玛校正后更清晰,对比更高
实验三图像的平滑滤波
一:
实验目的:
学习如何对已被噪声污染的图像进行“净化”。
通过平滑处理,对结果图像加以比较,得出自己的实验结论。
二:
实验内容:
编写并调试窗口尺寸为m×m的平滑滤波函数。
编写并调试窗口尺寸为m×m的中值滤波函数。
三:
实验程序:
(1)functionnewimg=AverageFilter(img,m,hi)
%该函数实现的功能为:
用m×m的滤波器模板对oldbuf数组的噪声图像进行线性
%滤波,即用窗口内m×m个像素的平均灰度值来代替图像每个像素点的值,最后结
%果存放在newbuf数组中。
h1=ones(3,3)/9;
h2=[1/101/101/10;
1/101/51/10;
1/101/101/10];
h3=[1/161/81/16;
1/81/41/8;
1/161/81/16];
switch(hi)
case1
h=h1;
case2
h=h2;
case3
h=h3;
otherwise
disp('错误:
hi只能为1,2,3')
end
[M,N]=size(img);
newimg=zeros(M,N);
img=[zeros((m-1)/2,N+(m-1));zeros(M,(m-1)/2),img,zeros(M,(m-1)/2);
zeros((m-1)/2,N+(m-1))];%补零
fori=1:
M
forj=1:
N
buf=img(i:
i+(m-1),j:
j+(m-1)).*h;
newimg(i,j)=sum(buf(:
));
end
end
(2)functionnewimg=MedianFilter(img,m)
%函数的功能为:
把oldbuf数组m×m窗口内的象素值赋给winbuf,然后调用排
%队函数SeekMid(),把该函数在窗口中找到的中值放到newbuf数组中。
[M,N]=size(img);
img=[zeros((m-1)/2,N+(m-1));zeros(M,(m-1)/2),img,zeros(M,(m-1)/2);
zeros((m-1)/2,N+(m-1))];
new=zeros(M,N);
fori=1:
M
forj=1:
N
buf=img(i:
i+(m-1),j:
j+(m-1));
new(i,j)=SeekMid(buf,m);
end
end
newimg=uint8(new);
end
(3)functionmid=SeekMid(winbuf,m)
%winbuf=[312;4622;897];
%m=3;
a=sort(winbuf(:
));%升序排序
mid=a((m^2+1)/2);%取中值
end
主程序:
clc
clearall
im0=imread('lena.bmp');
im0=imnoise(im0,'gaussian',0,0.001);%添加高斯噪声,均值为0,方差为0.001
figure
(1);imshow(im0);title('受高斯噪声污染的原灰度图')
im=double(im0);
im1=AverageFilter(im,3,1);
figure
(2);imshow(im1);title('平滑线性滤波h1');
im2=AverageFilter(im,3,2);
figure(3);imshow(im2);title('平滑线性滤波h2');
im3=AverageFilter(im,3,3);
figure(4);imshow(im3);title('平滑线性滤波h3');
im4=MedianFilter(im,3);
figure(5);imshow(im4);title('中值滤波');
实验结果:
这个实验是上个实验的后续步骤,通过实验一我掌握了一副图像数字化的步骤,通过实验二掌握了对一副图像进行灰度变换的方法和步骤。
本次实验所做的是图像的平滑滤波,涉及到的函数有:
imnoise、imfilter。
Imnoise函数为Matlab中添加噪声的函数,我在程序中使用的噪声类型为:
gaussian(高斯噪声)。
Imfilter函数为Matlab中的滤波器函数
四:
实验结果
实验四图像的锐化处理
一:
实验目的:
学习如何用锐化处理技术来加强图像的目标边界和图像细节,对图像进行梯度算子、拉普拉斯算子、Sobel算子设计,使图像的某些特征(如边缘、轮廓等)得以进一步的增强及突出。
锐化处理技术可以在空间域中进行,也可以在频域中运用高通滤波技术进行处理。
二:
实验内容:
编写Robert梯度滤波函数。
编写Sobel算子滤波函数。
编写拉普拉斯边缘增强滤波函数。
观察频域中用高低通滤波技术对图像进行的平滑和锐化处理。
三:
实验程序:
(1)functionnewimg=ILPFilter(img,D0)
%功能:
对图像进行理想低通滤波处理,D0为截止频率
[M,N]=size(img);
P=2*M;Q=2*N;
img(P,Q)=0;%补零
I=fft2(img);
I=fftshift(I);%中心化
fori=1:
P
forj=1:
Q
d=sqrt((i-P/2)^2+(j-Q/2)^2);
ifd<=D0
H=1;
else
H=0;
end
I(i,j)=I(i,j)*H;
end
end
I=ifftshift(I);
I=ifft2(I);
newimg=uint8(real(I(1:
M,1:
N)));
end
(2)functionnewimg=LapFilter(img)
%该函数实现的功能为:
用拉普拉斯算子对图像进行边缘增强滤波,最后结果存
%放在newimg数组中。
%clc
%clearall
%img=imread('lena.bmp');
%figure
(1),imshow(img),title('原灰度图');
%img=double(img);
[M,N]=size(img);
m=3;
img=[zeros((m-1)/2,N+(m-1));zeros(M,(m-1)/2),img,zeros(M,(m-1)/2);
zeros((m-1)/2,N+(m-1))];%补零
%img=uint8(img);
%figure
(2),imshow(img)
newimg=zeros(M,N);
fori=1:
M
forj=1:
N
buf=img(i,j+1)+img(i+1,j)+img(i+2,j+1)+img(i+1,j+2);
newimg(i,j)=4*img(i+1,j+1)-abs(buf);
end
end
newimg=uint8(newimg);
%figure
(2),imshow(newimg),title('Laplace')
end
(3)functionnewimg=RobFilter(img)
%该函数实现的功能为:
用Robert梯度算法对图像进行锐化处理,最后结果存放
%在newimg数组中。
[M,N]=size(img);
img=[img,zeros(M,1);zeros(1,N+1)];
newimg=zeros(M,N);
fori=1:
M
forj=1:
N
newimg(i,j)=abs(img(i,j)-img(i+1,j+1))+abs(img(i+1,j)-img(i,j+1));
end
end
newimg=uint8(newimg);
end
(4)functionnewimg=SobFilter(img)
%该函数实现的功能为:
用Sobel算子对图像进行锐化滤波,
%最后结果存放在newimg数组中。
%clc
%clearall
%im0=imread('lena.bmp');
%figure
(1),imshow(im0),title('原灰度图');
%img=double(im0);
[M,N]=size(img);
newimg=zeros(M,N);
sx=[-1-2-1;000;121];
sy=[-101;-202;-101];
m=3;
img=[zeros((m-1)/2,N+(m-1));zeros(M,(m-1)/2),img,zeros(M,(m-1)/2);
zeros((m-1)/2,N+(m-1))];%补零
fori=1:
M
forj=1:
N
gx=img(i:
i+(m-1),j:
j+(m-1)).*sx;
gy=img(i:
i+(m-1),j:
j+(m-1)).*sy;
newimg(i,j)=abs(sum(gx(:
)))+abs(sum(gy(:
)));
end
end
newimg=uint8(newimg);
%figure
(2),imshow(newimg)
end
主程序:
clc
clearall
im0=imread('lena.bmp');
figure
(1),imshow(im0),title('原灰度图');
im0=double(im0);
im1=RobFilter(im0);
figure
(2),imshow(im1),title('Robert梯度滤波');
im2=SobFilter(im0);
figure(3),imshow(im2),title('Sobel算子滤波');
im3=LapFilter(im0);
figure(4),imshow(im3),title('拉普拉斯边缘增强');
im4=ILPFilter(im0,100);%理想低通滤波
figure(5),imshow(im4),title('频域法滤波');
四:
实验结果:
本次实验着重图像的边缘处理,其中涉及的函数有:
edge、imfilter。
Edge函数为Matlab中的边缘检测函数,其用法为:
BW = edge(I) 采用I作为它的输入,并返回一个与I相同大小的二值化图像BW,在函数检测到边缘的地方为1。
Imfilter函数为滤波器函数,用法上次实验已经叙述过。
因为Edge函数的输入需要是一个灰度图像或者二值图像,所以先通过Rgb转灰度函数,将图像变为灰度图像,然后通过“Roberts”,“Sobel”算法对图像进行边缘检测,从实验结果的图像中可以看出,Sobel算子在检测丰富信息的图像时,效果更佳。
而在拉普拉斯变换前,给定好了一个模板,进行滤波后能看出,图像的边缘已经更加突出,达到了实验预期的效果
实验五图像的伪彩色处理
一:
实验目的:
学习和掌握伪彩色处理基本方法,将灰度图像转换为多种颜色的彩色图像。
根据图像特点,了解伪彩色处理技术在实际中的应用。
二:
实验内容:
编写密度分割函数,实现灰度图像的伪彩色显示。
编写灰度级彩色变换函数,实现灰度图像的伪彩色显示。
三:
实验程序:
(1)functionnewimg=GrayColor(img)
%该函数实现的功能为:
按密度分割对灰度图像进行伪彩
%色图像处理,最后结果存放在newimg数组中。
[M,N]=size(img);
newimg=zeros(M,N,3);
fori=1:
M
forj=1:
N
ifimg(i,j)<64
newimg(i,j,1)=255;
newimg(i,j,2)=255;
newimg(i,j,3)=0;
elseifimg(i,j)>=64&&img(i,j)<128
newimg(i,j,1)=0;
newimg(i,j,2)=255;
newimg(i,j,3)=255;
elseifimg(i,j)>=128&&img(i,j)<192
newimg(i,j,1)=255;
newimg(i,j,2)=0;
newimg(i,j,3)=255;
elseifimg(i,j)>=192
newimg(i,j,1)=255;
newimg(i,j,2)=0;
newimg(i,j,3)=0;
end
end
end
end
end
end
newimg=uint8(newimg);
end
(2)functionnewimg=GrayColor2(img)
%功能:
灰度级彩色变换
[M,N]=size(img);
newimg=zeros(M,N,3);
fori=1:
M
forj=1:
N
ifimg(i,j)<64
newimg(i,j,1)=0;
newimg(i,j,2)=img(i,j)*4;
newimg(i,j,3)=255;
elseifimg(i,j)>=64&&img(i,j)<128
newimg(i,j,1)=0;
newimg(i,j,2)=255;
newimg(i,j,3)=(img(i,j)-64)/4;
elseifimg(i,j)>=128&&img(i,j)<192
newimg(i,j,1)=(img(i,j)-128)*4;
newimg(i,j,2)=0;
newimg(i,j,3)=0;
elseifimg(i,j)>=192
newimg(i,j,1)=255;
newimg(i,j,2)=(img(i,j)-192)/4;
newimg(i,j,3)=0;
end
end
end
end
end
end
newimg=uint8(newimg);
end
主程序:
clc
clearall
im0=imread('lena.bmp');
figure
(1),imshow(im0),title('原灰度图');
im0=double(im0);
im1=GrayColor(im0);
figure
(2),imshow(im1),title('多灰度伪彩色分割');
im2=GrayColor2(im0);
figure(3),imshow(im2),title('灰度级彩色变换');
四:
实验结果
实验六图像的几何变化
一:
实验目的:
学习和掌握图像几何空间变换和灰度插值的基本方法,对图像进行相应的几何变换操作。
二;实验内容:
编程实现图像的比例缩放。
编程实现图像任意角度的旋转变换。
分别用MATLAB函数提供的三种插值方法实现图像的缩放和旋转。
三:
实验程序:
(1)functionnewimg=GeoRotate(img,theta)
%该函数实现的功能为:
移动滑动条改变图像的旋转角度,对图像进行旋转变换,
%最后结果存放在newimg数组中,theta为旋转角度。
[M,N]=size(img);
i0=round(M/2);j0=round(N/2);
theta=theta/180*pi;
T=[cos(theta)sin(theta)0;-sin(theta)cos(theta)0;001];%旋转矩阵
b=zeros(M,N,2);
for