模板滤波实现(笔记)

<span style="font-family: Arial, Helvetica, sans-serif;">#include "stdio.h"</span>
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

/**
	pGrayImg:灰度图像数据
	pFilterImg:滤波结果图像数据
	pTemplate:模板数据
	nImgH:图像高度
	nImgW:图像宽度
	nTempH:模板高度
	nTempW:模板宽度
	fCoefs:模板系数
*/

void TemplateFilter(unsigned char* pGrayImg, unsigned char* pFilterImg,float* pTemplate, int nImgH,int nImgW,int nTempH, int nTempW,float fCoefs)
{
	// 模板中心座标求取
	int nTempCenterH = nTempH / 2;
	int nTempCenterW = nTempW / 2;
	// 模板遍历整幅图像(注意:上下左右的边缘不做处理)
	float ResultVal = 0;
	unsigned char ResultByteVal = 0;
	for (int i = nTempCenterH; i < (nImgH - 1 - nTempCenterH); i++)
	{
		for (int j = nTempCenterW; j < (nImgW - 1 - nTempCenterW); j++)
		{
			ResultVal = 0;
			ResultByteVal = 0;
			for (int nTempRow = 0; nTempRow < nTempH; nTempRow++)
			{
				for (int nTempCol = 0; nTempCol < nTempW; nTempCol++)
				{
					ResultVal += pGrayImg[(i + nTempRow - nTempCenterH)*nImgW + (j + nTempCol - nTempCenterW)] * pTemplate[nTempRow*nTempW + nTempCol];
				} //nTempCol
			}//nTempRow
			
			ResultVal *= fCoefs;
			if (ResultVal < 0)//模板有负数值时,滤波以后的值很可能是负数
			{
				ResultVal = fabs(ResultVal);
			}
			if (ResultVal > 255)
			{
				ResultByteVal = 255;
			} 
			else
			{
				ResultByteVal = (unsigned char)(ResultVal+0.5);//四舍五入
			}
			pFilterImg[i*nImgW + j] = ResultByteVal;
		}// j
	}// i
	return;
}

int main()
{
	// [1] 获取原图像数据
	Mat img = imread("lena.jpg");
	if (!img.data)
	{
		printf("read img error!\n");
	}
	Mat imgGray;
	cvtColor(img, imgGray,CV_BGR2GRAY);
	int nImgH = imgGray.rows;
	int nImgW = imgGray.cols;
	int nImgStep = imgGray.step;
	uchar* pGrayImg = imgGray.data;
	// [2] 获取滤波模板
	//float Template_HSoble[9] = {-1,0,1,-2,0,2,-1,0,1};
	float Template_HSoble[9] = { -1,-2,- 1, 0, 0, 0, 1, 2, 1 };
	// [3] 求取滤波图像
	uchar* pFilterImg = (uchar*)malloc(sizeof(uchar)*nImgH*nImgW);
	memset(pFilterImg, 0, sizeof(uchar)*nImgH*nImgW);
	TemplateFilter(pGrayImg, pFilterImg, Template_HSoble, nImgH, nImgW, 3, 3, 1.0);
	// [4]显示原图像与滤波图像
	Mat resultImg;
	resultImg.create(imgGray.rows, imgGray.cols, imgGray.type());
	resultImg.data = pFilterImg;
	namedWindow("Source Image");
	imshow("Source Image", imgGray);
	namedWindow("Filter Image");
	imshow("Filter Image", resultImg);
	cvWaitKey(0);
	return 0;
}

结果显示:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章