1 void meanFilter(BYTE* image, int width, int height, BYTE* outImg)
2 {
3 //均值滤波
4 int smth[9];
5 int i, j, m, n;
6 BYTE block[9];
7
8 // 高斯卷积核初始化
9 smth[0] = 1, smth[1] = 2, smth[2] = 1,
10 smth[3] = 2, smth[4] = 4, smth[5] = 2,
11 smth[6] = 1, smth[7] = 2, smth[8] = 1;
12
13 int value;
14 for (i = 0;i < 9;i++) //初始化均值卷积核
15 smth[i] = 1;
16
17 for (i = 0;i < height;i++)
18 for (j = 0;j < width;j++) {
19 //将输出图像边缘的像素值设为 0
20 if (i == 0 || j == 0 || i == height - 1 || j == width - 1)
21 outImg[i * width + j] = 0;
22
23 //提取以当前像素为中心的 3x3 区域的像素值,然后利用卷积操作计算这个区域的均值,最后将计算得到的均值作为输出图像中对应位置的像素值
24 else {
25 for (m = -1;m < 2;m++)
26 for (n = -1;n < 2;n++)
27 block[(m + 1) * 3 + n + 1] = image[(i + m) * width + j + n];
28 value = convolution(smth, block);
29 outImg[i * width + j] = BYTE(value / 9.0f); // 高斯为 value / 16.0f
30 }
31 }
32
33 }
34
35
36 int convolution(int* operatr, BYTE* block)
37 {
38 int value;
39 int i, j;
40 value = 0;
41 //卷积运算
42 //遍历 3x3 区域内的每个像素,并根据卷积核的权重计算出卷积结果
43 for (i = 0;i < 3;i++)
44 for (j = 0;j < 3;j++)
45 value += operatr[i * 3 + j] * block[i * 3 + j];
46 /*
47 1 1 1
48 1 1 1
49 1 1 1
50
51 0 0 0
52 0 x y
53 0 j k
54 */
55
56 return value;
57
58 }

中值滤波:

 1 void midFindFiltering(BYTE* image, int width, int height, BYTE* outImg)
2 {
3 //中值滤波
4 int i, j, m, n;
5 BYTE block[9];
6
7 int value;
8
9 for (i = 0;i < height;i++)
10 for (j = 0;j < width;j++) {
11 if (i == 0 || j == 0 || i == height - 1 || j == width - 1)
12 outImg[i * width + j] = 0;
13 else {
14 for (m = -1;m < 2;m++)
15 for (n = -1;n < 2;n++)
16 block[(m + 1) * 3 + n + 1] = image[(i + m) * width + j + n];
17 }
18 value = MidValueFind(sizeof(block), block);
19 outImg[i * width + j] = value;
20 }
21 }

中值滤波中的MidValueFind函数的实现就是冒泡排序,最后去中间值返回:

int MidValueFind(int num, BYTE* d)
{
int value; int i, j;
int temp;
//冒泡排序
for (i = 0; i < num - 1; i++)
for (j = i + 1; j < num; j++)
{
if (d[i] < d[j])
{
temp = d[i];
d[i] = d[j];
d[j] = temp;
}
} return d[num / 2]; }

Soble算子边缘提取:

 1 void sobel(BYTE* window, int wid, int hei, int* sob_x, int* sob_y)
2 {
3 int so_x[9];//horizontal 水平边缘提取卷积核初始化
4 so_x[0] = -1, so_x[1] = 0, so_x[2] = 1,
5 so_x[3] = -2, so_x[4] = 0, so_x[5] = 2,
6 so_x[6] = -1, so_x[7] = 0, so_x[8] = 1;
7
8 int so_y[9];//vertical 垂直边缘提取卷积核初始化
9 so_y[0] = -1, so_y[1] = -2, so_y[2] = -1,
10 so_y[3] = 0, so_y[4] = 0, so_y[5] = 0,
11 so_y[6] = 1, so_y[7] = 2, so_y[8] = 1;
12
13 int i, j, m, n;
14 BYTE block[9];
15 int value;
16
17 //求图像边缘
18 for (i = 0;i < hei;i++)
19 for (j = 0;j < wid;j++) {
20 if (i == 0 || j == 0 || i == hei - 1 || j == wid - 1) {
21 sob_x[i * wid + j] = sob_y[i * wid + j] = 0; // 输出图像边缘归零
22 }
23 else {
24 for (m = -1;m < 2;m++)
25 for (n = -1;n < 2;n++)
26 block[(m + 1) * 3 + n + 1] = window[(i + m) * wid + j + n];
27 }
28 sob_x[i * wid + j] = convolution(so_x, block);
29 sob_y[i * wid + j] = convolution(so_y, block);
30
31 }
32 }

总结:

1、均值、高斯滤波和Sobel算子边缘提取的核心,创建卷积核并确定各个点上的权重,然后将边缘灰度级归零(是否边缘归零按业务需求决定),提取非边缘像素点的3x3区域的像素级,最后计算卷积结果再输出。

2、中值滤波核心也可看为是卷积核,但是并不是在卷积核上计算权重,而是进行排序(升降均可)后直接取中间值来确定当前这一点的灰度级。

