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

操作环境
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. 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)
    

    在这里插入图片描述

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

    cat.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)
    

    在这里插入图片描述
    从融合的图像可以比较明显的看出猫和狗的轮廓。

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值