空间滤波原理

使用大小为m*n的滤波器对大小为M*N的图像进行线性空间滤波,将滤波器模板乘以图像中对应灰度值,相加得模板中心灰度值

a = (m-1)/2, b = (n-1)/2

若f(x+s, y+t)不在原图内,补0

平滑线性滤波器

滤波过程

分母为滤波器模板和

代码实现

 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[]; /* linear filtering */
short sum;
for (int i = ; i < ARRAY_SIZE; i++)
for (int j = ; j < ARRAY_SIZE; j++)
sum += average[i][j]; 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+] : ; /* linear filtering */
out_array[i][j] = (value[] * average[][] + value[] * average[][] + value[] * average[][] +
value[] * average[][] + value[] * average[][] + value[] * average[][] +
value[] * average[][] + value[] * average[][] + value[] * average[][]) / sum; }
}
}

原图

模板

结果

可以看出线性滤波器会较大程度地影响原图,降低对比度,对与图片右上角的噪声没有明显的去除效果

统计排序(非线性)滤波器

中值滤波器

中值滤波器对处理脉冲噪声非常有效,这种噪声被称为椒盐噪声

实现方法:取该像素某邻域中值(本次测试取3*3)

代码实现

 short mid_val(short* a, short num)
{
short temp; for (int i = ; i < num; i++)
{
temp = a[i];
int j = i;
for (; j > && a[j - ] > temp; j--)
a[j] = a[j - ];
a[j] = temp;
} return a[num/];
}
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+] : ; /* median filtering */
out_array[i][j] = mid_val(value, ); }
}
}

锐化空间滤波器

一阶微分

二阶微分

二阶微分在增强细节方面比一阶微分好很多,适合锐化图像

使用二阶微分进行图像锐化-拉普拉斯算子

代码实现

 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+] : ; /* sharpening filtering */
out_array[i][j] = value[] * sharpen[][] + value[] * sharpen[][] + value[] * sharpen[][] +
value[] * sharpen[][] + value[] * sharpen[][] + value[] * sharpen[][] +
value[] * sharpen[][] + value[] * sharpen[][] + value[] * sharpen[][];
out_array[i][j] += in_array[i][j];
if (out_array[i][j] < )
out_array[i][j] = ;
else if (out_array[i][j] > 0xff)
out_array[i][j] = 0xff; }
}
}

原图

锐化

使用一阶微分对(非线性)图像锐化-梯度

实现边缘增强

算法实现

 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+] : ; /* sharpening using grad */
out_array[i][j] = (short)abs(value[] * soble1[][] + value[] * soble1[][] + value[] * soble1[][] +
value[] * soble1[][] + value[] * soble1[][] + value[] * soble1[][] +
value[] * soble1[][] + value[] * soble1[][] + value[] * soble1[][]) +
(short)abs(value[] * soble2[][] + value[] * soble2[][] + value[] * soble2[][] +
value[] * soble2[][] + value[] * soble2[][] + value[] * soble2[][] +
value[] * soble2[][] + value[] * soble2[][] + value[] * soble2[][]);
}
}
}

原图

边缘图

边缘增强

如果卷积和大于用户选择的的阈值,值为该和,否则,值为原图灰度值,选阈值为200

仅需在上述代码中添加

 /* edge enhancement */
if (out_array[i][j] < )
out_array[i][j] = ;
else if (out_array[i][j] > 0xff)
out_array[i][j] = 0xff;
else if (out_array[i][j] > )
;
else
out_array[i][j] = in_array[i][j];

边缘增强图

c语言数字图像处理(五):空间滤波的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. c语言数字图像处理(八):噪声模型及均值滤波器

    图像退化/复原过程模型 高斯噪声 PDF(概率密度函数) 生成高斯随机数序列 算法可参考<http://www.doc.ic.ac.uk/~wl/papers/07/csur07dt.pdf&g ...

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

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

  8. c语言数字图像处理(六):二维离散傅里叶变换

    基础知识 复数表示 C = R + jI 极坐标:C = |C|(cosθ + jsinθ) 欧拉公式:C = |C|ejθ 有关更多的时域与复频域的知识可以学习复变函数与积分变换,本篇文章只给出DF ...

  9. c语言数字图像处理(四):灰度变换

    灰度变换 灰度变换函数 s = T(r)   其中r为输入图像在(x, y)点处的灰度值,s为输出图像在(x, y)点处的灰度值 灰度变换的作用 上图所示的两幅T(s)函数的图像曲线,第一幅图可以增强 ...

随机推荐

  1. codeforces 547E Mike and Friends

    codeforces 547E Mike and Friends 题意 题解 代码 #include<bits/stdc++.h> using namespace std; #define ...

  2. angularjs中URL中的#号问题,$locationProvider.html5Mode(true)刷新404

    解决办法原文地址:https://blog.csdn.net/weixin_36185028/article/details/72179568 angularjs支持两种url模式,hash模式和ht ...

  3. 1003. [ZJOI2006]物流运输【区间DP+最短路】

    Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转 停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严 ...

  4. Java并发编程--6.Exchanger线程间交换数据

    在两个线程之间定义同步点,当两个线程都到达同步点时,他们交换数据结构,因此第一个线程的数据结构进入到第二个线程中,第二个线程的数据结构进入到第一个线程中 在生产者-消费者情境模式中它包含了一个数缓冲区 ...

  5. Java并发编程--7.Java内存操作总结

    主内存和工作内存 工作规则 Java内存模型, 定义变量的访问规则, 即将共享变量存储到内存和取出内存的底层细节  所有的变量都存储在主内存中,每条线程有自己的工作内存,工作内存中用到的变量, 是从主 ...

  6. django 模板关闭自动转义

    Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全.但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰 ...

  7. 记录一下iOS Leak的使用方法。

    观测过程中不需要使用xcode.只需观察Leak工具即可 1:选中Xcode,点击左上角的Xcode.找到tool   然后找到instrument.如下图 2:打开instrument 找到Leak ...

  8. codewars-7kyu:Sum of the first nth term of Series

    Task: Your task is to write a function which returns the sum of following series upto nth term(param ...

  9. 通过ReentrantLock简单了解下并发包中的锁

    ReentrantLock在进行实例化时,可以通过构造函数的参数选择是否使用公平锁FairSync或者非公平锁NonfairSync,两者的区别比较简单,如果是公平锁则新来的线程会先检测同步队列中是否 ...

  10. 【VCS】种草VSCode

    VSCode官网 特点:更轻量.集成Git.快速diff:文件目录管理,自定义配置,插件库 种草推文 下载地址 下载安装VSCode之后按照种草推文指南 配置VSC的扩展开发(有个前提:注册了Micr ...