opencv源码之均值滤波(2)

本文介绍如何使用C++实现图像处理中的均值滤波算法,并提供了一个基于3x3模板的具体示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于opencv源码本身关于均值滤波、高斯滤波等都时调用opencv自带的滤波引擎实现,无法看到他到底怎么实现的滤波功能。但我们知道他的滤波原理,接下来我们自己写一个c++代码实现他的滤波功能(本代码可以虽然是均值滤波,但可以通过修改模板,及相应参数实现其他滤波功能,有兴趣的可以自己研究。),由于是3X3的模板效果不是很明显。

#include<iostream>
#include<opencv2\opencv.hpp>
#include<opencv2\core\core.hpp>
//均值模板
int TemplateSmoothAvg[9] = { 1, 1, 1,
                               1, 1, 1,
                               1, 1, 1 };
/****************************************
srcImg-输入图像(灰度图像)
nTempH-模板的高度
nTempW-模板的宽度
nTempMY与nTempMX-中心的坐标
fCoef-模板系数
****************************************/
void Template(const cv::Mat srcImg, cv::Mat& resultImg, int nTempH, int nTempW, int nTempMY, int nTempMX, int* fpArray, float fCoef)
{
	if (srcImg.empty())
	{
		return ;
	}
	srcImg.copyTo(resultImg);
	int i, j;
	//扫描图像进行模板操作
	for (i = nTempMY; i < resultImg.rows - (nTempH - nTempMY) + 1; i++)
	{
		for (j = nTempMX; j <resultImg.cols - (nTempW - nTempMX) + 1; j++)
		{
			int fResult = 0;
			for (int k = 0; k < nTempH; k++)
			{
				for (int l = 0; l < nTempW; l++)
				{
					fResult += srcImg.at<uchar>(i + k - nTempMY, j + l - nTempMX)*fpArray[k*nTempW + l];
				}
			}
			fResult *= fCoef;
			if (fResult>255)
			{
				fResult = 255;
			}
			if (fResult <= 0)
			{
				fResult = 0;
			}
			resultImg.at<uchar>(i, j) = fResult;
		}
	}
}
int main()
{
	cv::Mat testImg = cv::imread("test1.jpg");
	cv::Mat grayImg;
	cv::cvtColor(testImg, grayImg, CV_BGR2GRAY);
	cv::imshow("原始图像", grayImg);
	cv::Mat resultImg;
	Template(grayImg, resultImg, 3, 3, 1, 1, TemplateSmoothAvg, (float)1 / 9);
	cv::imshow("my均值滤波", resultImg);
	cv::waitKey(0);
	return 0;
}
原始图像:


均值滤波后:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值