c++ opencv数字图像处理:空间滤波基础,低通滤波之均值滤波(盒式滤波)器-程序员宅基地

技术标签: c++  图像处理2(c++,opencv)  均值算法  opencv  

前言

数字图像处理c++ opencv(VS2019 opencv4.53)持续更新


一、空间滤波基础

1.线性空间滤波原理

线性空间滤波器在图像f和滤波器核w之间执行乘积之和运算。用邻域像素改变中心像素的灰度值大小。
在这里插入图片描述


2.相关与卷积

相关以上面的滤波运算方法对图像进行遍历处即使w每个像素能够访问图像f中每个像素。卷积运算时将滤波器核w旋转180°再处理。
在这里插入图片描述


3.可分离滤波器核

卷积相关都存在分配律,即:
在这里插入图片描述
当一个滤波器核w可以表示为两个向量的积时:
w = c r T w=cr^T w=crT
w就是一个可分离滤波器核。
比如盒式滤波器核(均值滤波):
在这里插入图片描述

可分离滤波器好处:
对于大小为MN的图像和大小为mn的滤波器核,进行滤波时要MNmn次乘法和加法运算。而分离为两个m和n的向量后,计算次数为MN(m+n)次,两种计算次数之比为:
C = M N m n M N ( m + n ) = m n m + n C=\frac{MNmn}{MN(m+n)}=\frac{mn}{m+n} C=MN(m+n)MNmn=m+nmn
大大减少计算次数。


二、平滑(低通)滤波

1.盒式滤波器核(均值滤波器)

一个3*3大小的盒式滤波器核如下:
在这里插入图片描述
使用盒式滤波器对图像进行滤波,代码如下(示例):

#include<iostream>
#include<opencv2/opencv.hpp>
#include"Salt.h"

using namespace cv;
using namespace std;

//定义盒式滤波函数
void myfilter(int filter_size, Mat& image_input, Mat& image_output);


int main()
{
     
	Mat image, image_gray, image_output, image_output2;   //定义输入图像,灰度图像,输出图像
	image = imread("lena.png");  //读取图像;
	if (image.empty())
	{
    
		cout << "读取错误" << endl;
		return -1;
	}
	imshow("image", image);

	cvtColor(image, image_gray, COLOR_BGR2GRAY);
	Salt(image_gray, 1000);   //添加噪声
	imshow("image_gray", image_gray);



	//自己编写的程序
	int filter_size = 7;  //滤波器大小
	myfilter(filter_size, image_gray, image_output);

	//opencv自带程序
	blur(image_gray, image_output2, Size(7, 7));


	imshow("image_output", image_output);
	imshow("image_output2", image_output2);

	waitKey(0);  //暂停,保持图像显示,等待按键结束
	return 0;
}


//实现盒式滤波
void myfilter(int filter_size, Mat& image_input, Mat&  image_output)
{
    
	image_output = image_input.clone();

	int k = (filter_size-1) / 2;
	for (int i = k; i < (image_input.rows - k); i++)
	{
    
		for (int j = k; j < (image_input.cols - k); j++)
		{
    
			
			int sum = 0;
			for (int m = -k; m < k + 1; m++)
			{
    
				for (int n = -k; n < k + 1; n++)
				{
    
					sum = sum + image_input.at<uchar>(i + m, j + n) ;					
				}
			}
			image_output.at<uchar>(i, j) = round(sum / (filter_size * filter_size));
		}
	}
}

噪声程序.h文件

#pragma once
#include<iostream>
#include<opencv2/opencv.hpp>
#include <random>


using namespace cv;
using namespace std;

void Salt(Mat image, int n);

噪声程序.cpp文件

#include "Salt.h"

