数字图像处理matlab实验

一、对图像文件分别进行灰度线性变换、直方图、直方图均衡化操作
rgb=imread(‘lena.bmp’);
gray1=rgb2gray(rgb); % 色彩转换成灰度
a=0.5; b=150; % 可根据实际需要进行改变
gray2=a*gray1+b;
figure(1)
subplot(1,2,1),imshow(gray1,[]),title(‘原图’);
subplot(1,2,2),imshow(gray2,[]),title(‘线性变换’);
figure(2)
subplot(3,2,1); imshow(gray1); title(‘原图’);
subplot(3,2,2); imhist(gray1); title(‘原图直方图’);
subplot(3,2,3);
H1=adapthisteq(gray1);
imshow(H1); title(‘adapthisteq均衡后图’);
subplot(3,2,4);
imhist(H1);title(‘adapthisteq均衡后直方图’);
subplot(3,2,5);
H2=histeq(gray1);
imshow(H2); title(‘histeq均衡后图’);
subplot(3,2,6);
imhist(H1); title(‘histeq均衡后直方图’);

二、对图像文件分别进行平移、垂直镜像变换、水平镜像变换、缩放和旋转操作。
clc
clear all
close all
A=imread(‘lena.bmp’);
[height,width,dim]=size(A);
tform=maketform(‘affine’,[-1 0 0; 0 1 0;width 0 1]); %定义水平镜像变换矩阵
B=imtransform(A,tform,‘nearest’);%%%‘nearest’:插值方式
tform2=maketform(‘affine’,[1 0 0; 0 -1 0;0 height 1]); %定义竖直镜像变换矩阵
C=imtransform(A,tform2,‘nearest’);
figure(2)
subplot(1,3,1),imshow(A),title(‘原图’);
subplot(1,3,2),imshow(B),title(‘水平镜像’);
subplot(1,3,3),imshow©,title(‘垂直镜像’);
j=imrotate(A,30);%图像旋转30度
k=imresize(A,2);%图像放大两倍
t=imresize(A,2,‘bilinear’);%采用双线性插值法进行放大两倍
m=imresize(A,0.8);%图像缩小到0.8倍
p=translate(strel(1),[25 25]);%图像平移
img=imdilate(A,p);
figure(3);
subplot(2,3,1),
imshow(A);
title(‘原图’);
subplot(2,3,2),
imshow(j);
title(‘旋转’);
subplot(2,3,3)
imshow(k);
title(‘放大’);
subplot(2,3,4)
imshow(t);
title(‘双线性插值’);
subplot(2,3,5)
imshow(m);
title(‘缩小’);
figure(1);
imshow(img);
title(‘平移’);

三、1、对图像文件分别进行均值滤波、中值滤波和拉普拉斯锐化操作;添加噪声,重复上述过程观察处理结果。
2、编写代码完成罗伯特算子、soble算子等不同的图像锐化,对其进行比较
clc
A1=imread(‘lena.bmp’); %读入图像
A=rgb2gray(A1);
%平均滤波(滑动窗口)
b1=fspecial(‘average’,3);%生成滤波算子
B1=imfilter(A,b1);
B2=medfilt2(A); %中值滤波
AA=double(A);
w1=[0 1 0; 1 -4 1; 0 1 0];
B3=imfilter(AA,w1,‘corr’,‘replicate’); %拉普拉斯锐化滤波,在滤波过程中使用相关;图像大小通过复制外边界的值来扩展,以此来处理边界充零问题
AAA=imnoise(A,‘salt & pepper’,0.25); %加噪声
C1=imfilter(AAA,b1);
C2=medfilt2(AAA);
C3=imfilter(double(AAA),w1,‘corr’,‘replicate’);

figure(1),
subplot(2,5,1),imshow(A),title(‘原图’);
subplot(2,5,2),imshow(B1),title(‘均值滤波’);
subplot(2,5,3),imshow(B2),title(‘中值滤波’);
subplot(2,5,4),imshow(B3,[]),title(‘拉普斯锐化’);
subplot(2,5,5),imshow(AA-B3,[]),title(‘锐化后图像’);
subplot(2,5,6),imshow(AAA),title(‘加噪声’);
subplot(2,5,7),imshow(C1),title(‘均值滤波’);
subplot(2,5,8),imshow(C2),title(‘中值滤波’);
subplot(2,5,9),imshow(C3,[]),title(‘拉普斯锐化’);

A2=A1;
A3=A1;

[m,n]=size(A1);
figure,imshow(A1);
A1=double(A1);
b=zeros(m,n);
c=zeros(m,n);
for i=1:m-2
for j=1:n-2
b(i+1,j+1)=A1(i,j)-A1(i+1,j+1);
c(i+1,j+1)=A1(i,j+1)-A1(i+1,j);
b(i+1,j+1)=sqrt(b(i+1,j+1)2+c(i+1,j+1)2)+100;
end
end
figure(2);imshow(uint8(b)),title(‘Roberts’);

