一幅图像f(x,y)能够用它的入射光分量和反射光分量来表示,其关系式如下

f(x,y)=i(x,y)r(x,y)

图像f(x,y)是由光源产生的照度场i(x,y)和目标的反射系数场r(x,y)的共同作用下产生的。

该模型可作为频率域中同时压缩图像的亮度范围和增强图像的对比度的基础。

但在频率域中不能直接对照度场和反射系数场频率分量分别进行独立的操作。

如果定义:

则有:

或者

这里I(u,v)以及R(u,v)分别是lni(x,y)和 lnr(x,y)的傅里叶变换。

同态滤波方法就是利用上式的形式将图像中的照明分量和反射分量分开。这样同态滤波函数就可以分别作用在这两个分量上。

图像中的照明分量往往具有变化缓慢的特征,而反射分量则倾向于剧烈变化,特别在不同物体的交界处。由于这种持征,图像的自然对数的傅里叶变换的低频分量与照明分量相联系,而其高频分量则与反射分量相联系。

同态滤波处理过程如下所示:

同态滤波的流程图

同态滤波有几个参数:

rH

rL

c %介于rH和rL之间

D0

通过调整这几个参数达到不同的效果:

代码示例:

%参数声明

rH = 1;

rL = 0.1;

c = 0.2;%介于rH和rL之间

D0 = 0.2;

image = imread('path');

[M, N] = size(image);

%取对数

img_log = log(double(image) + 1);

%平移到中心,判断语句代替指数计算

img_py = zeros(M, N);

for i = 1:M

for j= 1:N

if mod(i+j, 2) == 0

img_py(i,j) = img_log(i, j);

else

img_py(i,j) = -1 * img_log(i, j);

end

end

end

% 对填充后的图像进行傅里叶变换

img_py_fft = fft2(img_py);

%同态滤波函数

img_tt = zeros(M, N);

deta_r = rH - rL;

D = D0^2;

m_mid=floor(M/2);%中心点坐标

n_mid=floor(N/2);

for i = 1:M

for j =1:N

dis = ((i-m_mid)^2+(j-n_mid)^2);

img_tt(i, j) = deta_r * (1-exp((-c)*(dis/D))) + rL;

end

end

%滤波

img_temp = img_py_fft.*img_tt;

%反变换,取实部,绝对值

img_temp = abs(real(ifft2(img_temp)));

%指数化

img_temp = exp(img_temp) - 1;

%归一化处理

max_num = max(img_temp(:));

min_num = min(img_temp(:));

range = max_num - min_num;

img_after = zeros(M,N,'uint8');

for i = 1 : M

for j = 1 : N

img_after(i,j) = uint8(255 * (img_temp(i, j)-min_num) / range);

end

end

subplot(1,2,1), imshow(image), title('原图像');

subplot(1,2,2), imshow(img_after), title('变换后');

效果如下:

可以看出相比于其他的图像增强的方法,同态滤波效果挺好的。

最后附上常用的二维离散傅里叶变换的Matlab实现

函数fft2 — 快速傅里叶变换

格式1:F = fft2(f)

格式2:F = fft2(f, P, Q)

函数ifft2 —快速傅里叶逆变换

格式: f = ifft2(F)

函数fftshift — 将变换的原点移动到频率矩形中心

格式:Fc =fftshift(F)

函数ifftshift — fftshift

函数的逆操作

格式:F = ifftshift(Fc)