void Salt(Mat image, int n)
{
    
	default_random_engine generater;
	uniform_int_distribution<int>randomRow(0, image.rows - 1);
	uniform_int_distribution<int>randomCol(0, image.cols - 1);

	int i, j;
	for (int k = 0; k < n; k++)
	{
    
		i = randomCol(generater);
		j = randomRow(generater);
		if (image.channels() == 1)
		{
    
			image.at<uchar>(j, i) = 255;
		}
		else if (image.channels() == 3)
		{
    
			image.at<Vec3b>(j, i)[0] = 255;
			image.at<Vec3b>(j, i)[1] = 255;
			image.at<Vec3b>(j, i)[2] = 255;
		}
	}
}

结果:
在这里插入图片描述


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44785013/article/details/120437747

智能推荐

ES脑裂问题-程序员宅基地

文章浏览阅读110次。脑裂:一个集群中的不同节点对于集群的状态有了不一样的理解ES集群的总体状态是red,本来9个节点的集群在结果中只显示4个节点在线;正常情况下,集群中的所有节点应该对集群中的master的选择是一致的,这样获得的状态信息也应该是一致的,不一样的状态信息,说明不同的节点对master的选择出现了异常-----也就是所谓的脑裂问题,这样的脑裂状态直接让节点失去了集群的正确状态,导致集群不能..._es脑裂问题

时间片转轮进程调度_在visual c++6.0集成开发环境下使用c语言,利用相应的win32api函数,编写程序实-程序员宅基地

文章浏览阅读2.2k次,点赞11次,收藏26次。实验2 时间片转轮进程调度1.实验目的和要求(1)掌握时间片轮转进程调度的概念和算法。(2)加深对处理机分配的理解。2.实验内容在Visual C++ 6.0集成开发环境下使用C语言,利用相应的 Win32API函数﹐编写程序实现时间片轮转进程调度算法,学会运行程序和中断当前程序的运行。3.实验原理与提示轮转法就是按一定时间片(记为q)轮番运行各个进程。如果q是一个定值,则轮转法是一种对各进程机会均等的调度方法。进程调度算法的数据结构主要有:进程函数定义,建立进程函数,进程调度函数_在visual c++6.0集成开发环境下使用c语言,利用相应的win32api函数,编写程序实

使用MATLAB 将EASE-Grid 2.0投影坐标系下 的NC文件转换为相同坐标系下的geotiff文件_ease-grid 2.0 投影-程序员宅基地

文章浏览阅读9.1k次,点赞15次,收藏57次。目录以SMOS L3 土壤水分产品数据为例EASE-Grid2.0 不同分辨率网格参数使用maprefcells创建对应网格参照系转换后的tiff文件检查以SMOS L3 土壤水分产品数据为例SMOS L3 级土壤水分产品是 .nc 格式的,分辨率为25km,要将其转换为geotiff格式的,这里有两种方法。第一种方法是最简单的,在网上找一个EASE-Grid2.0 25km的 .tif 模..._ease-grid 2.0 投影

给IT新人的15点建议-程序员宅基地

文章浏览阅读780次。很多人表面上看着老实巴交的,实际上内心比谁都好强、自负、虚荣、甚至阴险。工作中见的多了,也就习惯了。有一些人,什么事都写在脸上,表面上经常得罪人,甚至让人讨厌。但是他们所表现的又未必不是真性情。我相信大多数人都看过《豪门夜宴》这部香港老电影。张学友、梁朝伟演的拍马屁的场景太有意思了,其中有这样一段:当两马屁精帮老板说出主意,老板马上叫停,然后拍一下脑门:“哦。。。我想到

使 WebBrowser 更简单的新加和执行 js, 可安装 jQuery 脚本的 C# 开源代码 - IEBrowse..._webbrowser 添加js-程序员宅基地

文章浏览阅读1.4w次。使 WebBrowser 更简单的新加和执行 js, 可安装 jQuery 脚本的 C# 开源代码 - IEBrowse..._webbrowser 添加js

linux 编译object,Ubuntu下Object-C开发环境搭建-程序员宅基地

