【C++】【图像处理】均值滤波 and 高斯滤波 and 中值滤波 (低通滤波器)and Sobel算子边缘提取算法解析(以.raw格式的图像为基础进行图像处理、gray levels:256)
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. 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, ...
- opencv —— boxFilter、blur、GaussianBlur、medianBlur、bilateralFilter 线性滤波(方框滤波、均值滤波、高斯滤波)与非线性滤波(中值滤波、双边滤波)
图像滤波,指在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像与处理中不可缺少的操作. 邻域算子,指利用给定像素及其周围的像素值,决定此像素的最终输出值的一种算子.线性邻域滤波器就是一种常 ...
- 基于MATLAB的中值滤波均值滤波以及高斯滤波的实现
基于MATLAB的中值滤波均值滤波以及高斯滤波的实现 作者:lee神 1. 背景知识 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. 中值滤 ...
- matlab中fspecial Create predefined 2-D filter以及中值滤波均值滤波以及高斯滤波
来源: 1.https://ww2.mathworks.cn/help/images/ref/fspecial.html?searchHighlight=fspecial&s_tid=doc_ ...
- 学习 opencv---(8)非线性滤波:中值滤波,双边滤波
正如我们上一篇文章中讲到的,线性滤波可以实现很多种不同的图像变换.然而非线性滤波,如中值滤波器和双边滤波器,有时可以达到更好的实现效果. 邻域算子的其他一些例子还有对 二值图像进行操作的形态学算子,用 ...
- opencv-11-中值滤波及自适应中值滤波
开始之前 在上一篇我们实现了读取噪声图像, 然后 进行三种形式的均值滤波得到结果, 由于我们自己写的均值滤波未作边缘处理, 所以效果有一定的下降, 但是总体来说, 我们得到的结果能够说明我们的算法执行 ...
- Atitit 图像处理 平滑 也称 模糊, 归一化块滤波、高斯滤波、中值滤波、双边滤波)
Atitit 图像处理 平滑 也称 模糊, 归一化块滤波.高斯滤波.中值滤波.双边滤波) 是一项简单且使用频率很高的图像处理方法 用途 去噪 去雾 各种线性滤波器对图像进行平滑处理,相关OpenC ...
- OpenCV计算机视觉学习(4)——图像平滑处理(均值滤波,高斯滤波,中值滤波,双边滤波)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice &q ...
- opencv3 图片模糊操作-均值滤波 高斯滤波 中值滤波 双边滤波
#include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...
- opencv实现图像邻域均值滤波、中值滤波、高斯滤波
void CCVMFCView::OnBlurSmooth()//邻域均值滤波 { IplImage* in; in = workImg; IplImage* out = cvCreateImage( ...
随机推荐
- PHP对关联数组(键值对数组)遍历循环
PHP对关联数组循环遍历 $arr=array('yxb'=>20,'ylg'=>21,'lgj'=18); foreach($arr as $name=>$value) { ech ...
- Burp Suite Extension Development Guide
Burp Suite是什么? Burp Suite是一款Web应用程序渗透测试工具,可以帮助用户发现和利用Web应用程序中的漏洞,提高渗透测试的效率和精度. Web应用程序最常用的传输数据的协议就是H ...
- git + docker + docker-compose + Jenkins+Linux 自动化构建、部署、测试过程
Jenkins三大概念: Job:即为任务 插件:maven构建项目.git拉取代码.ssh插件 工作空间:任务的存储空间,即为git代码的存储空间 开发者在本地开发,然后提交到 Source Res ...
- 提取protobuf定义文件结构
先安装protobuf的js支持包 npm install protobufjs test.proto文件如下所示 syntax = "proto3"; package Test; ...
- java类序列化和反序列化
参考:https://zhuanlan.zhihu.com/p/144535172?utm_id=0 https://blog.csdn.net/qq_42617455/article/details ...
- Go 项目代码布局
Go 项目代码布局 目录 Go 项目代码布局 一.Go 语言"创世项目"结构 1.1 src 目录结构三个特点 二.Go 项目布局演进 2.1 演进一:Go 1.4 版本删除 pk ...
- Programming abstractions in C阅读笔记:p166-p175
<Programming Abstractions In C>学习第58天,p166-p175总结. 一.技术总结 1.斐波那契数列(Fibonacci Sequenc) (1)斐波那契数 ...
- 2023江苏省领航杯(部分CRYPTO题目复现)
决赛 回文 1.题目信息 =QfzEDO4YDNlBzN4gzN0YGM1QzYyUGZ3QDZzgDM7V2Sn52bI52Q= 2.解题方法 base64解码,两种思路: 要么是去掉前面=号解码 ...
- FFT & NTT 及其简单优化
FFT FFT 是一种高效实现 DFT 和 IDFT 的方式,可以在 \(O(n \log n)\) 的时间内求多项式的乘法. 多项式的点值表示 不同于用每项的系数来表示一个多项式,我们知道对于给定的 ...
- K8S 组合命令
强制删除namespace kubectl get namespace [namespace-name] -o json | tr -d "\n" | sed "s/\& ...