当前位置: 首页 > news >正文

数字图像处理作业3

第一问:
第一问要求使用一阶的Butterworth低通滤波器进行频域滤波,Butterworth其实是在截止低通滤波器的一个改进,它消除了明显截止带来的急剧不连续性。

H ( u , v ) = 1 1 + [ D ( u , v ) / D 0 ] 2 n H(u, v)=\frac{1}{1+\left[D(u, v) / D_0\right]^{2 n}} H(u,v)=1+[D(u,v)/D0]2n1

使用这种方法也可以让生成的图片不会有明显的振铃现象,因为它在低频和高频之间平滑的过度了。
在这里插入图片描述
Butterworth函数:

function H = Butterworth( D0, height, width )
for i = 1 : height
    x = i - (height / 2);
    for j = 1 : width
        y = j - (width / 2);
        H(i, j) = 1 / (1 + (D0^2) / (x^2 + y^2)); 
    end
end
end

中心函数

function mat = Centralize( mat )
[height, width] = size(mat);
for i = 1 : height
    for j = 1 : width
        if mod(i + j, 2) == 1
            mat(i, j) = -mat(i, j); 
        end
    end
end
end

优化后的巴特沃斯函数

function H = Butterworth(D0, height, width, n)
% 参数说明:
% D0: 截止频率(标量)
% height: 滤波器高度
% width: 滤波器宽度
% n: 阶数(默认1)

if nargin < 4, n = 1; end

% 生成网格坐标(向量化)
[Y, X] = meshgrid(1:width, 1:height);
X_centered = X - floor(width/2) - 1;  % 中心对称坐标
Y_centered = Y - floor(height/2) - 1;

% 计算距离矩阵
D = sqrt(X_centered.^2 + Y_centered.^2);
D(D == 0) = eps; % 避免除以零

% 巴特沃斯公式(修正分母)
H = 1 ./ (1 + (D ./ D0).^(2*n)); % 低通滤波器
end

优化后的频域中心化函数

function mat = Centralize(mat)
% 参数说明:
% mat: 输入矩阵(需中心化的频域数据)

% 生成(-1)^(i+j) 的掩膜矩阵(向量化)
[i_idx, j_idx] = meshgrid(1:size(mat,2), 1:size(mat,1));
mask = (-1).^(i_idx + j_idx);

% 中心化操作
mat = mat .* mask;
end

指标原代码优化后代码
时间复杂度 O ( N 2 ) \mathrm{O}\left(\mathrm{N}^2\right) O(N2)(双重循环) O ( 1 ) \mathrm{O}(1) O(1)(矩阵运算)
1000 × 1000  矩阵  \mathbf{1 0 0 0 \times 1 0 0 0 \text { 矩阵 }} 1000×1000 矩阵  ∼ 1.2 \sim 1.2 1.2 ∼ 0.02 \sim 0.02 0.02
可读性低(手动坐标计算)高(数学公式直译)
功能扩展性固定阶数支持任意阶数

函数空间域的卷积的傅里叶变换是函数傅里叶变换的乘积。对应地,频率域的卷积与空间域的乘积存在对应关系。

f ( x , y ) ∗ g ( x , y ) ⇔ F ( u , v ) H ( u , v ) f ( x , y ) g ( x , y ) ⇔ F ( u , v ) ∗ H ( u , v ) \begin{aligned} & f(x, y) * g(x, y) \Leftrightarrow F(u, v) H(u, v) \\ & f(x, y) g(x, y) \Leftrightarrow F(u, v) * H(u, v) \end{aligned} f(x,y)g(x,y)F(u,v)H(u,v)f(x,y)g(x,y)F(u,v)H(u,v)

在空域上,滤波后的空域图像会减少高频噪声,也就是对于原图像进行了平滑操作,平滑了变化剧烈的部分,其实就相当于使用平滑滤波器进行了一个卷积操作。DO的大小选择也决定了图像本身的高频成分丢失情况,D0取得越小,图像丢失的细节越多。

在频域上,进行过中心变换的频域图像的中心是低频部分,这样就可以用高斯滤波器的模版来过滤掉高频成分了。越往外的高频部分就越会被过滤掉,这样滤波后,频域图像内容基本就集中在中心附近了。