python中matlab函数图像处理,MATLAB图像处理--同态滤波(代码及示例)相关推荐

  1. python中get函数是什么意思_详解python中get函数的用法(附代码)_后端开发

    strncmp函数用法详解_后端开发 strncmp函数为字符串比较函数,其函数语法为"int strncmp ( const char * str1, const char * str2, ...

  2. 详解Python中get函数的用法(附代码)

    描述: Python 字典 get() 函数返回指定键的值,如果值不在字典中返回默认值. 语法: get()方法语法: dict.get(key, default=None) 参数: key – 字典 ...

  3. python中的get函数什么意思_详解python中get函数的用法(附代码)

    描述 Python 字典 get() 函数返回指定键的值,如果值不在字典中返回默认值. 语法 get()方法语法:dict.get(key, default=None) 参数 key – 字典中要查找 ...

  4. python get函数用法_详解python中get函数的用法(附代码)

    描述 Python 字典 get() 函数返回指定键的值,如果值不在字典中返回默认值. 语法 get()方法语法:dict.get(key, default=None) 参数 key – 字典中要查找 ...

  5. python中strftime函数_Python strftime()用法及代码示例

    在Python中,日期和时间不是其自身的数据类型,而是名为 strftime()函数用于将日期和时间对象转换为其字符串表示形式.它需要一个或多个格式化代码输入,并返回字符串表示形式. 用法: strf ...

  6. python中set函数作用如何自己用代码实现_Python进阶开发之元类编程

    Photo byJoyous From Lofter 本文目录 类是如何产生的 如何使用type创建类 理解什么是元类 使用元类的意义 元类实战:ORM .1. 类是如何产生的 类是如何产生?这个问题 ...

  7. python中最小公倍数函数_Python实现的求解最小公倍数算法示例

    这篇文章主要介绍了Python实现的求解最小公倍数算法,涉及Python数值运算.判断等相关操作技巧,需要的朋友可以参考下 本文实例讲述了Python实现的求解最小公倍数算法.分享给大家供大家参考,具 ...

  8. matlab中axis函数程序,matlab中axis函数

    % 计算函数值,zz 也是21x21的矩阵 为了方便测试立体绘图,MATLAB 提供了一个 peaks...meshz 可将曲面加上围裙: [x,y,z]=peaks; meshz(x,y,z); a ...

  9. python中exp函数_Python3中exp()函数用法分析

    python中虚数函数exp怎么表示 复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型 虚数函数exp用math是不行的要用cmat ...

  10. Python中Print()函数的用法___实例详解(二)(全,例多)

    Python中Print()函数的用法___实例详解(二)(全,例多) 目录 十一.Print()小例子 十二.Print()中文输入显示乱码问题 十三.Print()写入文件 十四.print()在 ...

最新文章

  1. 计算机专业中专排名,成都计算机中专学校排名
  2. Winrar目录穿越漏洞复现
  3. 计算机专业大学排名_计算机专业大学排名公布:大连大学、辽宁师范大学冲进前一百...
  4. linux驱动程序是什么,简述一个Linux驱动程序的主要流程与功能
  5. 【ARM】Tiny4412裸板编程之MMU(段 16M)
  6. CentOS查看软件源提供的软件版本命令
  7. Wordpress如何打开调试模式
  8. 线段树-Mex-洛谷P4137
  9. DelayedOperationPurgatory分析
  10. MIDP应用程序的属性
  11. 想交换机高级篇的朋友们,你们有福啦
  12. 双系统格式化Ubuntu分区后Windows 开机出现grub rescue问题
  13. 深入理解卡尔曼滤波算法
  14. 短时傅里叶变换STFT(非使用fft函数)
  15. 动态分级存储特性-SmartTier
  16. 年产4000吨果味奶糖生产车间工艺设计
  17. 使用Python来调教我的微信
  18. 关于前端上传文件到后台,文件大小超出限制,导致上传失败的解决办法。
  19. c语言-结构体实例笔记
  20. 基于51单片机的火灾报警系统设计

热门文章

  1. 容器编排技术 -- Kubernetes Replication Controller
  2. 一款开源免费且快速,高效和安全的跨平台备份程序:Restic使用教程
  3. Hibernate Log4j日志记录
  4. Consul架构介绍
  5. vue 项目构建失败 Unhandled rejection Error 的原因 sass解析异常
  6. 【C语言】用函数实现两个数排序(指针作函数参数)
  7. C#LeetCode刷题之#720-词典中最长的单词(Longest Word in Dictionary)
  8. C#LeetCode刷题之#463-岛屿的周长​​​​​​​(Island Perimeter)
  9. Address already in use: JVM_Bind 8083端口被占用的几个解决办法
  10. android项目实战博学谷源码_阿里爆款SpringBoot项目实战PDF+源码+视频分享