[m,n]=size(A2);
figure,imshow(A2);
A2=double(A2);
b=zeros(m,n);
c=zeros(m,n);
for i=1:m-2
for j=1:n-2
b(i+1,j+1)=-A2(i,j)-A2(i+1,j)-A2(i+2,j+2)+A2(i,j+2)+A2(i+1,j+2)+A2(i+2,j+2);
c(i+1,j+1)=A2(i,j)+A2(i,j+1)+A2(i,j+2)-A2(i+2,j)-A2(i+2,j+1)-A2(i+2,j+2);
b(i+1,j+1)=sqrt(b(i+1,j+1)2+c(i+1,j+1)2)+100;
%这儿处理有两种方式,绝对值和统一加一个数,不同的处理会得到不同的效果
%if b(i+1,j+1)<0
% b(i+1,j+1)=-b(i+1,j+1);
%end
end
end
figure(3);imshow(uint8(b)),title(‘priwitt’);

[m,n] = size(A3); % 得到图像的大小
new_img_gray = A3; % 新建一个一样大的图像
pxValue = 0; % roberts计算所得到的像素值

% 对边界象素操作
for threshold_value=5:5:90
for i=1:m-1
for j=1:n-1
pxValue = abs(A3(i,j)-A3(i+1,j+1))+…
abs(A3(i+1,j)-A3(i,j+1));
if(pxValue > threshold_value)
new_img_gray(i,j) = 255;
else
new_img_gray(i,j) = 0;
end
end
end
figure(4)
subplot(3,6,threshold_value/5);
imshow(new_img_gray);
title([‘soble’,num2str(threshold_value)])
end

四、启动MATLAB程序,对图像文件分别进行二维Fourier变换,将其幅度谱进行搬移,在图像中心显示,并评价人眼对图像幅频特性和相频特性的敏感度。
编写代码实现由频谱重建原图像、幅度谱重建图像和相位谱重建图像
I=imread(‘lena.bmp’);
I1=rgb2gray(I);
fftI=fft2(I1);%二维离散傅立叶变换
sfftI=fftshift(fftI);%直流分量移到频谱中心
RR=real(sfftI);%取傅立叶变换的实部
II=imag(sfftI); %取傅立叶变换的虚部
A=sqrt(RR.2+II.2); %计算频谱幅值
B=(A-min(min(A)))./(max(max(A))-min(min(A)))*225; %归一化
phA=log(angle(sfftI)180/pi);
figure(1)%设定窗口
subplot(2,2,1),imshow(I1);title(‘原图’);
subplot(2,2,2),imshow(B);title(‘原图像的频谱’); %显示原图像的频谱
subplot(2,2,3),imshow(log(B),[]);title(‘原图像的幅度’); %显示原图像的幅度
subplot(2,2,4),imshow(phA);title(‘原图的相位谱’);
W=abs(ifft2(abs(sfftI).exp(1j(angle(sfftI)))));
w=abs(ifft2(abs(sfftI)));%幅度重构
Q=abs(ifft2(exp(1j
(angle(sfftI)))));
figure(2)
subplot(131),imshow(W,[]);
subplot(132),imshow(w,[]);
subplot(133),imshow(Q,[]);

五、1、编写代码观察频率拉普拉斯滤波器
2、编写代码实现高斯低通滤波器对图像进行处理
3、编写代码实现高斯高通滤波器对图像进行处理
clear
clc
close all
f=imread(‘lena.bmp’);
f=rgb2gray(f);
subplot(1,3,1);imshow(f);title(‘原始图像’)
F=fft2(f); %对图像进行傅立叶变换
F1=fftshift(F);
%对图像进行高斯高通滤波
[M,N]=size(f);
sigma=20;
K=0;
for i=1:M
for j=1:N
g(i,j) = 1 - exp (-(( i-M/2)^ 2+( j-N/2)^ 2)/ 2/ sigma^2)+K;
end
end
figure(1)
subplot(1,3,2);imshow(g);title(‘高斯高通滤波’)
GF=F.*g;
gf=ifft2(GF);
subplot(1,3,3);imshow(gf,[]);title(‘高斯高通滤波图像’)

mask=[0,1,0;1,-4,1;0,1,0];%拉普拉斯滤波模板
C=imfilter(f,mask,‘replicate’);
figure(2),imshow©;title(‘拉普拉斯滤波器’);

d=10
for i=1:M;
for j=1:N
distance=sqrt((i-M/2)2+(j-N/2)2);
if distance<=d
flag=1;
else
flag=0;
end
LF(i,j)=flag*F1(i,j);
end
end
%逆变换转换成对应图像
LF=uint8(real(ifft2(ifftshift(LF))));
figure(3),imshow(LF);
title(‘低通滤波后图像’);

