模板濾波實現(筆記)

<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;
}

結果顯示:


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