接下来按照论文里面的思想逐步实现:
1.读取需要的图片,为灰色图像,Sobel算子设置指针
IplImage* srcImg = cvLoadImage(".\\srcImg\\renlian1.jpg");
IplImage* gradImg[corNum];
IplImage* sobelImg[corNum];
IplImage* graySrcImg = cvCreateImage(cvGetSize(srcImg), srcImg->depth, 1);
2.对原图像进行高斯滤波器平滑处理,之后转换成灰度值图像。
cvCvtColor(srcImg, graySrcImg, CV_BGR2GRAY);
for(int i=0; i<1; i++)
cvSmooth(graySrcImg, graySrcImg, CV_GAUSSIAN, 3, 0, 0);
3.利用Sobel算子对灰度值图像进行卷积,计算出来Gx和Gy:
int sobel[2][9]={{-1, 0, 1,-2, 0, 2,-1, 0, 1}, {-1, -2, -1, 0, 0, 0, 1, 2, 1}};
float tempMag, tempAng;
float magX, magY;
for(int i=0; i<height; i++)
{
for(int j=0; j<width; j++)
{
unitArr[i][j].floMag = (int)( (unitArr[i][j].floMag / maxGrad) * 255 + 0.5);
}
}
for(int i=0; i<2; i++)
{
int tempA, tempB;
for(int m=0; m< height; m++)
{
for(int n=0; n< width; n++)
{
for(int l=0; l< winSize*winSize; l++)
{
tempA = abs(m + l/3 - 1) % hth;
tempB = abs(n + l%3 - 1) % wth;
tempSum = unitArr[tempA][tempB].floMag;
finalSum += tempSum * sobel[i][l];
}
finalSum = finalSum / MAX_VAL;
if(i ==0)
{
finalSum = (finalSum > 255)? 255 : finalSum;
finalSum = (finalSum < -255)? -255: finalSum;
unitArr[m][n].floX = finalSum;
}
else
{
finalSum = (finalSum > 255)? 255 : finalSum;
finalSum = (finalSum < -255)? -255: finalSum;
unitArr[m][n].floY = finalSum;
}
finalSum = 0;
tempSum = 0;
}
}
4.求出梯度的方向,方便梯度∠的计算:
unitArr[i][j].floX = -magY;
unitArr[i][j].floY = magX;
5.利用Gx和Gy 求出一阶导数:
for(int i=0; i<corNum; i++)
{
gradImg[i] = cvCreateImage(cvGetSize(srcImg), graySrcImg->depth, 1);
cvCopy(graySrcImg, gradImg[i], NULL);
}
6.之后就可以得到输出的图像了。
ps:最开始在配置opencv的环境的时候发生 了很多问题,总是缺少各种各样的文件。
其中的一些问题可以参考以下这篇博客:https://www.cnblogs.com/linshuhe/p/5764394.html。感觉写得很详细。