边界填充与图像融合
一、图片的边界填充
对于卷积操作,最边缘的像素一般无法处理,因为卷积核中心到不了最边缘像素。这时需要先将图片边界填充,再进行卷积操作,最后将扩充的边界去掉,则原图像每个像素都进行了卷积。
在 OpenCV 中边界填充是非常重要的函数,具体表述如下:
copyMakeBorder(src, dst, top, bottom, left, right, borderType, value)
它的参数为:
- src:原图像;
- dst: 目标图像;
- top, bottom, left, right: 上下左右扩充的长度
- borderType:填充的类型。OpenCV 填充的类型有:
- BORDER_DEFAULT:将最近的像素进行复制填充;
- BORDER_REPLICATE:复制最近的一行或一列像素并一直延伸至添加边缘的宽度或高度;
- BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制。我们使用字母为例,左右复制abcdefgh靠近边缘的 6个字母: fedcba | abcdefgh | hgfedc;
- BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称复制。同样的,使用字母为例:gfedcba | abcdefg | gfedcba;
- BORDER_WRAP:外包装法。相当于截断复制: cdefgh | abcdefgh | abcdefg;
- BORDER_CONSTANT:常量法,常数值填充。
- value: 常数填充时的颜色值,填充的类型是常量型边界该值才有意义。
二、图像的融合
要实现图像的融合,首先要了解OpenCV读入图像变量的基本属性。
图像的基本属性
OpenCV 中图像读入的数据格式是ndarray 数据格式。通道顺序为 B G R ,取值范围是[0,255]。
注意: matplotlib 包也可以对图像处理,但是它操作图像的通道顺序为R G B。因此当 OpenCV 读取img后,使用img = img[:,:,(2,1,0)]更换通道即可使用matplotlib 进行处理。
OpenCV 读取的图片 image 对象时有以下典型属性:
-
shape: 返回图像的[宽度, 长度, 通道数]的数组,如果是灰度图,返回值仅有行数和列数;
-
size: 返回图像的像素;
-
dtype: 返回图像的数据类型。
以J20.png图片为例,读取图片后如果执行以下代码:
print("长度:", img.shape[1], "宽度:", img.shape[0], "通道:", img.shape[2], "像素:", img.size, "数据类型:", img.dtype)
则输出:
长度: 462 宽度: 489 通道: 3 像素: 677754 数据类型: uint8
因为读入图像数据后被存储为矩阵形式,我们可以对像素点直接进行加减: