解读Opencv中Filter2D函数的补全方式
作者:sq_damowang 发布时间:2022-06-16 23:11:15
环境
OpenCV3.4.16(C++)
opencv-contrib-python 4.5.4.60(Python)
验证
Opencv函数filter2d(),一般用于图像卷积,其中关键参数,输入图像src,输出图像dst,卷积核kernel。
一般来说通过kernel进行卷积之后图像尺寸要比原图像尺寸小一点,为了保持图像大小不变,filter2d在进行运算前对src进行了补全操作。
通常补全操作有补零,图像边缘扩展等,但是这都不是filter2d()的补全方式,尝试了多次,发现,无论是C++还是python,这里的补全方式均为沿边缘镜像扩展。
C++举例
代码如下所示
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat src = (Mat_<uint8_t>(1, 8) << 2,4,6,8,10,12,14,16);
Mat kernel = (Mat_<float>(1, 2) << 1, 1);
Mat dst1;
filter2D(src, dst1, -1, kernel);
cout<<"dst1:"<<dst1<<endl;
return 0;
}
得到结果为:
对[[2, 4, 6, 8, 10, 12, 14, 16]]进行沿边缘镜像扩展(这里其实应该扩展到shape为(3,10),但是由于kernel的shape为(1,2),就只进行这个维度扩展了),得到
[[4,2,4,6,8,10,12,14,16,14]],然后kernel为[[1,1]],计算得到
[[4+2,2+4,4+6,6+8,8+10,10+12,12+14,14+16]];即为
[[6,6,10,14,18,22,26,30]]
至于为什么计算了4+2而没有计算16+14,那是因为filter2D的另一个参数anchor,此处默认值为(-1,-1),意为指向kernel的中心位置,因为此处kernel大小为(1,2),默认位置即为(0,1),若修改anchor参数为(0,0),那么kernel的锚点就在前面,这样就不会计算前面的4+2,而是计算尾部的16+14了,最后的输出也就变为[[6,10,14,18,22,26,30,30]]
Python举例
输入图像src,与卷积核kernel如下所示
输入src沿边缘镜像扩展后变为
最后进行卷积,得到最终结果
Python代码如下所示
import cv2
import numpy as np
src = np.array(([4,2,1],[2,1,3],[5,1,1]), dtype="float32")
kernel = np.array(([1,2,3],[4,5,6],[-1,-2,-1]), dtype="float32")
dst = cv2.filter2D(src, -1, kernel)
print(dst)
得到最终结果如下:
来源:https://blog.csdn.net/sq_damowang/article/details/123757974
猜你喜欢
- 在python中我们可以使用requests模块来实现调用远程接口一:安装requests模块pip install requests二:使
- 问题背景公司的项目是前后端分离,前端Vue+后端JavaSpringBoot为主,部分功能是PythonTornado,那么需要支持一个是跨
- 毋庸置疑,Python越来越被认可为程序员新时代的风口语言,Python的应用能力是成为一代码农大神的必要项。首先告诉你的是,零基础学习开始
- 使用FFmpeg命令拼接多个mp3格式的音频文件时报错抛出异常,使用命令格式如下:ffmpeg -i 1.mp3 -i 2.mp3 -fil
- 配置指令如下:[opcache]zend_extension=opcache.soopcache.enable_cli=1;共享内存大小,
- SQL SERVER 2000安装教程:https://www.jb51.net/article/37380.htm1、如果您的SQL空间开
- 本文实例为大家分享了Python+OpenCV实现图像的全景拼接的具体代码,供大家参考,具体内容如下环境:python3.5.2 + ope
- 1.查找重复的行SELECT * FROM blog_user_relation a WHERE (a.account_instance_i
- 近段时间看了一些论坛上面关于分页的ASP程序依然有许多的关注者,但里面只有代码,没有详细的解释,对于初学者来说,这样总是得不到真正的掌握,此
- 今天试着用python获取金山词霸的翻译功能,链接在这里:ICIBA传送门打开之后,界面是这样的,还是比较干净的。按F12,打开调试工具,选
- 如下所示:hist = model.fit(x,y, epochs=epoch_num, batch_size=32,callbacks=e
- __author__ = 'clownfish'#coding:utf-8import urllib2,urllib,coo
- codecs在读取文件时,发生错误:UnicodeDecodeError: 'utf-8' codec can't
- 1.尽量将资源文件夹放到主文件夹下2.pyi-makespec main.py制作spec文件3.spec文件在当前文件夹下,main.sp
- 一、为什么要配置文件1、容易编辑,配置比较集中,方便修改,在大业务量的系统里面,通过配置会方便后人理解整个系统的架构2、做到业务代码和环境解
- 文章介绍内容以Python 3.x版本为主一、for循环语句程序一般情况下都是按顺序执行代码,在代码执行过程中,会有复杂的语句,这个时候循环
- 在官方介绍里有这么一句话:Yarn is a package manager for your code. It allows you to
- 一、队列基本操作from queue import Queueq = Queue(5) # 创建一个容量为5的队列。如果给一个小
- pycharm没找到database问题pycharm的社区版本身是没有database的;只有专业版里面会直接出现右上角的database
- python3.7 使用pymssql往sqlserver插入数据import pymssqlconn = pymssql.connect(