首页 > 解决方案 > 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,没有产生平滑的图像(我试图保存或显示它,但我没有得到任何结果)。尝试了不同大小的各种图像,但总是得到相同的结果。我在这里做错了什么?谢谢!

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

编辑:新更新。
听起来很疯狂,我尝试从终端和 Pycharm 运行脚本,但现在它们中的任何一个都不起作用!老实说,我不知道这是怎么可能的,据我所知,我没有改变任何重要的东西!无论如何,如果它仍然有用,从终端运行时 sys.path 是:

['/home/lews/PycharmProjects/opencv/00_basics',
'/home/lews/PycharmProjects/tf_models/research',
'/home/lews/PycharmProjects/tf_models/research/slim',
'/home/lews/PycharmProjects/opencv/00_basics',
'/home/lews/anaconda3/envs/tf2/lib/python37.zip',
'/home/lews/anaconda3/envs/tf2/lib/python3.7',
'/home/lews/anaconda3/envs/tf2/lib/python3.7/lib-dynload',
'/home/lews/anaconda3/envs/tf2/lib/python3.7/site-packages']

而来自 Pycharm 的是:

['/home/lews/PycharmProjects/opencv/00_basics',
'/snap/pycharm-professional/159/helpers/pydev',
'/home/lews/PycharmProjects/opencv',
'/snap/pycharm-professional/159/helpers/pycharm_display',
'/snap/pycharm-professional/159/helpers/third_party/thriftpy',
'/snap/pycharm-professional/159/helpers/pydev',
'/home/lews/anaconda3/envs/tf2/lib/python37.zip',
'/home/lews/anaconda3/envs/tf2/lib/python3.7',
'/home/lews/anaconda3/envs/tf2/lib/python3.7/lib-dynload',
'/home/lews/anaconda3/envs/tf2/lib/python3.7/site-packages',
'/snap/pycharm-professional/159/helpers/pycharm_matplotlib_backend',
'/home/lews/anaconda3/envs/tf2/lib/python3.7/site-packages/IPython/extensions',
'/home/lews/PycharmProjects/opencv']

同样,它们都不起作用,在这两种情况下都不会产生模糊图像。从终端运行时,它返回错误:

Segmentation fault (core dumped)

正如我所说,在使用 Pycharm 时,我得到了

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

标签: python-3.xopencvfiltering

解决方案


大小为 n=11 的内核是巨大的,并且应用于图像的计算成本非常高。卷积的内核大小通常有上限,以避免处理时间过长。

根据文档:

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

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


推荐阅读