cv2.copyMakeBorder()的用法

padding
不难发现,用3×3的核对一副6×6的图像进行卷积,得到的是4×4的图,图片缩小了!那怎么办呢?我们可以把原图扩充一圈,再卷积,这个操作叫padding。

事实上,原图为n×n,卷积核为f×f,最终结果图大小为(n-f+1) × (n-f+1)

那么扩展的这一层应该填充什么值呢?OpenCV中有好几种填充方式,都使用cv2.copyMakeBorder()函数实现,一起来看看。

添加边框
cv2.copyMakeBorder()用来给图片添加边框,它有下面几个参数:

src:要处理的原图
top, bottom, left, right:上下左右要扩展的像素数
borderType:边框类型,这个就是需要关注的填充方式,详情请参考:BorderTypes
其中默认方式和固定值方式最常用,我们详细说明一下:

固定值填充(cv2.BORDER_CONSTANT)
顾名思义,这种方式就是边框都填充成一个固定值,比如下面的程序都填充0:

import cv2
import numpy as np
 
img = cv2.imread('6_by_6.bmp', 0)
print(img)
 
# 固定值边框,统一都填充0也称为zero padding
cons = cv2.copyMakeBorder(img, 1, 1, 1, 1, cv2.BORDER_CONSTANT, value=0)
print(cons)

默认边框类型(cv2.BORDER_DEFAULT)
默认方式其实是取镜像对称的像素填充,比较拗口:

default = cv2.copyMakeBorder(img, 1, 1, 1, 1, cv2.BORDER_DEFAULT)
print(default)

一般情况下默认方式更加合理,因为边界的像素值更加接近,当然应视场合而定。

OpenCV进行卷积
OpenCV中用cv2.filter2D()实现卷积操作,比如我们的核是下面这样(3×3区域像素的和除以10):
在这里插入图片描述

img = cv2.imread('lena.jpg')
# 定义卷积核
kernel = np.ones((3, 3), np.float32) / 10
# 卷积操作,-1表示通道数与原图相同
dst = cv2.filter2D(img, -1, kernel)

可以看到这个核对图像进行了模糊处理,这是卷积的众多功能之一。当然卷积还有很多知识没有学到,后面我们再继续深入。

转载自:https://blog.csdn.net/zfjBIT/article/details/86655182

  • 7
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值