操作环境
python3.6+Pycharm/Jupyter Notebook
一、图像边界填充
有时候,对于图像进行处理的时候,需要对图像进行边界填充。
-
opencv边界填充函数说明
def copyMakeBorder(src: Any, top: Any, bottom: Any, left: Any, right: Any, borderType: Any, dst: Any = None, value: Any = None) -> None
参数说明:
src:需要填充图像对象
top:顶部填充大小
bottom:底部填充大小
left:左边填充大小
right:右边填充大小
borderType:填充方式
dst:填充后的对象,一般可以不填
value:一般用于常量填充设定数值 -
填充方式说明
①cv2.BORDER_REPLICATE
复制法,复制最边缘的像素
②cv2.BORDER_REFLECT
反射法,对感兴趣的图像中的像素在两边进行复制,例如abcdefgh为原始的内容,进行反射后fedcba|abcdefgh|hgfedc
③cv2.BORDER_REFLECT_101
反射法,以最边缘的像素为轴,再向两边进行复制,例如abcdefgh为原始的内容,进行反射后gfedcb|abcdefgh|gfedcb
④cv2.BORDER_WRAP
外包装法,例如abcdefgh为原始的内容,外包装后cdefgh|abcdefgh|abcdef
⑤cv2.BORDER_CONSTANT
常量法,用常量进行填充 -
实际举例
代码内容import cv2 import matplotlib.pyplot as plt # 读取图片 img = cv2.imread("Lena.png") # 设置填充边界的长度 top_size, bottom_size, left_size, right_size = (50, 50, 50, 50) # 复制法 replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE) # 反射法 reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REFLECT) # 反射法 reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REFLECT_101) # 外包装法 wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_WRAP) # 常量法,0表示黑色 constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_CONSTANT, value=0) #绘制填充结果 # 231参数含义是2表示2行,3表示3列,1表示第一个 plt.subplot(231), plt.imshow(img, 'gray'), plt.title('ORIGINAL') plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('REPLICATE') plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT') plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('REFLECT101') plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP') plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT') plt.show()
填充结果
通过几种填充方式的对比可以看出,几种方式填充效果都存在一些不足之处,造成图像有些扭曲,变形。
二、图像融合
将两种图像进行融合,按照比例进行叠加。
-
opencv实现图像融合的函数
def addWeighted(src1: Any, alpha: Any, src2: Any, beta: Any, gamma: Any, dst: Any = None, dtype: Any = None)
参数说明:
src1, src2:需要融合相加的两个大小和通道数相等的图像对象
alpha:src1的权重
beta:src2的权重
gamma:叠加后的偏置,通常设置为0
dst=src1*alpha + src2*beta + gamma
-
图像融合过程
①读取融合对象# 导入相关包 import cv2 import matplotlib.pyplot as plt #读取灰度图片 cat=cv2.imread("cat.jpg") dog=cv2.imread("dog.jpg") #显示图片,创建多个窗口 plt.subplot(121),plt.imshow(cat) plt.subplot(122),plt.imshow(dog)
②处理融合对象
查看融合对象shapecat.shape dog.shape
处理融合对象cat=cv2.resize(cat,(591,394))
cv2.resize()的说明
常用于实现图像的缩放,以及将图像更改为对应大小
使用方式
cv2.resize(变化图像对象,更改为对应大小)
cv2.resize(变化图像对象,(0,0),fx,fy)
fx,fy表示横向和纵向变化的倍数③进行融合
res=cv2.addWeighted(cat,0.4,dog,0.6,0) plt.imshow(res)
从融合的图像可以比较明显的看出猫和狗的轮廓。