图像退化/复原过程模型

高斯噪声

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语言数字图像处理(八):噪声模型及均值滤波器的更多相关文章

  1. [数字图像处理]常见噪声的分类与Matlab实现

    1.研究噪声特性的必要性 本文的内容主要介绍了常见噪声的分类与其特性. 将噪声建模,然后用模型去实现各式各样的噪声. 实际生活中的各种照片的老化,都能够归结为下面老化模型. 这个模型非常easy,也能 ...

  2. c语言数字图像处理(三):仿射变换

    仿射变换及坐标变换公式 几何变换改进图像中像素间的空间关系.这些变换通常称为橡皮模变换,因为它们可看成是在一块橡皮模上印刷一幅图像,然后根据预定的一组规则拉伸该薄膜.在数字图像处理中,几何变换由两个基 ...

  3. Win8 Metro(C#)数字图像处理--2.52图像K均值聚类

    原文:Win8 Metro(C#)数字图像处理--2.52图像K均值聚类  [函数名称]   图像KMeans聚类      KMeansCluster(WriteableBitmap src,i ...

  4. c语言数字图像处理(九):边缘检测

    背景知识 边缘像素是图像中灰度突变的像素,而边缘是连接边缘像素的集合.边缘检测是设计用来检测边缘像素的局部图像处理方法. 孤立点检测 使用<https://www.cnblogs.com/Gol ...

  5. c语言数字图像处理(五):空间滤波

    空间滤波原理 使用大小为m*n的滤波器对大小为M*N的图像进行线性空间滤波,将滤波器模板乘以图像中对应灰度值,相加得模板中心灰度值 a = (m-1)/2, b = (n-1)/2 若f(x+s, y ...

  6. c语言数字图像处理(二):图片放大与缩小-双线性内插法

    图像内插 假设一幅大小为500 * 500的图像扩大1.5倍到750 * 750,创建一个750 * 750 的网格,使其与原图像间隔相同,然后缩小至原图大小,在原图中寻找最接近的像素(或周围的像素) ...

  7. c语言数字图像处理(一):bmp图片格式及灰度图片转换

    本篇文章首先介绍了bmp图片格式,主要参考wiki上的内容,包括bmp文件的存储方式,对于一些常见的bmp文件格式都给了例子,并且对8位 16位RGB555 16位RGB565格式的bmp文件进行了简 ...

  8. c语言数字图像处理(十):阈值处理

    定义 全局阈值处理 假设某一副灰度图有如下的直方图,该图像由暗色背景下的较亮物体组成,从背景中提取这一物体时,将阈值T作为分割点,分割后的图像g(x, y)由下述公式给出,称为全局阈值处理 多阈值处理 ...

  9. c语言数字图像处理(七):频率域滤波

    代码运行了两个小时才出的结果,懒得测试了,这一部分先鸽了,等对DFT算法进行优化后再更

随机推荐

  1. 【ASP.NET】#001 获取服务器IP

    客户端ip: Request.ServerVariables.Get("Remote_Addr").ToString(); 客户端主机名: Request.ServerVariab ...

  2. 【ORACLE】 安装需要注意的问题(一)

    安装ORACLE虽然不是很难,但是有时候很容易因为一些小细节导致安装失败,浪费大量的时间. 这里总结一下安装ORACLE的时候需要注意的问题,以及解决的办法 问题1:系统先决条件检查 正在检查操作系统 ...

  3. [USACO08NOV]Cheering up the Cow

    嘟嘟嘟 这道题删完边后是一棵树,那么一定和最小生成树有关啦. 考虑最后的生成树,无论从哪一个点出发,每一条边都会访问两次,而且在看一看样例,会发现走第w条边(u, v)的代价是L[w] * 2 + c ...

  4. Hive学习之路 (十三)Hive分析窗口函数(一) SUM,AVG,MIN,MAX

    数据准备 数据格式 cookie1,, cookie1,, cookie1,, cookie1,, cookie1,, cookie1,, cookie1,, 创建数据库及表 create datab ...

  5. docker Dockerfile 创建镜像

    Docker 组件 1. docker client : docker的客户端 2. docker server : docker daemon的主要组成部分,接受用户通过docker client发 ...

  6. Elasticsearch之如何合理分配索引分片

    大多数ElasticSearch用户在创建索引时通用会问的一个重要问题是:我需要创建多少个分片? 在本文中, 我将介绍在分片分配时的一些权衡以及不同设置带来的性能影响. 如果想搞清晰你的分片策略以及如 ...

  7. iOS 倒计时的一种实现

    1.view [self performSelectorInBackground:@selector(thread) withObject:nil]; - (void)thread { ;i>= ...

  8. VS2010调试和头文件路径设置

    1:VS2010 release 调试C/C++ -> 常规 -> 调试信息格式, 修改为程序数据库(/Zi)C/C++ ->优化 -> 优化,修改为已禁用(/Od)链接器 - ...

  9. golang 杂思

    正文 这里给大家总结一些 Go player 开发小技巧. 欢迎批评和交流, 望大家喜欢. 1. 配置管理 推荐一种简单粗暴的配置管理方式 [配置 映射 内部结构]. 例如有个配置文件 config. ...

  10. c++ 字符串和字符串库函数

    //有2个字符串定义如下: //char s1[38]="www.yjxsoft"; //char s2[]=".com"; //请编写一段代码,把字符串s2追 ...