返回顶部
首页 > 资讯 > 后端开发 > Python >解读Opencv中Filter2D函数的补全方式
  • 602
分享到

解读Opencv中Filter2D函数的补全方式

Python 官方文档:入门教程 => 点击学习

摘要

目录环境验证c++举例python举例总结环境 OpenCV3.4.16(C++)opencv-contrib-Python 4.5.4.60(Python) 验证 Opencv函数

环境

  • 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)

得到最终结果如下:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 解读Opencv中Filter2D函数的补全方式

本文链接: https://www.lsjlt.com/news/175175.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作