问题二

第二问要求我们使用一个同态滤波来增强图像的细节。
对于一幅由物理过程产生的图像 f ( x , y ) f(x, y) f(x,y) ,可以表示为照射分量 i ( x , y ) i(x, y) i(x,y) 和反射分量 r ( x , y ) r(x, y) r(x,y) 的乘积。 0 < i ( x , y ) < ∞ 0<i(x, y)<\infty 0<i(x,y)< 0 < r ( x , y ) < 1 0<r(x, y)<1 0<r(x,y)<1 i ( x , y ) i(x, y) i(x,y) 描述景物的照明,变化缓慢,处于低频成分。 r ( x , y ) r(x, y) r(x,y) 描述景物的细节,变化较快,处于高频成分。

因为该性质是乘性的,所以不能直接使用傅里叶变换对 i ( x , y ) i(x, y) i(x,y) r ( x , y ) r(x, y) r(x,y) 进行控制,因此可以先对 f ( x , y ) f(x, y) f(x,y) 取对数,分离 i ( x , y ) i(x, y) i(x,y) r ( x , y ) r(x, y) r(x,y) 。令 z ( x , y ) = ln ⁡ f ( x , y ) = ln ⁡ i ( x , y ) + ln ⁡ r ( x , y ) z(x, y)=\ln f(x, y)=\ln i(x, y)+\ln r(x, y) z(x,y)=lnf(x,y)=lni(x,y)+lnr(x,y) 。在这个过程中,由于 f ( x , y ) f(x, y) f(x,y) 的取值范围为 [ 0 , L − 1 ] [0, L-1] [0,L1] ,为了避免出现 ln ⁡ ( 0 ) \ln (0) ln(0) 的情况,故采用 ln ⁡ ( f ( x , y ) + 1 ) \ln (f(x, y)+1) ln(f(x,y)+1) 来计算。
在这里插入图片描述

接着我们就可以进行傅立叶变换,再和对数频域滤波器进行点乘:

H ( u , v ) = ( γ H − γ L ) [ 1 − e − c [ D 2 ( u , v ) / D 0 2 ] ] + γ L H(u, v)=\left(\gamma_H-\gamma_L\right)\left[1-e^{-c\left[D^2(u, v) / D_0^2\right]}\right]+\gamma_L H(u,v)=(γHγL)[1ec[D2(u,v)/D02]]+γL

最后输出的结果进行 exp和取real等反变换,最后进行maxmin操作将灰度值变回到0-255之间。

http://www.dtcms.com/a/122974.html

相关文章:

  • fuse-python使用fuse来挂载fs
  • 汽车软件开发常用的建模工具汇总
  • Joomla 常用模块 - 在线用户与Joomla 常用模块 - 自定义HTML模块
  • [leetcode]判断质数
  • 关于C++日志库spdlog
  • JS 函数提升
  • 蓝桥杯十一届C++B组真题题解
  • 革新电销流程,数企云外呼开启便捷 “直通车”
  • 各种场景的ARP攻击描述笔记(超详细)
  • stream流Collectors.toMap(),key值重复问题
  • Bootstrap Table动态修改列标题
  • C++中命名空间namespace|头文件h文件|源文件cpp文件详解
  • pyecharts常用图形
  • Mysql索引(二)
  • 8.第二阶段x64游戏实战-string类
  • UE学习记录part15
  • ffpyplayer+Qt,制作一个视频播放器
  • 玩转Docker | 使用Docker安装FileDrop文件共享工具
  • 如何解【决泛型作为运行时参数】时类型擦除问题
  • PowerBI数据建模2:计算选项、计算组
  • JavaScript实用API
  • 计算机视觉4——特征点及其描述子
  • LeetCode344反转字符串
  • 亮相2025全球分布式云大会,火山引擎边缘云落地AI新场景
  • 1. 两数之和 leetcode
  • 后缀自动机SAM练习笔记 (一)
  • Pandas-按索引从df中读取指定一个或者多个元素
  • Pytorch Dataset问题解决:数据集读取报错DatasetGenerationError或OSError
  • win10离线环境下配置wsl2和vscode远程开发环境
  • spark-Core