文章目录

  • 一、图像边界填充
  • 二、图像融合


操作环境
python3.6+Pycharm/Jupyter Notebook

一、图像边界填充

有时候,对于图像进行处理的时候,需要对图像进行边界填充。

  1. 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:一般用于常量填充设定数值

  1. 填充方式说明
    ①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
    常量法,用常量进行填充
  2. 实际举例
    代码内容
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()

填充结果

python图片border扩大百分之五并填充为黑色 python图像填充_opencv


通过几种填充方式的对比可以看出,几种方式填充效果都存在一些不足之处,造成图像有些扭曲,变形。

二、图像融合

将两种图像进行融合,按照比例进行叠加。

  1. 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

  1. 图像融合过程
    ①读取融合对象
# 导入相关包
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)

python图片border扩大百分之五并填充为黑色 python图像填充_opencv_02

②处理融合对象
查看融合对象shape

cat.shape
dog.shape

python图片border扩大百分之五并填充为黑色 python图像填充_参数说明_03


处理融合对象

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)

python图片border扩大百分之五并填充为黑色 python图像填充_参数说明_04


从融合的图像可以比较明显的看出猫和狗的轮廓。