【C++】【图像处理】均值滤波 and 高斯滤波 and 中值滤波 (低通滤波器)and Sobel算子边缘提取算法解析(以.raw格式的图像为基础进行图像处理、gray levels:256)的更多相关文章

  1. 机器学习进阶-阈值与平滑-图像平滑操作(去噪操作) 1. cv2.blur(均值滤波) 2.cv2.boxfilter(方框滤波) 3. cv2.Guassiannblur(进行高斯滤波) 4. cv2.medianBlur(进行中值滤波)

    1.cv2.blur(img, (3, 3))  进行均值滤波 参数说明:img表示输入的图片, (3, 3) 表示进行均值滤波的方框大小 2. cv2.boxfilter(img, -1, (3, ...

  2. opencv —— boxFilter、blur、GaussianBlur、medianBlur、bilateralFilter 线性滤波(方框滤波、均值滤波、高斯滤波)与非线性滤波(中值滤波、双边滤波)

    图像滤波,指在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像与处理中不可缺少的操作. 邻域算子,指利用给定像素及其周围的像素值,决定此像素的最终输出值的一种算子.线性邻域滤波器就是一种常 ...

  3. 基于MATLAB的中值滤波均值滤波以及高斯滤波的实现

    基于MATLAB的中值滤波均值滤波以及高斯滤波的实现 作者:lee神 1.   背景知识 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. 中值滤 ...

  4. matlab中fspecial Create predefined 2-D filter以及中值滤波均值滤波以及高斯滤波

    来源: 1.https://ww2.mathworks.cn/help/images/ref/fspecial.html?searchHighlight=fspecial&s_tid=doc_ ...

  5. 学习 opencv---(8)非线性滤波:中值滤波,双边滤波

    正如我们上一篇文章中讲到的,线性滤波可以实现很多种不同的图像变换.然而非线性滤波,如中值滤波器和双边滤波器,有时可以达到更好的实现效果. 邻域算子的其他一些例子还有对 二值图像进行操作的形态学算子,用 ...

  6. opencv-11-中值滤波及自适应中值滤波

    开始之前 在上一篇我们实现了读取噪声图像, 然后 进行三种形式的均值滤波得到结果, 由于我们自己写的均值滤波未作边缘处理, 所以效果有一定的下降, 但是总体来说, 我们得到的结果能够说明我们的算法执行 ...

  7. Atitit   图像处理 平滑 也称 模糊, 归一化块滤波、高斯滤波、中值滤波、双边滤波)

    Atitit   图像处理 平滑 也称 模糊, 归一化块滤波.高斯滤波.中值滤波.双边滤波) 是一项简单且使用频率很高的图像处理方法 用途 去噪 去雾 各种线性滤波器对图像进行平滑处理,相关OpenC ...

  8. OpenCV计算机视觉学习(4)——图像平滑处理(均值滤波,高斯滤波,中值滤波,双边滤波)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice &q ...

  9. opencv3 图片模糊操作-均值滤波 高斯滤波 中值滤波 双边滤波

    #include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...

  10. opencv实现图像邻域均值滤波、中值滤波、高斯滤波

    void CCVMFCView::OnBlurSmooth()//邻域均值滤波 { IplImage* in; in = workImg; IplImage* out = cvCreateImage( ...

随机推荐

  1. 关闭k8s的pod时减小对服务的影响

    在应用程序的整个生命周期中,正在运行的 pod 会由于多种原因而终止.在某些情况下,Kubernetes 会因用户输入(例如更新或删除 Deployment 时)而终止 pod.在其他情况下,Kube ...

  2. mysql锁初识

    MySQL锁的粒度分为:行级锁.表级锁.页级锁. 一.行级锁(INNODB引擎) 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁. 行级锁能大大减少数据库操作的冲突.其加锁粒 ...

  3. numpy 中的nan和常用的统计方法

  4. 文心一言 VS 讯飞星火 VS chatgpt (101)-- 算法导论9.3 7题

    七.用go语言,设计一个 O(n)时间的算法,对于一个给定的包含n个互异元素的集合 S 和一个正整数k≤n,该算法能够确定 S 中最接近中位数的k个元素. 文心一言: 要设计一个 O(n) 时间的算法 ...

  5. xftp 7必须更新最新版本怎么解决

    下载可以查看16进制的软件: Sublime Text 运行XFTP7 双击打开是:这样的 解决方案 用Sublime Text进行打开nslicense.dll, 打开之后查找"0f88 ...

  6. 文心一言 VS 讯飞星火 VS chatgpt (106)-- 算法导论10.1 4题

    四.用go语言,重写 ENQUEUE 和 DEQUEUE 的代码,使之能处理队列的下溢和上溢. 文心一言: 在 Go 语言中,我们可以使用切片来实现队列.下面是如何实现 ENQUEUE 和 DEQUE ...

  7. aspnetcore微服务之间grpc通信,无proto文件

    aspnetcore微服务之间通信grpc,一般服务对外接口用restful架构,HTTP请求,服务之间的通信grpc多走内网. 以前写过一篇grpc和web前端之间的通讯,代码如下: exercis ...

  8. 原来 Lambda 这么简单

    目录 前身 -- 匿名类 lambda 表达式 方法引用 类名::静态方法 类名::实例方法 对象::实例方法 总结 前身 -- 匿名类 何为匿名类? 没有类名,直接通过new关键字创建这个类的实例 ...

  9. 【Java集合】单列集合Collection常用方法详解

    嗨~ 今天的你过得还好吗? 路途漫漫终有一归, 幸与不幸都有尽头. 在上篇文章中,我们简单介绍了下Java 集合家族中的成员,那么本篇文章,我们就来看看 Java在单列集合中,为我们提供的一些方法,以 ...

  10. Docker从了解到部署应用的详细教程

    一.Docker基础知识 1.Docker (1)Docker可以让开发者打包他们的应用以及依赖包到一个轻量级.可以移植的容器中,然后发布到任何的linux机器上,可以实现虚拟化: (2)Docker ...