任务 对一张暗度较高的图像进行处理,直方图均衡的结果差强人意。 感到有白色噪点分布,视觉效果不好。采用同态滤波的方式进行处理,滤波方式尝试理想滤波、butterworth滤波以及gaussian滤波。 代码 思路 按照光图像的成像原理,可以对一幅图像进行简单建模: 𝒇(𝒙,𝒚)=𝒊(𝒙,𝒚)·𝒓(𝒙,𝒚) 即把图像亮度 𝒇(𝒙,𝒚) 看成是由入射分量(入射到景物上的光强度)𝒊(𝒙,𝒚) 和反射分量(景物反射的光强度)𝒓(𝒙,𝒚) 组成。 同态滤波的基本思想是减少入射分量 ,并同时增加反射分量 𝒓(𝒙,𝒚) 来改善图像 𝒇(𝒙,𝒚) 的显示效果;𝒊(𝒙,𝒚) 在空间上变化缓慢,其频谱集中在低频段,𝒓(𝒙,𝒚) 反映图像的细节和边缘,其频谱集中在高频段。 为了将入射分量和反射分量分离,方便进行入射分离的削弱和反射分量的增强,需要对图像先取对数,再进行傅里叶变换,对频谱上设计相应的传递函数进行滤波后,反变换回空域,指数处理后就得到了相应的增强图像。 整个过程的流程是比较清晰的,最初容易迷惑的一点是如何获得入射分量 𝒊(𝒙,𝒚) 和反射分量 𝒓(𝒙,𝒚)——二者无法分离得到具体数据,只是在频域中有区分度。 此外,最核心的一点是设计滤波器实现对两种分量的作用,这对整个滤波效果的影响是最为显著的。过程中,我首先简化问题,设计理想滤波器实现,思路如下: 在傅氏变换后的频谱图中,未经频移时,低频分量在四个角落,高频分量在中心点处。为了符合认知,故先将变换后图片进行频移,进行处理后,再反向频移。 此后,为了达到更好的效果,又采用butterworth函数与gaussion函数实现滤波,并对其效果进行对比。 实现效果 理想滤波 代码 第一开始出现的效果很好,如右下角图所示,整个画面出现了一些事物的轮廓。但发现函数中未增加取指数部分,因此效果主体原因是动态范围压缩的作用(log(1+s))。当用直接动态压缩做为对比时,可见二者没有明显差别。 在原函数的基础上进行参数的调整,并没有较好的效果出现。 对不同截止频率得到的结果图像放大细节,可以看到有振铃效果出现。 butterworth滤波 用幂系数n可以改变滤波器的形状。n越大,则该滤波器越接近于理想滤波器。高通滤波即用1减低通滤波函数。 代码 不同截止频率 随着截止频率的提升,被压的低频成分增加,图像颜色愈深。 不同下限倍乘 不同上限倍乘 Gaussian滤波 代码 最终运用Gaussian滤波,将三者进行对比 对比总结 直方图均衡对于改善低照图图像的灰度分布有更好的效果,可以显著地凸显暗部,增强对比度,将原图中难以观察到的物体都能够很好地显示。但由于直方图均衡合并了一些灰度级,也使一些部位的边缘细节被抹去,例如车上的车窗,集装箱上的条纹等等。 而同态滤波仅仅对具有丰富,锐利边缘的细节进行了增强,但并不能改善原图像的暗部,因为原图像的暗部也是低频成分居多。 同时,直方图均衡的效果与图像本身的性质关联不大,在任何图像上都能取得不错的效果。但同态滤波参数的设置需要根据图像的特点进行配置,同一套参数在往往在另一幅图像上的效果很不理想,若想要同态滤波取得比较好的效果,需要先根据图像设置参数。 总的来说,直方图均衡更具有自适应性,同时能从图像总体上进行增强,无论是暗部还是高光,都起到增强对比度,提升细节的效果。同态滤波可以提升边缘的细节,压缩图像的动态范围,从而提升对比度。 参考文章 把一个矩阵矩阵范围拉伸到minVal~maxVal的范围内 数字图像处理-频域滤波-高通/低通滤波 《数字图像处理 实验报告》施珉
Category: 算法
matlab数字图像处理——直方图均衡重现老照片
任务 在课堂上学习了直方图均衡化的处理手段,看到外国女子的脸部增亮,这是在空域中实现变换增强的方法之一。尝试在matlab中实现相关方法,并用网上的老照片进行实验,效果不错。 过程 得到灰度图的直方图 灰度图的获取可以参考博文matlab数字图像处理——RGB转灰度图,当然也可以直接调用系统函数rgb2gray() 直方图其实是统计不同灰度等级的像素点数目大小,并通过除以图像像素点总数目,得到归一化结果/概率。 得到累积直方图 因为需要对灰度等级进行映射——把某个阶段的灰度值对应到均衡的结果,那么我们需要取得中间变量:累积直方图。 得到映射关系 映射关系可以利用matlab的矩阵运算实现,直接将表达式中的变量用矩阵替换即可。分别表述这行代码中变量的含义: cRecord:上一部分得到的累积直方图 256:总共的灰度等级 -1是因为在matlab中,uint8的范围在0~255 mapValue: 索引值继承等号右边唯一的矩阵——cRecord的含义,是每个灰度等级 内部的值表示通过运算映射得到新的灰度等级 根据新的映射关系修改原图的灰度值 这一步的目的比较清晰,已经通过上一步得到了映射关系,只要将原图中的灰度等级修改为映射后对应的灰度等级即可。 问题与解决方法 残影 整个过程比较顺利,只是第一次显示直方图时有些奇怪: 结果图P5只能隐约看到lena的轮廓,通过显示该图像的变量类型找到答案,变量并非图像的uint8类型,而是double类型。问题出在初始化变量上,我利用zeros()函数,当我把赋值改为强制类型转换后,问题解决。 class(newImg) ans = ‘double’ 结果展示 参考资料 如何提取特定位置以后的字符串(出处: MATLAB中文论坛) MATLAB中画柱状图
无向图两个顶点之间的所有简单路径
给定一个无向图的顶点个数, 再给出有关联的边的信息,请找出给定的两个顶点之间的所有简单路径。按照顶点编号的大小顺序依次输出。
C++“窗口”法寻找子串
题目和解题方法来源:左神(左程云):深入解析字节跳动算法面试题与数据结构
用C++实现算法(原讲解为Java)。并通过随机新建字符串进行测试。
源代码于GitHub
搜索二叉树BST
用C++实现算法:根据一个搜索二叉树后序遍历的数组posArr,重建出整棵树返回新建树的头节点。
并通过随机新建BST、获得BST的后序遍历数组、判定两BST是否相等进行测试。