我正在尝试在视频中的每个帧上使用canny边缘检测。我可以使用它没问题,但因为每个图像都不同,canny方法中的阈值参数需要自定义为该图像。
我在这里有关于计算中位数的好建议,然后在canny方法中使用高于和低于阈值参数的.33百分位数。
类似
Imgproc.Canny(gray, fullCanny, thirdAboveMedian, thirdBelowMedian);
所以我已经尝试计算中位数和百分位数以及插入它们但我的计算在某些地方肯定是错误的,因为我只得到一个带有这些值的黑屏?
这是我用来解决的代码。
Mat fullCanny = new Mat();
fullCanny=gray.clone();
fullCanny.reshape(0,1);
double median;
double thirdAboveMedian;
double thirdBelowMedian;
int[] histogram = hist(fullCanny);
if(histogram.length%2==0)
{
median = (histogram[histogram.length/2] + histogram[histogram.length/2 - 1 ])/2;
thirdAboveMedian = histogram[(histogram.length/2)+(histogram.length/2/3)];
thirdBelowMedian = histogram[(histogram.length/2)-(histogram.length/2/3)];
}
else
{
median = histogram[(int)histogram.length/2];
thirdAboveMedian = histogram[(int)(histogram.length/2)+(histogram.length/2/3)];
thirdBelowMedian = histogram[(histogram.length/2)-(histogram.length/2/3)];
}
System.out.println("median is "+median);
System.out.println("thirdAboveMedian is "+thirdAboveMedian);
System.out.println("thirdBelowMedian is "+thirdBelowMedian);
//run edge detection on the blurred gray image and display it on fullCanny mat
Imgproc.Canny(gray, fullCanny, thirdAboveMedian, thirdBelowMedian);
和hist方法
public static int [] hist(Mat img){
// array for intensities
int hist[] = new int[256];
byte data[] = new byte[img.rows() * img.cols() * img.channels()];
img.get(0, 0, data);
for (int i = 0; i < data.length; i++) {
hist[(data[i] & 0xff)]++;
}
return hist;
}
由于