图像基本操作——图像边界填充和图像融合

文章目录

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

操作环境
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:一般用于常量填充设定数值

  2. 填充方式说明
    ①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
    常量法,用常量进行填充

  3. 实际举例
    代码内容

    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()
    

    填充结果
    图像基本操作——图像边界填充和图像融合_第1张图片
    通过几种填充方式的对比可以看出,几种方式填充效果都存在一些不足之处,造成图像有些扭曲,变形。

二、图像融合

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

  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

  2. 图像融合过程
    ①读取融合对象

    # 导入相关包
    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)
    

    图像基本操作——图像边界填充和图像融合_第2张图片

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

    cat.shape
    dog.shape
    

    图像基本操作——图像边界填充和图像融合_第3张图片
    处理融合对象

    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)
    

    图像基本操作——图像边界填充和图像融合_第4张图片
    从融合的图像可以比较明显的看出猫和狗的轮廓。

你可能感兴趣的:(opencv图像处理,python,opencv)