给出下面代码的注释clc ;clear all;close all; p64int=imread('lena.tif'); %load p64int.txt; [m,n]=size(p64int); winsize=input('Blur operator window size (an odd number, default = 9):'); if isempty(winsize),winsize=9; elseif rem(winsize,2)==0, winsize=winsize+1; disp(['Use odd number for window size= ' int2str(winsize)]) end disp(['1. Linear motion blur;']) chos=input('Enter a number to choose type of blur applied (default=1):') if isempty(chos), chos=1;end if chos==1 dirangle=input('Bluring direction (an angle in degree,default=45)='); if isempty(dirangle) dirangle=45; end h=motionblur(dirangle,winsize); end f=fft2(p64int); Hmat=fft2(h,512,512); Gmat=f.*Hmat; g=ifft2(Gmat); figure(1), subplot(1,2,1),imagesc(p64int),colormap('gray'),title('original image') subplot(1,2,2),imagesc(abs(g)),colormap('gray'),title('blurred image') figure(2), subplot(2,1,2),imagesc(log(1+abs(Gmat))),colormap('gray'),title('blurring filter') subplot(2,1,1),imagesc(h),colormap('gray'),title('blurring filter mask') function h=motionblur(dirangle,winsize) if nargin<2 winsize=9; end h=zeros(winsize);%lvboqi chuangkou daxiao ext=(winsize-1)/2; if (abs(abs(dirangle)-90)>=45) && (abs(abs(dirangle)-270)>=45) slope=tan(dirangle*pi/180); rloc=round(slope*[-ext:ext]); for i=1:winsize h(ext-rloc(i)+1,i)=1; end else slope=cot(dirangle*pi/180); cloc=round(slope*[-ext:ext]); for i=1:winsize h(i,ext-cloc(i)+1)=1; end end end
时间: 2023-09-08 15:17:32 浏览: 149
这段代码实现了对图像进行线性模糊处理,并输出处理后的图像以及滤波器的功能。具体注释如下:
1. 加载图像lena.tif,并获取其大小。
```
p64int=imread('lena.tif');
[m,n]=size(p64int);
```
2. 获取用户输入的模糊操作窗口大小winsize,并判断其是否为奇数。如果winsize为空,则设置默认值为9;如果winsize为偶数,则加1,并输出提示信息。
```
winsize=input('Blur operator window size (an odd number, default = 9):');
if isempty(winsize)
winsize=9;
elseif rem(winsize,2)==0,
winsize=winsize+1;
disp(['Use odd number for window size= ' int2str(winsize)])
end
```
3. 获取用户输入的操作类型chos,默认为1。如果chos为空,则设置默认值为1。
```
disp(['1. Linear motion blur;'])
chos=input('Enter a number to choose type of blur applied (default=1):')
if isempty(chos), chos=1;end
```
4. 如果操作类型为1,则获取用户输入的模糊方向dirangle,默认为45度。如果dirangle为空,则设置默认值为45度。根据dirangle和winsize,调用motionblur函数生成线性模糊滤波器h。
```
if chos==1
dirangle=input('Bluring direction (an angle in degree,default=45)=');
if isempty(dirangle)
dirangle=45;
end
h=motionblur(dirangle,winsize);
end
```
5. 对原始图像进行二维傅里叶变换(fft2函数),并将生成的滤波器h进行二维傅里叶变换,同时将其大小扩展为512x512,以便于与原始图像进行频域滤波。将两个变换后的矩阵f和Hmat相乘,得到模糊后的图像Gmat,再通过反二维傅里叶变换(ifft2函数),得到最终的模糊图像g。
```
f=fft2(p64int);
Hmat=fft2(h,512,512);
Gmat=f.*Hmat;
g=ifft2(Gmat);
```
6. 使用subplot和imagesc函数将原始图像和模糊图像、滤波器显示在两个窗口中,以便于观察和比较。
```
figure(1), subplot(1,2,1),imagesc(p64int),colormap('gray'),title('original image')
subplot(1,2,2),imagesc(abs(g)),colormap('gray'),title('blurred image')
figure(2), subplot(2,1,2),imagesc(log(1+abs(Gmat))),colormap('gray'),title('blurring filter')
subplot(2,1,1),imagesc(h),colormap('gray'),title('blurring filter mask')
```
7. 定义函数motionblur,用于生成线性模糊滤波器h。如果winsize为空,则设置默认值为9。初始化滤波器矩阵h,并计算窗口大小的一半ext。根据dirangle的值,分别计算斜率slope和像素点的位置rloc或cloc,并将对应像素点置为1。
```
function h=motionblur(dirangle,winsize)
if nargin<2
winsize=9;
end
h=zeros(winsize);%lvboqi chuangkou daxiao
ext=(winsize-1)/2;
if (abs(abs(dirangle)-90)>=45) && (abs(abs(dirangle)-270)>=45)
slope=tan(dirangle*pi/180);
rloc=round(slope*[-ext:ext]);
for i=1:winsize
h(ext-rloc(i)+1,i)=1;
end
else
slope=cot(dirangle*pi/180);
cloc=round(slope*[-ext:ext]);
for i=1:winsize
h(i,ext-cloc(i)+1)=1;
end
end
end
```
阅读全文