<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;
}
結果顯示: