c语言数字图像处理(八):噪声模型及均值滤波器
图像退化/复原过程模型
高斯噪声
PDF(概率密度函数)
生成高斯随机数序列
算法可参考<http://www.doc.ic.ac.uk/~wl/papers/07/csur07dt.pdf>
代码实现
double gaussrand()
{
static double V1, V2, S;
static int phase = ;
double X; if(phase == ) {
do {
double U1 = (double)rand() / RAND_MAX;
double U2 = (double)rand() / RAND_MAX; V1 = * U1 - ;
V2 = * U2 - ;
S = V1 * V1 + V2 * V2;
} while(S >= || S == ); X = V1 * sqrt(- * log(S) / S);
} else
X = V2 * sqrt(- * log(S) / S); phase = - phase; return X * ;
}
生成高斯噪声图及直方图
下面给一幅图添加高斯噪声
代码实现
void add_gaussian_noise(short** in_array, short** out_array, long height, long width)
{
srand(time(NULL));
for (int i = ; i < height; i++){
for (int j = ; j < width; j++){
out_array[i][j] = in_array[i][j] + (short)gaussrand();
if (out_array[i][j] < 0x00)
out_array[i][j] = 0x00;
else if (out_array[i][j] > 0xff)
out_array[i][j] = 0xff;
}
}
}
原图
添加高斯噪声
椒盐噪声
添加椒盐噪声(胡椒噪声和盐粒噪声概率分别为5%)
void add_salt_pepper_noise(short** in_array, short** out_array, long height, long width)
{
srand(time(NULL));
int noise_p; for (int i = ; i < height; i++){
for (int j = ; j < width; j++){
noise_p = rand() % ;
if (noise_p == ){
int temp = rand() % ;
if (temp)
out_array[i][j] = 0x00;
else
out_array[i][j] = 0xff;
}
else
out_array[i][j] = in_array[i][j];
}
}
}
均值滤波器
算术均值滤波器
代码实现
int is_in_array(short x, short y, short height, short width)
{
if (x >= && x < width && y >= && y < height)
return ;
else
return ;
} /*
* element
* v0 v1 v2
* v3 v4 v5
* v6 v7 v8
*
*/
void filtering(short** in_array, short** out_array, long height, long width)
{
short value[]; for (int i = ; i < height; i++){
for (int j = ; j < width; j++){
value[] = is_in_array(j-, i-, height, width) ? in_array[i-][j-] : ;
value[] = is_in_array(j, i-, height, width) ? in_array[i-][j] : ;
value[] = is_in_array(j+, i-, height, width) ? in_array[i-][j+] : ;
value[] = is_in_array(j-, i, height, width) ? in_array[i][j-] : ;
value[] = in_array[i][j];
value[] = is_in_array(j+, i, height, width) ? in_array[i][j+] : ;
value[] = is_in_array(j-, i+, height, width) ? in_array[i+][j-] : ;
value[] = is_in_array(j, i+, height, width) ? in_array[i+][j] : ;
value[] = is_in_array(j+, i+, height, width) ? in_array[i+][j+] : ; /* Arithmetic Mean Filter */
for (int k = ; k < ARRAY_SIZE*ARRAY_SIZE; k++)
out_array[i][j] += value[k];
out_array[i][j] /= ARRAY_SIZE*ARRAY_SIZE; }
}
}
处理高斯噪声
处理椒盐噪声
结论:算术平均滤波对于高斯噪声和椒盐噪声都有一定的效果,但是同时会平滑图像
几何均值滤波器
实现
void filtering(short** in_array, short** out_array, long height, long width)
{
short value[]; for (int i = ; i < height; i++){
for (int j = ; j < width; j++){
value[] = is_in_array(j-, i-, height, width) ? in_array[i-][j-] : ;
value[] = is_in_array(j, i-, height, width) ? in_array[i-][j] : ;
value[] = is_in_array(j+, i-, height, width) ? in_array[i-][j+] : ;
value[] = is_in_array(j-, i, height, width) ? in_array[i][j-] : ;
value[] = in_array[i][j];
value[] = is_in_array(j+, i, height, width) ? in_array[i][j+] : ;
value[] = is_in_array(j-, i+, height, width) ? in_array[i+][j-] : ;
value[] = is_in_array(j, i+, height, width) ? in_array[i+][j] : ;
value[] = is_in_array(j+, i+, height, width) ? in_array[i+][j+] : ; /* Geometric Mean Filter */
double product = 1.0;
for (int k = ; k < ARRAY_SIZE*ARRAY_SIZE; k++)
product *= value[k];
product = pow(product, 1.0 / 9.0);
out_array[i][j] = (short)product; if (out_array[i][j] < 0x00)
out_array[i][j] = 0x00;
else if (out_array[i][j] > 0xff)
out_array[i][j] = 0xff;
}
}
}
几何均值滤波器与算术均值滤波器相比,丢失的图像细节更少
谐波均值滤波器
实现
void filtering(short** in_array, short** out_array, long height, long width)
{
short value[]; for (int i = ; i < height; i++){
for (int j = ; j < width; j++){
value[] = is_in_array(j-, i-, height, width) ? in_array[i-][j-] : ;
value[] = is_in_array(j, i-, height, width) ? in_array[i-][j] : ;
value[] = is_in_array(j+, i-, height, width) ? in_array[i-][j+] : ;
value[] = is_in_array(j-, i, height, width) ? in_array[i][j-] : ;
value[] = in_array[i][j];
value[] = is_in_array(j+, i, height, width) ? in_array[i][j+] : ;
value[] = is_in_array(j-, i+, height, width) ? in_array[i+][j-] : ;
value[] = is_in_array(j, i+, height, width) ? in_array[i+][j] : ;
value[] = is_in_array(j+, i+, height, width) ? in_array[i+][j+] : ; /* Harmonic Mean Filter */
double sum = ;
for (int k = ; k < ARRAY_SIZE*ARRAY_SIZE; k++)
sum += 1.0 / value[k];
out_array[i][j] = (short)(9.0 / sum); if (out_array[i][j] < 0x00)
out_array[i][j] = 0x00;
else if (out_array[i][j] > 0xff)
out_array[i][j] = 0xff;
}
}
}
处理高斯噪声
处理椒盐噪声
对盐粒噪声效果较好,不适用于胡椒噪声,善于处理高斯噪声
逆谐波均值滤波器
Q为滤波器的阶数,Q为正时,消除胡椒噪声,Q为负时消除盐粒噪声
Q=0为算术均值滤波器,Q=-1谐波均值滤波器
实现
void filtering(short** in_array, short** out_array, long height, long width)
{
short value[]; for (int i = ; i < height; i++){
for (int j = ; j < width; j++){
value[] = is_in_array(j-, i-, height, width) ? in_array[i-][j-] : ;
value[] = is_in_array(j, i-, height, width) ? in_array[i-][j] : ;
value[] = is_in_array(j+, i-, height, width) ? in_array[i-][j+] : ;
value[] = is_in_array(j-, i, height, width) ? in_array[i][j-] : ;
value[] = in_array[i][j];
value[] = is_in_array(j+, i, height, width) ? in_array[i][j+] : ;
value[] = is_in_array(j-, i+, height, width) ? in_array[i+][j-] : ;
value[] = is_in_array(j, i+, height, width) ? in_array[i+][j] : ;
value[] = is_in_array(j+, i+, height, width) ? in_array[i+][j+] : ; /* Contra-Harmonic Mean Filter */
int Q = ;
double num = 0.0, den = 0.0;
for (int k = ; k < ARRAY_SIZE*ARRAY_SIZE; k++){
num += pow(value[k], Q+);
den += pow(value[k], Q);
}
out_array[i][j] = (short)(num / den); if (out_array[i][j] < 0x00)
out_array[i][j] = 0x00;
else if (out_array[i][j] > 0xff)
out_array[i][j] = 0xff;
}
}
}
Q = 2 消除胡椒噪声
Q = -2消除盐粒噪声
Q = -2消除盐粒噪声后的图像使用Q = 2消除胡椒噪声
再来一次
再来
此时椒盐噪声已经基本消除
c语言数字图像处理(八):噪声模型及均值滤波器的更多相关文章
- [数字图像处理]常见噪声的分类与Matlab实现
1.研究噪声特性的必要性 本文的内容主要介绍了常见噪声的分类与其特性. 将噪声建模,然后用模型去实现各式各样的噪声. 实际生活中的各种照片的老化,都能够归结为下面老化模型. 这个模型非常easy,也能 ...
- c语言数字图像处理(三):仿射变换
仿射变换及坐标变换公式 几何变换改进图像中像素间的空间关系.这些变换通常称为橡皮模变换,因为它们可看成是在一块橡皮模上印刷一幅图像,然后根据预定的一组规则拉伸该薄膜.在数字图像处理中,几何变换由两个基 ...
- Win8 Metro(C#)数字图像处理--2.52图像K均值聚类
原文:Win8 Metro(C#)数字图像处理--2.52图像K均值聚类 [函数名称] 图像KMeans聚类 KMeansCluster(WriteableBitmap src,i ...
- c语言数字图像处理(九):边缘检测
背景知识 边缘像素是图像中灰度突变的像素,而边缘是连接边缘像素的集合.边缘检测是设计用来检测边缘像素的局部图像处理方法. 孤立点检测 使用<https://www.cnblogs.com/Gol ...
- c语言数字图像处理(五):空间滤波
空间滤波原理 使用大小为m*n的滤波器对大小为M*N的图像进行线性空间滤波,将滤波器模板乘以图像中对应灰度值,相加得模板中心灰度值 a = (m-1)/2, b = (n-1)/2 若f(x+s, y ...
- c语言数字图像处理(二):图片放大与缩小-双线性内插法
图像内插 假设一幅大小为500 * 500的图像扩大1.5倍到750 * 750,创建一个750 * 750 的网格,使其与原图像间隔相同,然后缩小至原图大小,在原图中寻找最接近的像素(或周围的像素) ...
- c语言数字图像处理(一):bmp图片格式及灰度图片转换
本篇文章首先介绍了bmp图片格式,主要参考wiki上的内容,包括bmp文件的存储方式,对于一些常见的bmp文件格式都给了例子,并且对8位 16位RGB555 16位RGB565格式的bmp文件进行了简 ...
- c语言数字图像处理(十):阈值处理
定义 全局阈值处理 假设某一副灰度图有如下的直方图,该图像由暗色背景下的较亮物体组成,从背景中提取这一物体时,将阈值T作为分割点,分割后的图像g(x, y)由下述公式给出,称为全局阈值处理 多阈值处理 ...
- c语言数字图像处理(七):频率域滤波
代码运行了两个小时才出的结果,懒得测试了,这一部分先鸽了,等对DFT算法进行优化后再更
随机推荐
- python -wordcloudan云词安装
1安装网站:https://download.lfd.uci.edu/pythonlibs/u2yrk7ps/wordcloud-1.4.1-cp36-cp36m-win_amd64.whl 2安装过 ...
- windows下python 正确安装词云包wordcloud的方法
安装wordcloud的时候果然还是出现了问题,试了网上说的好多办法,最后找到了一种成功率高的,可以优先尝试一下 下载.whl文件http://www.lfd.uci.edu/~gohlke/pyth ...
- 团队作业—预则立&&他山之石(改)
首先特别感谢刘乾学长腾出他宝贵的时间接受我的采访,为我们提出宝贵的建议,深表感谢. 1.他山之石,可以攻玉.借鉴前人的经验可以使我们减少很多走弯路的地方,这也是本次采访的目的,参考历届学长的经验,让我 ...
- PHP设计模式系列 - 适配器
什么是适配器: 适配器设计模式只是将某个对象的接口适配为另一个对象所期望的接口. 设计情景: 假如我们原始的有一个UserInfo的类,提供用户信息的类,早起设计该类的时候,只实现了一个getUser ...
- lvm xfs 扩容
lvresize -L 300M /dev/vg1/lv1 #重新设定大小 e2fsck -f /dev/vg1/lv1 #检查磁盘错误 (针对ext4执行) resize2fs /dev/vg1/l ...
- js之点击值发生变化
点击值发生变化,应用场景,比如像阿里云那样我通常密码是以******的形式存在,我必须要点击查看,它才会以明文显示. 在实际开发中,比如以智能门锁为例,安装门锁时,有个叫密码输入框的表单,这个是选填项 ...
- http 的request和response 在servlet的应用文件下载
一)response 我们通过浏览器访问网站的时候,处理响应的是response. 它由三部门组成:响应行.响应头.响应体 作用:往浏览器写东西. 1)响应行 格式:协议/版本 状态码 状态码说明. ...
- D. Timetable
http://codeforces.com/problemset/problem/946/D Ivan is a student at Berland State University (BSU). ...
- pH计
pH计 测量原理 pH计主要用于测量液体中的氢离子浓度.准确地说是测量氢离子活性,得出酸性.中性还是碱性的数值,在自来水.河水.饮料.食品.污水.医疗和化工等领域广泛地使用工业用液体分析仪. pH计原 ...
- SharePoint自动初始化网站列表
1,由于目前的SharePoint网站需要部署到多个服务器上,每个网站的内容都不一样,所以使用备份还原是不可以的.常用的方式便是将列表导出为列表模版,然后将列表模版复制到服务器上,根据列表模版创建列表 ...