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. Windows 某些软件显示"口口"解决办法

    和乱码不同,文字变成"口口",一般是语言环境出错了. 解决办法 开始->控制面板->区域 (时钟.语言和区域)->区域:更改设置->管理->非 Uni ...

  2. Understanding UML in seconds

    UML 是一种分析设计语言,也就是一种建模语言. UML结构解析 UML其结构主要包括以下几个部分: 视图(View) 多个图形组成的集合: 图(Diagram) 图的种类有13种图,但常用的也就两种 ...

  3. DEDEBIZ禁止发布重复标题文章的方法

    修改文件位置 /admin/article_add.php 找到 if (empty($click)) $click = ($cfg_arc_click == '-1' ? mt_rand(1000, ...

  4. 西门子300PLC转以太网无需编程实现与1200PLC转以太网数据交换

    西门子300PLC转以太网无需编程实现与1200PLC转以太网数据通信 本文介绍利用兴达易控生产的PLC转以太网模块(MPI-ETH-XD1.0Plus)实现1200/1500PLC与300(CPU3 ...

  5. OPPO主题组件开发 - 调试与预览

    本篇作为 OPPO主题组件调试与预览 文档的补充,因为它真的很简单而且太老,一些命令已发生变化 1. 调试前准备 1. PC 端下载 adb命令工具 下载 https://adbdownload.co ...

  6. Dubbo3应用开发—协议(Dubbo协议、REST协议 、gRPC协议、Triple协议)

    协议 协议简介 什么是协议 Client(Consumer端)与Server(Provider端)在传输数据时双方的约定. Dubbo3中常见的协议 1.dubbo协议[前面文章中使用的都是dubbo ...

  7. vue上通过krpano.js实现360全景图

    首先贴出一些XML对应的函数,文件内容都有注释说明, 前端代码读取xml文件代码 // 初始化 window.embedpano({ xml: 0, target: 'pano', html5: 'o ...

  8. idea2020.3 安装插件JetBrains 插件市场安装 Cloud Toolkit

    <Cloud Toolkit User Guide> 本文是 Alibaba Cloud Toolkit 的使用文档指引,所有相关的使用参考,都可以在本文中找到.如果在使用中有任何问题,请 ...

  9. IOI2020 国家集训队作业 Part 1

    日期不对,但要保证顺序正确方便查找少了啥题. 计算几何和实在不会的题没写. 9.20 CF504E Misha and LCP on Tree *3000 二分,hash,树剖 CF505E Mr. ...

  10. C# 反序列化JSON

    try { u = await WebAPIOperator.PostAsync("/v2.0/auth/user/user/login", new LoginRequestMod ...