六、1、逆滤波
2、编写代码实现图像的模糊、加噪和维纳滤波复原。
clear
clc
close all
I0=imread(‘456.jpg’);
I0=imresize(rgb2gray(I0),0.25);
figure(1)
subplot(1,3,1);
imshow(I0);title(‘原始图像’);
I=double(I0);
[m,n]=size(I);
F=fftshift(fft2(I));
k=0.00025;
for u=1:m
for v=1:n;
H(u,v)=exp((-k)*(((u-m/2)2+(v-n/2)2)^(5/6)));
end
end
F1=F./H;
I2=ifft2(fftshift(F1));
subplot(1,3,2);
imshow(uint8(I2));title(‘全逆滤波复原图像’);

BanJing=50;
H=ones(size(I0));
for u=(m/2-BanJing):(m/2+BanJing)
for v=(n/2-BanJing):(n/2+BanJing)
H(u,v)=exp((-k)*(((u-m/2)2+(v-n/2)2)^(5/6)));
end
end
F1=F./H;
I2=ifft2(fftshift(F1));
subplot(1,3,3);
imshow(uint8(I2));title(‘限制逆滤波复原图像’);

PSF = fspecial(‘motion’,30,25);
I1= imfilter(I0,PSF,‘conv’,‘circular’);

noise = 0.1*randn(size(I0));%设定一个高斯噪声
Noise = imadd(I1,im2uint8(noise));%对模糊后图像加噪

R1=wiener2(Noise,[10 10]); %未知噪声
R2=wiener2(Noise,[10 10],noise);%已知噪声分布
figure(2)
subplot(2,3,1),imshow(uint8(I0));title(‘原始图像’);
subplot(2,3,2),imshow(uint8(I1));title(‘模糊后图像’);
subplot(2,3,3),imshow(uint8(Noise));title(‘加噪后图像’);
subplot(2,3,4),imshow(uint8(R1));title(‘盲复原’);
subplot(2,3,5),imshow(uint8(R2));title(‘非盲复原’);

七、1)腐蚀、膨胀开闭运算
2)编写代码实现二值图像区域填充:
3)编写代码实现边缘轮廓提取程序:

% rgb=imread(‘source1.bmp’);
% I=rgb2gray(rgb); % 色彩转换成灰度
I=imread(‘source3.bmp’);
level= graythresh(I); %得到合适的阈值 得到合适的阈值
bw= im2bw(I,level); %二值化
SE= strel(‘square’,3); %设置膨胀结构元素
BW1= imdilate(bw,SE); % 膨胀
SE1= strel(‘arbitrary’,eye(5)); %设置腐蚀结构元素
BW2= imerode(bw,SE1); %腐蚀
BW3= bwmorph(bw,‘open’); %开运算
BW4= bwmorph(bw,‘close’); %闭运算
figure(1),
subplot(2,3,1),imshow(I);title(‘原图’);
subplot(2,3,2),imshow(bw);title(‘二值图’);
subplot(2,3,3),imshow(BW1);title(‘膨胀’);
subplot(2,3,4),imshow(BW2);title(‘腐蚀’);
subplot(2,3,5),imshow(BW3);title(‘开运算’);
subplot(2,3,6),imshow(BW4);title(‘闭运算’);
im=imfill(bw,‘holes’);
im1=bwperim(bw);
figure(2)
subplot(121),imshow(im,[]);title(‘二值图填充图’)
subplot(122),imshow(im1,[]);title(‘轮廓提取图’)

八、1)使用Canny、Roberts、Sobel、Prewitt、LoG等算子对灰度图像进行边缘检测:
2)编写代码实现双峰法图像分割
3)编写代码实现Otsu法图像分割

clc
I=double(imread(‘source3.bmp’)); %读入图像
I1 = imread(‘source3.bmp’);
im_median=medfilt2(I);
BW1=edge(I,‘roberts’); % roberts算子
BW2=edge(I,‘prewitt’);
BW3=edge(I,‘sobel’);
BW4=edge(I,‘log’);
BW5= edge(I,‘canny’);
figure(1),
subplot(231),imshow(I,[]);title(‘原图’);
subplot(232),imshow(BW1); title(’ roberts算子’);
subplot(233),imshow(BW2); title(’ prewitt算子’);
subplot(234),imshow(BW3); title(’ sobel算子’);
subplot(235),imshow(BW4); title(’ log算子’);
subplot(236),imshow(BW5); title(’ canny算子’);

if ndims(I1) == 3
I1 = rgb2gray(I1);
end
fxy = imhist(I1, 256); %统计每个灰度值的个数
figure(2);
subplot(2, 2, 1); imshow(I1, []); title(‘原图’)
subplot(2, 2, 2); plot(fxy); %画出灰度直方图
title(‘直方图’)
p = 168;
p = p/255;
bw = im2bw(I1, p); %小于阈值的为黑,大于阈值的为白
subplot(2, 2, 3); imshow(bw); title(‘双峰阈值分割’)
bw1 = im2bw(I1, graythresh(I1));
subplot(2, 2, 4); imshow(bw1); title(‘ostu阈值分割’)

猜你喜欢

转载自blog.csdn.net/t111qqwer/article/details/89644131