目录
一. 前言
二、图像混合
- ROI区域图像叠加
- 线型图像混合
- 算法原理
三、全部代码
一、前言
我们做图像处理的时候,有时候会遇到一种难题——想要获得一个理想图片,但是往往一张图片不能完全包含我们想要的东西,想要将两个图片的内容在同一张图片上展示出来,因此图像混合可以帮我们实现。像幻灯片翻页时设置的前后页缓慢过渡叠加效果,以及电影情节过渡时经常出现的画面叠加效果都运用了图像混合操作。接下来我将会讲解两种图像混合操作方法。
二、图像混合
-
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))
-
线型图象混合
线性图像混合就是将两个尺寸一样的图像按照一定的比例混合到一起,比如我们配置颜料,我们也是按照一定的比例去配置,所有的比例之和为1。 -
线性图像混合算法原理
我们用函数来表示一个图像,前提是所有的图像尺寸是一样的,即图像矩阵的行列一样,通道数一样。
我们用 f0(x) 和 f1(x) 来表示输入的图像,用 g(x) 来表示输出图像,α表示比例 ( 0≤α≤1 ,一般来说,α取0和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
-
线型图象混合
先介绍一下需要用到的APICV_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()