【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( ...
随机推荐
- 从Google开发者大会浅谈LLM的应用
这周参加了在上海世博中心举办Google I/O Connect中国开发者大会,有几年没参加这么高质量的活动,有点感慨. 期间重点听了关于GCP和Google AI大语言模型的主题演讲,发现目前各大厂 ...
- IOS苹果应用IPA一键签名工具(苹果重签名,企业签名,Windows平台,时间控制)
苹果应用IPA一键签名工具可以在windows平台对苹果应用IPA文件重新签名,无需MAC苹果电脑和配置XCODE开发环境,便可以直接对IPA文件进行签名,同时支持修改BundleID, 不受描述文件 ...
- 【krpano】图文案例
KRPano图文案例可以展示图片和文字,并支持图片放大浏览,以及文本拖动等操作. 具体截图如下: 下载地址:http://pan.baidu.com/s/1qXQnPes 感谢群内小伙伴 快乐分享 本 ...
- doris建表报错 errCode = 2, detailMessage = Scale of decimal must between 0 and 9. Scale was set to: 10
doris建表报错 问题背景 当我从Mpp库向doris库中导数据时,需要先创建对应的数据表,将Mpp库中表的建表语句略作修改后,在doris服务器上运行 CREATE TABLE opt_conne ...
- Note -「SOS DP」高维前缀和
本文差不多算是翻译了一遍 CF blog?id=45223 就是抄了一遍,看不懂可以去原文. 当然我的翻译并不是完全遵从原文的. Part. 1 Introduction 平时我们怎么求高维前缀和?容 ...
- 【python爬虫】爬虫所需要的爬虫代理ip是什么?
前言 在进行爬虫程序开发时,经常会遇到访问被限制的网站,这时就需要使用代理 IP 来进行访问.本文将介绍代理 IP 的概念及使用方法,帮助读者更好地应对爬虫程序中的访问限制问题.同时,本文还将提供一些 ...
- P8684 [蓝桥杯 2019 省 B] 灵能传输 题解
P8684 [蓝桥杯 2019 省 B] 灵能传输 题解 Part 1 提示 题目传送门 欢迎大家指出错误并私信这个蒟蒻 欢迎大家在下方评论区写出自己的疑问(记得 @ 这个蒟蒻) Part 2 更新日 ...
- 分布式应用开发的核心技术系列之——基于TCP/IP的原始消息设计
本文由葡萄城技术团队原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 本文的内容主要围绕以下几个部分: TCP/IP的简单介绍. 消息的介绍 ...
- Android Studio3.2.1升级刨坑记录
Android Studio出了3.2.1,我用的是2.3,所有决定升级一下,看看如何 为了保险一点,下载了官方的解压版本,也就是说不含sdk,下载android-studio-ide-181.501 ...
- 删除小程序scroll-view的滚动条
小程序scroll-view滚动条很丑,想隐藏? 在有scroll-view滚动条页面的wxss里添加: ::-webkit-scrollbar { display: none; width: 0; ...