我想使用具有非常高的Ksize(例如301或更高)的MedianBlur函数。但是,如果我将ksize传递的太高,有时该函数将崩溃。错误消息是:
OpenCV Error: (k < 16) in cv::medianBlur_8u_O1, in file ../opencv\modules\imgproc\src\smooth.cpp
(我使用opencv4nodejs,但我也尝试了原始的OpenCV 3.4.6)。 我确实在try / catch循环中减小了ksize,但效果不佳,因为我必须处理视频。
我确实签出了OpenCV源代码并做了一些研究。 在OpenCV 3.4.6中,崩溃来自第241行,文件opencv \ modules \ imgproc \ src \ median_blur.simd.hpp:
for ( k = 0; k < 16 ; ++k )
{
sum += H.coarse[k];
if ( sum > t )
{
sum -= H.coarse[k];
break;
}
}
CV_Assert( k < 16 ); // Error here
t基于ksize计算。但是sum和H.coarse数组的计算非常复杂。
经过进一步的研究,我找到了关于该算法的科学文献:https://www.researchgate.net/publication/321690537_Efficient_Scalable_Median_Filtering_Using_Histogram-Based_Operations
我正在尝试阅读,但老实说,我不太了解。
如何计算给定图像的最大ksize?
答案 0 :(得分:0)
最大内核大小由图像的位深确定。正如您在出版物中提到的那样:
“ 8位值限制为最大值255。我们的目标是 支持更大的内核,包括更大的内核 大小大于17×17,因此使用更大的32位数据类型。
因此对于数据类型为CV_8U的图像,最大内核大小为255。