int GetVerticalBoundaryPositon(const Mat& src, const int widthStep, bool isMax)
{
if (src.data == NULL)
{
return 0;
}
Mat inputImg = src.clone();
Mat gradient = Mat::zeros(1, src.cols, CV_32FC1);
int sum = 0;
for (int i = widthStep; i < src.rows - widthStep; i++)
{
for (int j = 0; j < src.cols; j++)
{
for (int k = 0; k < widthStep; k++)
{
sum += abs(src.at<char>(i + k, j) - src.at<char>(i - k, j));
}
}
gradient.at<float>(0, i) = (float)sum;
}
double minVal, maxVal;
Point minPst, maxPst;
minMaxLoc(gradient, &minVal, &maxVal, &minPst, &maxPst);
int postion = 0;
if (isMax)
{
postion = maxPst.y;
}
else
{
postion = minPst.y;
}
return postion;
}
int GetVerticalBoundaryPosition2(const Mat& src, Rect roi)
{
if (src.data == NULL)
{
return 0;
}
Mat sobelImg;
//GaussianBlur(src, src, Size(5, 5), 5);
Sobel(src, sobelImg, -1, 0, 1, 3);
Mat gradientImg;
sobelImg(roi).copyTo(gradientImg);
Mat gradient = Mat::zeros(1, gradientImg.rows, CV_32FC1);
for (int i = 0; i < gradientImg.rows; i++)
{
char* data = gradientImg.ptr<char>(i);
int sum = 0;
for (int j = 0; j < gradientImg.cols; j++)
{
sum += data[j];
}
gradient.at<float>(0, i) = abs((float)sum);
}
double minVal, maxVal;
Point minPst, maxPst;
minMaxLoc(gradient, &minVal, &maxVal, &minPst, &maxPst);
return maxPst.y;
}
两种求灰度图取梯度最大值的方法
最新推荐文章于 2022-02-16 18:30:00 发布
该博客主要介绍了两种垂直边界位置的检测方法。首先,通过计算像素差的绝对值求和,找到最大或最小值来确定边界;其次,使用Sobel算子提取梯度,再找出最大值定位边界。这两种方法适用于图像处理和计算机视觉领域的边缘检测。
摘要由CSDN通过智能技术生成