代码1 使用盲区卷积估计点扩散函数
代码
%% 例5.11 盲去卷积 估计PSF deconvblind
clc % 清屏操作,清除命令窗口中的输出。
clear % 清除内存中所有变量,释放内存空间。
PSF = fspecial('gaussian',7,10); % 创建一个高斯核作为原始PSF(点扩散函数)。
imshow(pixeldup(PSF,73),[]); % 显示放大后的PSF图像,使用pixeldup函数放大图像。
title('原始PSF图像'); % 图像标题。
f = checkerboard(8); % 创建一个8x8的棋盘格图像。
SD = 0.01; % 定义高斯噪声的标准差。
g = imnoise(imfilter(f,PSF),'gaussian',0,SD^2); % 对棋盘格图像应用PSF并进行高斯噪声处理。
INITPSF = ones(size(PSF)); % 初始化PSF,创建一个与原始PSF同样大小的全1矩阵。
DAMPAR = 10*SD; % 定义去卷积过程中的阻尼参数。
LIM = ceil(size(PSF,1)/2); % 计算PSF尺寸的一半,向上取整。
WEIGHT = zeros(size(g)); % 创建一个与噪声图像同样大小的全0权重矩阵。
WEIGHT(LIM + 1:end - LIM, LIM + 1:end - LIM) = 1; % 在权重矩阵的中心区域赋值为1。
figure % 创建一个新的图形窗口。
NUMIT = 5; % 设置迭代次数为5。
[fr PSFe] = deconvblind(g,INITPSF,NUMIT,DAMPAR,WEIGHT); % 使用盲去卷积估计PSF。
imshow(pixeldup(PSFe,73),[]); % 显示放大后的估计PSF图像。
title('使用盲去卷积估计PSF迭代5次后的结果'); % 图像标题。
figure % 创建另一个新的图形窗口。
NUMIT = 10; % 设置迭代次数为10。
[fr PSFe] = deconvblind(g,INITPSF,NUMIT,DAMPAR,WEIGHT); % 再次使用盲去卷积估计PSF。
imshow(pixeldup(PSFe,73),[]); % 显示放大后的估计PSF图像。
title('使用盲去卷积估计PSF迭代10次后的结果'); % 图像标题。
figure % 创建另一个新的图形窗口。
NUMIT = 20; % 设置迭代次数为20。
[fr PSFe] = deconvblind(g,INITPSF,NUMIT,DAMPAR,WEIGHT); % 再次使用盲去卷积估计PSF。
imshow(pixeldup(PSFe,73),[]); % 显示放大后的估计PSF图像。
title('使用盲去卷积估计PSF迭代20次后的结果'); % 图像标题。
figure % 创建另一个新的图形窗口。
NUMIT = 50; % 设置迭代次数为50。
[fr PSFe] = deconvblind(g,INITPSF,NUMIT,DAMPAR,WEIGHT); % 再次使用盲去卷积估计PSF。
imshow(pixeldup(PSFe,73),[]); % 显示放大后的估计PSF图像。
title('使用盲去卷积估计PSF迭代50次后的结果'); % 图像标题。
重要函数
imshow 展示图像
checkerboard(X) 创建x*x大小的棋牌盘
deconvblind(加噪图像,矩阵,迭代次数,阻尼系数,权重) 使用盲区卷积估计PSF
figure 展示一个窗口
fspecial(‘核函数名字’,7,10)创建一个核函数矩阵
思路
-
初始化:
- 清除命令窗口输出和内存中的所有变量。
- 创建一个高斯核作为原始的点扩散函数(PSF)。
- 显示原始PSF的图像。
-
创建模糊图像:
- 创建一个8x8的棋盘格图像。
- 使用
imfilter
函数将PSF应用到棋盘格图像上,模拟出模糊图像。 - 对模糊图像添加高斯噪声。
-
设置去卷积参数:
- 初始化PSF为一个全1的矩阵,与原始PSF的大小相同。
- 定义去卷积过程中的阻尼参数。
- 创建一个与噪声图像同样大小的权重矩阵,中心区域赋值为1,其他区域为0。
-
盲去卷积估计PSF:
- 设置迭代次数为5次,并使用
deconvblind
函数进行盲去卷积估计PSF。 - 显示估计后的PSF图像。
- 重复上述步骤,分别将迭代次数设置为10次、20次和50次,观察不同迭代次数对估计结果的影响。
- 设置迭代次数为5次,并使用
-
结果显示:
- 每次迭代后,都会显示估计的PSF图像,并标明迭代次数,以便比较不同迭代次数下的估计效果。
结果展示
代码2 使用maketform
和vistformfwd
函数来创建和可视化不同的仿射变换
clc % 清屏操作,清除命令窗口中的输出。
clear % 清除内存中所有变量,释放内存空间。
T1 = [3 0 0; 0 2 0; 0 0 1];
% 定义一个仿射变换矩阵T1,包含x方向缩放3倍,y方向缩放2倍。
tform1 = maketform('affine',T1);
% 创建一个仿射变换结构tform1。
vistformfwd(tform1,[0 100],[0 100]);
% 可视化变换tform1在x轴[0, 100]和y轴[0, 100]范围内的效果。
T2 = [1 0 0; 0.2 1 0; 0 0 1];
% 定义另一个仿射变换矩阵T2,包含y方向斜切0.2。
tform2 = maketform('affine',T2);
% 创建另一个仿射变换结构tform2。
figure, vistformfwd(tform2,[0 100],[0 100]);
% 在新图形窗口中可视化变换tform2的效果。
Tscale = [1.5 0 0; 0 2 0; 0 0 1];
% 定义缩放变换矩阵Tscale,x方向缩放1.5倍,y方向缩放2倍。
Trotation = [cos(pi/4) sin(pi/4) 0; -sin(pi/4) cos(pi/4) 0; 0 0 1];
% 定义旋转变换矩阵Trotation,旋转45度。
Tshear = [1 0 0; 0.2 1 0; 0 0 1];
% 定义斜切变换矩阵Tshear,y方向斜切0.2。
T3 = Tscale * Trotation * Tshear;
% 将缩放、旋转和斜切变换组合成一个新的仿射变换矩阵T3。
tform3 = maketform('affine',T3);
% 创建组合变换结构tform3。
figure, vistformfwd(tform3,[0 100],[0 100]);
% 在新图形窗口中可视化变换tform3的效果。
重要函数
仿射变换
设置T矩阵[x,y,z] ->使用maketform创建仿射变换结构 参数为vistformfwd('affine',T)->figure展示图形
旋转变换矩阵
这是Tscale矩阵->设置旋转变换矩阵Trotation(使用cos,sin)->设置斜切变换Tshear->最后用T = Tscale*Trotation*Tshear得到最后的仿射矩阵->使用maketform得到放射结构->figure展示图像
结构展示
代码3
clc % 清屏操作,清除命令窗口中的输出。
clear % 清除内存中所有变量,释放内存空间。
f = checkerboard(50); % 创建一个50x50的棋盘格图像。
imshow(f,[]) % 显示原始棋盘格图像。
s = 1; % 设置缩放因子为1(不缩放)。
theta = pi/6; % 设置旋转角度为π/6(30度)。
T = [s*cos(theta) s*sin(theta) 0;... % 创建旋转矩阵。
-s*sin(theta) s*cos(theta) 0;... % 旋转矩阵的第二行。
0 0 1]; % 旋转矩阵的第三行(不包含平移)。
tform = maketform('affine',T); % 创建一个仿射变换结构tform。
g = imtransform(f,tform); % 对图像f应用变换tform,使用默认的双线性插值。
imshow(g,[]) % 显示变换后的图像。
g2 = imtransform(f,tform,'nearest'); % 对图像f应用变换tform,使用最近邻插值。
imshow(g2,[]) % 显示使用最近邻插值变换后的图像。
g3 = imtransform(f,tform,'FillValue',0.5); % 对图像f应用变换tform,使用双线性插值,并将填充值设为0.5。
imshow(g3,[]) % 显示设置填充值后的变换图像。
T2 = [1 0 0; 0 1 0; 50 50 1]; % 创建一个平移矩阵,将图像沿x和y轴各平移50个像素。
tform2 = maketform('affine',T2); % 创建一个平移变换结构tform2。
g4 = imtransform(f,tform2); % 对图像f应用平移变换tform2。
% imshowMy(g4,[]) % 这行代码被注释掉了,因为它会尝试调用一个未定义的函数imshowMy。
g5 = imtransform(f,tform2,'XData',[1 500],'YData',[1 500],... % 对图像f应用平移变换tform2,并指定输出图像的大小为500x500像素。
'FillValue',0.5); % 使用填充值0.5。
imshow(g5,[]) % 显示设置输出大小和填充值后的变换图像。
重要函数
checherboard 创建棋盘格
T 创建一个旋转矩阵
maketform 创建一个仿射变换结构 maketform('affine',T)
imtransform 例:g=imtransform(f,tform) 对f图像使用变换tform 默认使用双线性插值 nearest使用最近邻插值 fillvalue使用双线性插值
思路
-
初始化:
- 清除命令窗口的输出和内存中的所有变量,为新的操作做好准备。
- 创建一个50x50的棋盘格图像
f
,作为变换的原始图像。
-
显示原始图像:
- 使用
imshow
函数显示原始的棋盘格图像。
- 使用
-
旋转图像:
- 定义旋转角度
theta
(π/6,即30度)和缩放因子s
(1,即不缩放)。 - 创建一个旋转矩阵
T
,用于描述图像的旋转变换。 - 使用
maketform
函数创建一个仿射变换结构tform
。 - 应用
imtransform
函数对图像f
进行旋转变换,使用默认的双线性插值方法。 - 显示旋转后的图像。
- 定义旋转角度
-
使用不同的插值方法:
- 使用
imtransform
函数再次对图像f
进行旋转变换,但这次指定使用最近邻插值方法。 - 显示使用最近邻插值变换后的图像。
- 使用
-
设置填充值:
- 使用
imtransform
函数对图像f
进行旋转变换,指定双线性插值,并将填充值设为0.5。 - 显示设置填充值后的变换图像。
- 使用
-
平移图像:
- 创建一个平移矩阵
T2
,用于描述图像的平移变换(沿x和y轴各平移50个像素)。 - 使用
maketform
函数创建一个平移变换结构tform2
。 - 应用
imtransform
函数对图像f
进行平移变换。 - 显示平移后的图像。
- 创建一个平移矩阵
-
设置输出图像大小和填充值:
- 使用
imtransform
函数对图像f
进行平移变换,同时指定输出图像的大小为500x500像素,并设置填充值为0.5。 - 显示设置输出大小和填充值后的变换图像
- 使用