<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;
}
结果显示: