gpt4 book ai didi

c++ - 在 OpenCV C++ 中查找 Mat() 的所有峰值

转载 作者:行者123 更新时间:2023-11-28 06:23:58 40 4
gpt4 key购买 nike

我想找到我的图像的所有最大值(非零像素的数量)。我需要它以这种方式划分我的图片:

enter image description here

所以,我已经问了question ,如何将所有图像投影到其中一个轴,现在我需要在这个单行图像上找到所有最大值。这是我的代码部分:

void segment_plate (Mat input_image) {
double minVal;
double maxVal;
Point minLoc;
Point maxLoc;
Mat work_image = input_image;
Mat output;
//binarize image
adaptiveThreshold(work_image,work_image, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, 10);
//project it to one axis
reduce(work_image,output,0,CV_REDUCE_SUM,CV_32S);

//find minimum and maximum falue for ALL image
minMaxLoc(output, &minVal,&maxVal,&minLoc,&maxLoc);
cout << "min val : " << minVal << endl;
cout << "max val: " << maxVal << endl;

如您所见,我可以为所有图片找到一个最大值和一个最小值,但我需要找到局部最大值。感谢您的帮助!

编辑好的,所以我犯了一个错误,我需要找到这个 vector 的峰值。我使用这段代码找到了第一个峰值:

int findPeakUtil(Mat arr, int low, int high, int n) {
// Find index of middle element
int mid = low + (high - low)/2; /* (low + high)/2 */

// Compare middle element with its neighbours (if neighbours exist)
if ((mid == 0 || arr.at<int>(0,mid-1) <= arr.at<int>(0,mid)) &&
(mid == n-1 || arr.at<int>(0,mid+1) <= arr.at<int>(0,mid)))
return mid;

// If middle element is not peak and its left neighbor is greater than it
// then left half must have a peak element
else if (mid > 0 && arr.at<int>(0,mid-1) > arr.at<int>(0,mid))
return findPeakUtil(arr, low, (mid - 1), n);

// If middle element is not peak and its right neighbor is greater than it
// then right half must have a peak element
else return findPeakUtil(arr, (mid + 1), high, n);
}

// A wrapper over recursive function findPeakUtil()
int findPeak(Mat arr, int n) {
return findPeakUtil(arr, 0, n-1, n);
}

所以现在我的代码看起来像:

void segment_plate (Mat input_image) {
Mat work_image = input_image;
Mat output;
//binarize image
adaptiveThreshold(work_image,work_image, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, 10);
//project it to one axis
reduce(work_image,output,0,CV_REDUCE_SUM,CV_32S);
int n = output.cols;
printf("Index of a peak point is %d", findPeak(output, n));

但是我怎样才能找到另一个山峰呢?我取自 here 的寻峰算法.

最佳答案

我可以考虑找到峰值的一种方法是找到一阶导数,然后找到它的负数。

例如,

a = [ 1, 2, 3, 4, 4, 5, 6, 3, 4]

在此示例中,峰值为 6在位置6和 4 在 las 位置。因此,如果您扩展 vector (末尾为 0)并应用一阶导数 (a[i] - a[i-1]),您将得到

a_deriv = [1,1,1,0,1,1,-3,1,-4]

负数位于峰的位置。在这种情况下,-3 位于第 6 位,-4 位于第 8 位,也就是峰所在的位置。

这是一种方法……但不是唯一的方法。

请注意,此方法只会将平台中的最后一个数字计算为峰值(当两个数字共享峰值时,您可以找到一个平台,因为它们具有相同的值并且是连续的)

希望对你有帮助

关于c++ - 在 OpenCV C++ 中查找 Mat() 的所有峰值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28845183/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com