【问题标题】:cv2.filter2D: no results if kernel size is too bigcv2.filter2D:如果内核大小太大,则没有结果
【发布时间】:2025-12-15 09:25:01
【问题描述】:

我正在尝试学习如何使用 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)

【问题讨论】:

  • OpenCV 的哪个版本?什么平台? “图像未生成”究竟是什么意思?在这种情况下,函数究竟返回了什么?提供一个可以重现它的图像和一个被指控失败的具体例子。我无法使用许多不同的 OpenCV 构建(在 3.x 和 4.x 范围内)复制超过 11 的大小。
  • @Carlo 听起来环境有问题。从 PyCharm 运行时,python 包装器或其某些依赖项可能不在路径上。您能否在程序开始时打印出sys.path,并在从终端运行与从 PyCharm 运行时进行比较?

标签: python-3.x opencv filtering


【解决方案1】:

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

根据文档:

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

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

【讨论】:

  • 谢谢!正如我所说,我现在正在研究这些东西,所以我真的不知道我什么时候会超越并使用计算量太高的东西!事实上,在我遵循的教程中,他们使用了 15x15 内核,所以我不怀疑 11x11 可能太多。我会研究为什么它没有切换到 DFT 算法。
  • 这似乎并没有真正解决问题,是吗?是的,使用巨大的内核不是一个好主意,但我无法重现 OP 声称的任何问题,即使使用 101x101 大小的内核(运行大约需要一秒钟),并且使用一系列 OpenCV 版本3.0。它当然不应该返回“nothing”......但谁知道实际发生了什么,描述很模糊。
  • 丹,我在问题中添加了一些信息!
  • @DanMašek 同意。尤其是来自 OP 的新信息,似乎发生了一些环境问题。
最近更新 更多