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算法进行优化后再更
随机推荐
- super深究
super的入门使用: 在类的继承中,如果定义某个方法,该方法会覆盖父类的同名方法,但有时候我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可以通过使用super来实现.比如: cla ...
- python第十三课——嵌套循环
2.嵌套循环: 概念:循环中再定义循环,称为嵌套循环: [注意]嵌套循环可能有多层,但是一般我们实际开发最多两层就可以搞定了(99%的情况) 格式: 1).while中套while常用 2).whil ...
- Kafka设计解析(十二)Kafka 如何读取offset topic内容 (__consumer_offsets)
转载自 huxihx,原文链接 Kafka 如何读取offset topic内容 (__consumer_offsets) 众所周知,由于Zookeeper并不适合大批量的频繁写入操作,新版Kafka ...
- 传入一个integer数组,取出最大、最小值
/** * <p> * 传入一个integer数组,取出最大值 * </p> * @author yunns 2015年11月19日 * @param array * @ret ...
- HihoCoder - 1336 二维数状数组(单点更新 区间查询)
You are given an N × N matrix. At the beginning every element is 0. Write a program supporting 2 ope ...
- HDU 1114(没有变形的完全背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114 Piggy-Bank Time Limit: 2000/1000 MS (Java/Others ...
- 【LeetCode43】 Multiply Strings
题目描述: 解题思路: java代码: public class LeetCode43 { public static void main(String[] args) { String num1=& ...
- transform CSS3 2D知识点汇总
transform转换属性的5个值: 1. translate(x值,y值) 移动效果. 2.rotate(45deg) 旋转效果. 3.scale(x轴倍数,y轴倍数) 缩放效果. 4.ske ...
- Nivo Slider用法
示例代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- day 82 Vue学习二之vue结合项目简单使用、this指向问题
Vue学习二之vue结合项目简单使用.this指向问题 本节目录 一 阶段性项目流程梳理 二 vue切换图片 三 vue中使用ajax 四 vue实现音乐播放器 五 vue的计算属性和监听器 六 ...