python-3.x - 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)
解决方案
大小为 n=11 的内核是巨大的,并且应用于图像的计算成本非常高。卷积的内核大小通常有上限,以避免处理时间过长。
根据文档:
如果内核足够大(~ 或更大),该函数使用基于 DFT 的算法,而
11 x 11
对于小内核,则使用直接算法(使用 createLinearFilter() 检索的引擎)。
这意味着它应该产生一些输出,尽管是通过 DFT 算法。也许 DFT 替代方案不支持 float32 像素类型?
推荐阅读
- pine-script - 更新值或创建新系列
- node.js - Node.js express 无法在 Heroku 上设置 cookie
- laravel - Laravel Echo 没有收到更多事件
- python - CSV 文件处理 - 我的程序不会输出任何内容
- python - 计算器中的问题
- python - 打开浏览器时在 Selenium 中打开 Tor 时出错
- python - 我收到 LocalUnboundError
- ruby-on-rails - 使用 Rails 6 `insert_all` 从 CSV 文件导入模型,这会引发 NoMethodError
- typescript - 如何正确使用非原始苗条商店?
- sql-server - T-SQL 无法测试表是否存在