opencv之图像混合

目录
一. 前言
二、图像混合

  1. ROI区域图像叠加
  2. 线型图像混合
  3. 算法原理

三、全部代码


一、前言
我们做图像处理的时候,有时候会遇到一种难题——想要获得一个理想图片,但是往往一张图片不能完全包含我们想要的东西,想要将两个图片的内容在同一张图片上展示出来,因此图像混合可以帮我们实现。像幻灯片翻页时设置的前后页缓慢过渡叠加效果,以及电影情节过渡时经常出现的画面叠加效果都运用了图像混合操作。接下来我将会讲解两种图像混合操作方法。

二、图像混合

  1. ROI区域图像叠加
    在图像处理领域,我们常常可以通过设置感兴趣区域(ROI, region of interest)来专注或者简化工程。也就是从图像中选择的一个图像区域,这个区域试图向分析所关注的重点。我们圈定这个区域,以便进一步处理。而且,使用ROI指定想要读入的目标,可以减少处理时间,增加精度,给图像处理带来不小的便利。

    使用表示矩形区域的Rect。指定矩形左上角坐标和举行的长宽以定义一个矩形区域

     imageROI = image(Rect(10,10,logo.cols, logo.rows))
    

    也可以使用指定感兴趣行或列的范围

    imageROI = image(range(10, 10+logo.rows), range(10, 10+logo.cols))
    
  2. 线型图象混合
    线性图像混合就是将两个尺寸一样的图像按照一定的比例混合到一起,比如我们配置颜料,我们也是按照一定的比例去配置,所有的比例之和为1。

  3. 线性图像混合算法原理
    我们用函数来表示一个图像,前提是所有的图像尺寸是一样的,即图像矩阵的行列一样,通道数一样。
    我们用 f0(x) 和 f1(x) 来表示输入的图像,用 g(x) 来表示输出图像,α表示比例 ( 0≤α≤1 ,一般来说,α取0和1没有太大意义),那我们能得到如下图所示的一个公式。
    在这里插入图片描述
    所以图像混合就是将两个图像按照一定的比例转存到另一个图像中。

三、 代码

  1. ROI区域图像叠加

    import numpy as np
    import cv2
    coin_img = cv2.imread("standard_object.png")
    image = cv2.imread("example_03.png")
    if not image.data:
        print("read image wrong!")
    if not coin_img.data:
        print("read coin_img wrong")
    
    imageROI = np.ones((100, 88, 3))
    imageROI =  coin_img[0:100, 0: 88]
    
    image[10:98, 10:98] = imageROI
    
    
  2. 线型图象混合
    先介绍一下需要用到的API

      CV_EXPORTS_W void addWeighted(
      InputArray src1, 
      double alpha, 
      InputArray src2,                     
      double beta,
      double gamma, 
      OutputArray dst, 
      int dtype = -1
    

);


 API参数解释

参数1:输入图像Mat – src1

参数2:输入图像src1的alpha值(所占比重)

参数3:输入图像Mat – src2

参数4:输入图像src2的beta值(所占比重)

参数5:gamma值

参数6:输出混合图像

参数7:默认参数

import cv2
import numpy as np

def img_filter(img):                   #计算图像梯度(高反差像素)
    x=cv2.Sobel(img,cv2.CV_16S,1,0)
    y=cv2.Sobel(img,cv2.CV_16S,0,1)

    absx=cv2.convertScaleAbs(x)
    absy=cv2.convertScaleAbs(y)
    dist=cv2.addWeighted(absx,0.5,absy,0.5,0)
    return dist

def addImage(img1, img2,alpha):
    h, w, _ = img1.shape
    """
        函数要求两张图必须是同一个size
        alpha,beta,gamma可调
    """
    img2 = cv2.resize(img2, (w, h), interpolation=cv2.INTER_AREA)

    beta = 1 - alpha
    gamma = 0
    img_add = cv2.addWeighted(img1, alpha, img2, beta, gamma)
    return img_add


if __name__ == '__main__':
    img1=cv2.imread('R_channel.png',cv2.IMREAD_COLOR)  # 以彩色图的形式读入
    dist_img = img_filter(img1)                        # 执行高通过滤
    for i in range(1,10):                              # 循环执行(不同的alpha):显示叠加图,写入处理后的图像
        IMG_Add = addImage(img1,dist_img,i*0.1)        # alpha,beta,gamma可调
        cv2.imshow('img_add_'+ str(i), IMG_Add)
        cv2.imwrite('img_add_'+ str(i)+".png", IMG_Add)
        cv2.imshow("img1",img1)
        # cv2.waitKey()
        # cv2.destroyAllWindows()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值