图像处理笔记(十一):噪声模型

本节笔记致力于讨论什么样的噪声用什么样的方法来降噪,及找出每种噪声的特点以识别噪声

  1. 高斯噪声:概率密度函数(PDF)符合正态分布
  2. 瑞利噪声
  3. 伽马噪声
  4. 指数噪声
  5. 均匀噪声
  6. 椒盐噪声
  7. 周期噪声:图像获取过程中由于电力或机电干扰产生,通过频率域滤波处理,使用带阻滤波器消除

前五种噪声用肉眼很难区分,需要结合灰度直方图看与哪一种噪声的概率密度函数图像更相似来区分。

在研究高斯噪声的时候尝试了一下自己消除噪声,下面是代码:

dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
read_image(GaussianImage1, 'Fig0504(a)(gaussian-noise)')
get_image_size(GaussianImage1, Width, Height)
* 生成一个高斯滤波器,注意这里的传出值的类型是Image,即f是一个Image类型
* 这里第二三个参数越大,过滤的越厉害,最终获得的图像越模糊
gen_gauss_filter(f, 3, 3, 0, 'none', 'dc_edge', Width, Height)
fft_generic(GaussianImage1, ImageFFT1, 'to_freq', -1, 'none', 'dc_edge', 'complex')
convol_fft(ImageFFT1, f, ImageConvol)
fft_generic(ImageConvol, ImageFFT2, 'from_freq', -1, 'none', 'dc_edge', 'real')
convert_image_type(ImageFFT2, ImageConverted, 'int8')

这里面将图像做了傅里叶变换以转换成频谱图,在频率域上使用了一个高斯滤波器进行过滤后再转换成图片。
转换的过程发现一个现象,滤波后的图像的灰度值非常非常高,本来是byte类型的像素,现在的像素必须要用Int8来存储。
按照我已学的内容,很多东西都是在灰度域上做变换的,要在灰度域上做变换,像素需要是byte类型的,这时候我们就需要把很高的灰度转换到0-255之间。
这个转换我在网上搜了很久都没有搜到相关的算子,只是有人说要除以2的n次方,根据这个线索,我找了算子scale_image,竟然在这个算子的帮助文档上发现了转换的方法,真的是太感动了。
这个故事告诉我们,halcon的官方文档一定要好好看啊。下面上代码:

gen_rectangle1(Rectangle, 0, 0, Width, Height)
* 获取最大最小灰度,第一个参数是一个Region,按照文档中建议要使用draw_region,发现不好用,可能是非常耗时,要很久很久程序还在运行
* 所以我就直接创建了一个矩形的Region,和图像等宽高
min_max_gray(Rectangle, ImageConverted, 0, Min, Max, Range)
m := 255 / (Max - Min)
a := - m * Min
* 曾经我以为这只是一个线性变换的算子,原来还有这么好用的功能,这一步做完之后,图像的灰度就在0-255之间了
scale_image(ImageConverted, ImageScaled, m, a)
* 把图像类型转换为byte,图像就具有能操作的像素类型和灰度值了
convert_image_type(ImageScaled, ImageConverted1, 'byte')

话说我为什么想要用灰度值呢,因为做完高斯滤波之后的图像变得很模糊,我想要把图像变清晰一些。
这里我没有用直接提供的高斯滤波算子,其实我也试了一下,发现自己这样写过滤出的效果比较好,噪声基本上不见了,虽然图像模糊了些,肯定还有办法的嘛。
上对比图:

处理高斯噪声一般使用均值滤波器,感觉直接用mean_image的效果也没有我上面那么做好。

有的噪声在做处理时,应当要提前知道是被具有什么样的特征的噪声污染了,才更好处理。

原文地址:https://www.cnblogs.com/yutou2016/p/11126899.html