cv2.filter2D:如果内核大小太大,则没有结果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cv2.filter2D:如果内核大小太大,则没有结果相关的知识,希望对你有一定的参考价值。

我正在尝试学习如何使用OpenCV,并遵循基本教程。测试简单的cv2.filter2D时,我遇到了问题...如果内核大小大于某个数字,则程序将不会产生任何输出。

所以,我正在写类似:

img = cv2.imread('images/img.jpg')

kernel = np.ones((n,n),np.float32)/n**2
smoothed = cv2.filter2D(img,-1,kernel)

cv2.imshow('orig', img)
cv2.imshow('smoothed', smoothed)
cv2.waitKey(0)
cv2.destroyAllWindows()

问题是,对于n> 11,没有生成平滑图像(我尝试保存或显示它,但没有结果)。尝试了各种大小不同的图像,但始终得到相同的结果。我在这里做错了什么?谢谢!

编辑:好的,简短更新。当我从终端执行脚本时,该脚本可以正常工作,并生成模糊的图像(我将Ubuntu 18.04与OpenCv 4.1.0结合使用)。问题是当我尝试在Pycharm中执行它时,在这种情况下,它将引发错误“进程以退出代码139完成(被信号11:SIGSEGV中断)”,该错误应表示某种...分段问题,例如据我了解?很抱歉最初的模糊性,我有点着急,没有注意到Pycharm消息!

答案

大小为n = 11的内核非常庞大,将其应用于图像在计算上非常昂贵。卷积的内核大小通常会有上限,以避免不必要的长处理时间。

根据文档:

如果内核足够大(〜11 x 11或更大),该函数将使用基于DFT的算法,而对于较小内核,该函数将使用直接算法(使用createLinearFilter()检索的引擎)。

这意味着它应该产生一些输出,尽管通过DFT算法。也许DFT替代品不支持float32像素类型?

以上是关于cv2.filter2D:如果内核大小太大,则没有结果的主要内容,如果未能解决你的问题,请参考以下文章

如何确定内核堆栈大小

C#,button按钮上的图片太大,如何调整图片大小?

以编程方式检测图像大小 - iPhone

通话状态栏更改时查看调整大小[重复]

squid日志文件太大,怎样处理

在 Tensorflow 中具有相同填充的均匀大小的内核