前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >番外篇: 卷积基础-图片边框

番外篇: 卷积基础-图片边框

作者头像
CodecWang
发布2021-12-07 15:19:31
6040
发布2021-12-07 15:19:31
举报
文章被收录于专栏:CodecWangCodecWang

了解卷积/滤波的基础知识,给图片添加边框。

卷积的概念其实很好理解,下面我就给大家做个最简单的解释,绝对轻松加愉快的辣o(_ ̄▽ ̄_)o

卷积

什么是二维卷积呢?看下面一张图就一目了然:

卷积就是循环对图像跟一个核逐个元素相乘再求和得到另外一副图像的操作,比如结果图中第一个元素5是怎么算的呢?原图中3×3的区域与3×3的核逐个元素相乘再相加:

5=1\times1+2\times0+1\times0+0\times0+1\times0+1\times0+3\times0+0\times0+2\times25=1×1+2×0+1×0+0×0+1×0+1×0+3×0+0×0+2×2

算完之后,整个框再往右移一步继续计算,横向计算完后,再往下移一步继续计算……网上有一副很经典的动态图,方便我们理解卷积:

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:

代码语言:javascript
复制
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)Copy to clipboardErrorCopied

默认边框类型

默认边框cv2.BORDER_DEFAULT其实是取镜像对称的像素填充,比较拗口,一步步解释:

代码语言:javascript
复制
default = cv2.copyMakeBorder(img, 1, 1, 1, 1, cv2.BORDER_DEFAULT)
print(default)Copy to clipboardErrorCopied

首先进行上下填充,填充成与原图像边界对称的值,如下图:

同理再进行左右两边的填充,最后把四个顶点补充上就好了:

经验之谈:一般情况下默认方式更加合理,因为边界的像素值更加接近。具体应视场合而定。

OpenCV进行卷积

OpenCV中用cv2.filter2D()实现卷积操作,比如我们的核是下面这样(3×3区域像素的和除以10):

M = \frac{1}{10}\left[ \begin{matrix} 1 & 1 & 1 \newline 1 & 1 & 1 \newline 1 & 1 & 1 \end{matrix} \right] \tag{3}M=101​[1​1​11​1​11​1​1​](3)

代码语言:javascript
复制
img = cv2.imread('lena.jpg')
# 定义卷积核
kernel = np.ones((3, 3), np.float32) / 10
# 卷积操作,-1表示通道数与原图相同
dst = cv2.filter2D(img, -1, kernel)Copy to clipboardErrorCopied

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

练习

  1. 尝试给"lena.jpg"添加几种不同的边框类型,对比下效果。

引用

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-12-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 卷积
  • padding
  • 添加边框
    • 固定值填充
      • 默认边框类型
      • OpenCV进行卷积
      • 练习
      • 引用
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档