请问我要用灰度梯度的方法来找到灰度图像中的圆边缘。现在我的思路是将图像的所有列的像素值依次累加求和,再取均值。这样在圆的区域它的灰度均值会有一个波峰。然后将得到的(1,iwdith)大小的一维矩阵求导数得到梯度矩阵。那么找到这个梯度矩阵中的最大值的位置就是圆边左边边缘的宽度方向上的位置。以下是实现代码,哪里出错了?一直找不到对的边缘位置。。。还有程序中的数据类型可能因为有问题,请大家多多指出啊~~
#include "stdafx.h"
#include "highgui.h"
#include
using namespace std;
using namespace cv;
IplImage* GrayImage;
int main()
{
const char *pstrImageName = "D:\\picture\\New\\1 (4).bmp";
GrayImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_GRAYSCALE);
cvShowImage("灰度图像",GrayImage);
Mat SmothImage ;
Mat AverageVal = cvCreateMat(1, GrayImage->width, CV_64FC1);
Mat Gray_Image(GrayImage);
GaussianBlur( Gray_Image, SmothImage, Size( 3, 3 ), 0, 0 );
imshow("高斯滤波处理",SmothImage);
int iWidth = SmothImage.rows;
int iHeight = SmothImage.cols;
int i,j;
cv::Mat AverageValue( 1, iWidth, CV_32FC1 );
for (i=0;i<iWidth;i++)
{
float value = 0;
for (j=0;j<iHeight;j++)
{
value = value + (float)SmothImage.at<uchar>(j,i);
}
value = value/(float)iHeight;
//CV_MAT_ELEM( *AverageValue, float,0, i ) = value;
AverageValue.at<uchar>(0,i) = value;
//printf("%f\n",AverageValue.at<float>(0,i));
}
imshow("所有列灰度均值",AverageValue);
cv::Mat GradValue(1,iWidth, CV_32FC1);
for (i=0;i<iWidth-1;i++)
{
GradValue.at<uchar>(0,i) = (float)AverageValue.at<uchar>(0,i+1)-(float)AverageValue.at<uchar>(0,i);
printf("%f\n",(float)AverageValue.at<uchar>(0,i+1)-(float)AverageValue.at<uchar>(0,i));
}
GradValue.at<uchar>(0,iWidth) =0;
double minVal, maxVal;
Point minLoc, maxLoc, matchLoc;
minMaxLoc(GradValue, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );
circle( SmothImage, maxLoc, 4, Scalar(255,0,255), -1, 8, 0 );
imshow("边界点所在位置",SmothImage);
cvWaitKey();
return 0;
}