Matlab 第五章

代码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)创建一个核函数矩阵

思路

  1. 初始化

    • 清除命令窗口输出和内存中的所有变量。
    • 创建一个高斯核作为原始的点扩散函数(PSF)。
    • 显示原始PSF的图像。
  2. 创建模糊图像

    • 创建一个8x8的棋盘格图像。
    • 使用imfilter函数将PSF应用到棋盘格图像上,模拟出模糊图像。
    • 对模糊图像添加高斯噪声。
  3. 设置去卷积参数

    • 初始化PSF为一个全1的矩阵,与原始PSF的大小相同。
    • 定义去卷积过程中的阻尼参数。
    • 创建一个与噪声图像同样大小的权重矩阵,中心区域赋值为1,其他区域为0。
  4. 盲去卷积估计PSF

    • 设置迭代次数为5次,并使用deconvblind函数进行盲去卷积估计PSF。
    • 显示估计后的PSF图像。
    • 重复上述步骤,分别将迭代次数设置为10次、20次和50次,观察不同迭代次数对估计结果的影响。
  5. 结果显示

    • 每次迭代后,都会显示估计的PSF图像,并标明迭代次数,以便比较不同迭代次数下的估计效果。

结果展示

代码2 使用maketformvistformfwd函数来创建和可视化不同的仿射变换

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使用双线性插值  

思路

  1. 初始化

    • 清除命令窗口的输出和内存中的所有变量,为新的操作做好准备。
    • 创建一个50x50的棋盘格图像f,作为变换的原始图像。
  2. 显示原始图像

    • 使用imshow函数显示原始的棋盘格图像。
  3. 旋转图像

    • 定义旋转角度theta(π/6,即30度)和缩放因子s(1,即不缩放)。
    • 创建一个旋转矩阵T,用于描述图像的旋转变换。
    • 使用maketform函数创建一个仿射变换结构tform
    • 应用imtransform函数对图像f进行旋转变换,使用默认的双线性插值方法。
    • 显示旋转后的图像。
  4. 使用不同的插值方法

    • 使用imtransform函数再次对图像f进行旋转变换,但这次指定使用最近邻插值方法。
    • 显示使用最近邻插值变换后的图像。
  5. 设置填充值

    • 使用imtransform函数对图像f进行旋转变换,指定双线性插值,并将填充值设为0.5。
    • 显示设置填充值后的变换图像。
  6. 平移图像

    • 创建一个平移矩阵T2,用于描述图像的平移变换(沿x和y轴各平移50个像素)。
    • 使用maketform函数创建一个平移变换结构tform2
    • 应用imtransform函数对图像f进行平移变换。
    • 显示平移后的图像。
  7. 设置输出图像大小和填充值

    • 使用imtransform函数对图像f进行平移变换,同时指定输出图像的大小为500x500像素,并设置填充值为0.5。
    • 显示设置输出大小和填充值后的变换图像

结果展示

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值