文章浏览阅读369次。一.下午1点到5点半,iPhone的application介绍会,做了4个简单的application,确实很有意思。二.以下共有三种方法,只有第三种方法成功了1.You can program the Objective-C without MacBook.Please refer the below link to install Objective-C compiler in you Ubu..._ubuntu没能处理object code的程序

随便推点

计算机控制系统2009,2009-计算机控制系统考试题-程序员宅基地

文章浏览阅读82次。《2009-计算机控制系统考试题》由会员分享,可在线阅读,更多相关《2009-计算机控制系统考试题(3页珍藏版)》请在人人文库网上搜索。1、共12题,选作10题,共100分。开卷。1 简述SHANNON采样定理。(4分)在离散时间实时控制系统中使用香农采样定理时应注意哪些问题?为什么?(6分)2 Z变换是如何定义的?(5分)对离散时间动态系统进行分析和设计时,为什么要使用Z变换?(5分)3 已知差..._计算机控制系统 试题

EndNote自动生成毕业论文GB7714引文格式教程_学位论文 gb7714 endnote-程序员宅基地

文章浏览阅读5.2k次,点赞3次,收藏16次。引用外文文献时,自己手动改很头疼,没引用一个,都要对照格式对不对,并且期刊、报告、会议、图书的格式都不同,费时费力;并且很多文献来自荒郊野外,也不确定自己造的引文格式对不对;使用EndNote则摆脱了这个烦恼。_学位论文 gb7714 endnote

什么是横向扩展、纵向扩展?_横向拓展-程序员宅基地

文章浏览阅读8.4k次,点赞5次,收藏8次。什么是横向扩展、纵向扩展?横向扩展英文简称:Scale Out,全称:Scale horizontally,横向扩展,向外扩展。纵向扩展英文简称:Scale Up,全称:Scale vertically,纵向扩展,向上扩展。不管横向扩展还是纵向扩展都是一种架构的概念。横向扩展:比如可以增加一台节点/机器 比如:mysql新增加一个从库、tomcat新增加一台机器;纵向扩展:比如可以通过修改mysql参数内存比例、修改tomcat的线程数;注:如果纵向扩展升级硬件比如CPU升级成6.._横向拓展

模态框中弹模态框的问题_vue 模态框 再弹模态框有什么限制-程序员宅基地

文章浏览阅读2.1k次。有时候会遇到模态框中弹另外一个模态框的时候,若是旧模态框需要隐藏的时候,直接在点击事件里加上$('#aaa').modal('hide')即可,若是想旧模态框一直保持,但是新模态框也要弹出,这样的话,新模态框z-index应该大于旧模态框;若是 div中load模态框的话,必须把加载新模态框的div放在加载旧模态框的div之后才能生效。..._vue 模态框 再弹模态框有什么限制

linux下如何部署(执行)java jar包,并关闭此jar的进程_java -jar access rizhi-程序员宅基地

文章浏览阅读6.5k次。 1.执行jar包的命令和在windows操作系统上是一样的,都是java -jar xxxx.jar。2.将jar程序设置成后台运行,并且将标准输出的日志重定向至文件AccessLOG.log。打开jar文件:Vim xxx.jar 找配置文件 :/config:wq 退出nohup java -jar AccessControlService-0.0.1-SNA..._java -jar access rizhi

经典算法---渊子赛马_python渊子赛马-程序员宅基地

文章浏览阅读1.6k次。描述赛马是一古老的游戏,早在公元前四世纪的中国,处在诸侯割据的状态,历史上称为“战国时期”。在魏国作官的孙膑,因为受到同僚庞涓的迫害,被齐国使臣救出后,到达齐国国都。 赛马是当时最受齐国贵族欢迎的娱乐项目。上至国王,下到大臣,常常以赛马取乐,并以重金赌输赢。田忌多次与国王及其他大臣赌输赢,屡赌屡输。一天他赛马又输了,回家后闷闷不乐。孙膑安慰他说:“下次有机会带我到马场看看,也许我能帮你_python渊子赛马

推荐文章

热门文章

相关标签