首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV GaussianBlur内核大小0

OpenCV GaussianBlur内核大小0
EN

Stack Overflow用户
提问于 2018-04-11 11:03:03
回答 2查看 1.7K关注 0票数 0

正如opencv docs所指出的,

高斯核大小。ksize.width和ksize.height可能不同,但它们都必须是正的和奇怪的。或者,它们可以是零,然后从sigma*计算。

我尝试将内核大小设置为0:

代码语言:javascript
复制
Mat input = imread(inputImagePath, IMREAD_COLOR);
Mat smooth;
int sigma=1;
GaussianBlur(input, smooth, Size(0, 0), sigma);

其结果是:

代码语言:javascript
复制
OpenCV(3.4.1) Error: Assertion failed (ksize.width > 0 && ksize.width % 2 == 1 && ksize.height > 0 && ksize.height % 2 == 1) in createGaussianKernels

它适用于Size(3, 3)。我哪里错了?谢谢。

EN

回答 2

Stack Overflow用户

发布于 2019-11-25 06:48:42

您不能使内核大小为零。您可以将西格玛值设为零。这就是为什么断言失败的原因。

同样重要的是要注意,核的维数应该严格地是奇数。

票数 0
EN

Stack Overflow用户

发布于 2019-11-25 10:09:12

您可以用您的内核调用cv::GaussianBlur(...),在本例中,内核大小在两个维度中都必须是奇数kernel.width % 2 == 1 && kernel.height % 2 == 1

或者,您可以不设置内核大小,并提供正西格玛值(必须设置sigma1,默认情况下设置sigma2等于它)。如果是这样,则计算内核如下:

代码语言:javascript
复制
template <typename T>
static void createGaussianKernels( T & kx, T & ky, int type, Size &ksize,
                               double sigma1, double sigma2 )
{
int depth = CV_MAT_DEPTH(type);
if( sigma2 <= 0 )
    sigma2 = sigma1;

// automatic detection of kernel size from sigma
if( ksize.width <= 0 && sigma1 > 0 )
    ksize.width = cvRound(sigma1*(depth == CV_8U ? 3 : 4)*2 + 1)|1;
if( ksize.height <= 0 && sigma2 > 0 )
    ksize.height = cvRound(sigma2*(depth == CV_8U ? 3 : 4)*2 + 1)|1;

CV_Assert( ksize.width  > 0 && ksize.width  % 2 == 1 &&
           ksize.height > 0 && ksize.height % 2 == 1 );
...
...
}

这是来自OpenCV 4.1.1的源代码。所以你的代码看起来很有效。我编译了它,它在没有断言的情况下运行,就像预期的那样。检查使用哪个版本的lib,但这是一个非常基本的函数,它最近几乎没有改变。

您还可以尝试同时提供sigma1sigma2 (并使用双值来避免隐式类型转换):

代码语言:javascript
复制
double sigmaX = 1.;
double sigmaY = 1.;
cv::GaussianBlur(input, smooth, cv::Size(0, 0), sigmaX, sigmaY);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49773387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档