OpenCV 中图像读入的数据格式是ndarray 数据格式。
ndarray的通道顺序为 B G R
更换通道顺序为 R G B
img=img[:,:,(2,1,0)]
0——B 1——G 2——R
即mat对象的属性
Img.shape:
输出(宽度,长度,通道数)
img.shape[0]:输出宽度
Img.shape[1]:输出长度
Img.shape[2]:输出通道数
Image.size:输出像素
Image.dtype:输出数据类型
输入
print("长度:", img.shape[1], "宽度:", img.shape[0], "通道:", img.shape[2], "像素:", img.size, "数据类型:", img.dtype)
输出
长度: 462 宽度: 489 通道: 3 像素: 677754 数据类型: uint8
cv2.copyMakeBorder(原图像, 【目标图像】, 上方向扩充长度, 下方向扩充长度, 左方向扩充长度, 右方向扩充长度, borderType=填充操作的类型, 【常数填充时的颜色值】)
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:常量法,常数值填充。
示例:
replicate = cv2.copyMakeBorder(img, 30, 30, 30, 30, borderType=cv2.BORDER_REPLICATE)
图像的融合
cv2.addWeighted(原图片1, 原图片1的权重, 原图片2, 原图片2的权重, 加和后的偏置量, 【输出图片】, 【输出图片的可选深度】)
被叠加的两幅图像必须是尺寸相同、类型相同的。
图片的重置大小
cv2.resize(需要重置的图片,【目标图片】, 【图片尺寸(M,N), 【x轴的缩放系数】, 【y轴的缩放系数】, 【插入方式】)
将图 2 苹果和梨的图像进行融合,权值分别为0.5, 0.5,输出图片大小为550×366
图2 苹果(左)和 梨(右)
具体步骤如下:
读取两个图像,并输出它们的尺寸:
img_apple = cv2.imread('apple.png')
img_pear = cv2.imread('pear.png')
print('img_apple size', img_apple.shape)
print('img_pear size', img_pear.shape)
我们得到输出:
可以看到,两张图片的的尺寸大小不同。这时,使用cv2.resize:
我们仅使用它的重置大小功能:
img_apple_resize = cv2.resize(img_apple, (550, 366))
img_pear_resize = cv2.resize(img_pear, (550, 366))
使用cv2.addWeighted函数实现图像融合:
res = cv2.addWeighted(img_apple_resize, 0.5, img_pear_resize, 0.5, 0)
融合后的图像如图 3 所示。
图3 融合后的图像