【图像篇】OpenCV图像处理(六)---图像混合VS按位运算

2022-06-01 19:06:57 浏览数 (1)

牛顿第一运动定律:简称牛顿第一定律。又称惯性定律、惰性定律。常见的完整表述:任何物体都要保持匀速直线运动或静止状态,直到外力迫使它改变运动状态为止。

前言

又是一期再见时,受疫情影响,小编已在家中上课两周了,一个多月没出过门了,实在是种说不出的感受,相信大家也一样,虽然待在家里,但不要除了手机还是手机,在study的路上,我们一直在前行。

在上周的教程中我们了解到图像的色彩空间不光只有RGB,还有BGR,HSV等等,大家都学会了吗?今天我们进入图像的另一个学习方向--图像混合VS按位运算。

图像混合

一、简介

图像混合,顾名思义就是将图像混合在一起,简单的来说,就是将两幅图像进行叠加在一起,实现两幅图像在一张图像中的现象,这样的实例相信大家肯定见过吧,下面进入正题哦!

1.1 原始图像

img1:

img2:

1.1 代码实践

代码语言:javascript复制
# -*- coding:utf-8 -*-
import cv2

image1 = cv2.imread('cat.jpg') # 根据路径读取一张图片
image2 = cv2.imread('opencv.jpg') # 根据路径读取一张图片
#对图片设置大小,图像大小不一样会报错
img_1 = cv2.resize(image1,(480,331))
img_2 = cv2.resize(image2,(480,331))

#图像混合函数
new_image = cv2.addWeighted(img_1,0.5,img_2,0.5,0)

#图像显示
cv2.imshow('img_1',img_1)
cv2.imshow('img_2',img_2)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码解读:代码思路清晰,简单明了,我们注重下 cv2.addWeighted()函数就好,仔细观察该函数有五个参数,第1和第3个参数都是要叠加的图像,第2,4,5个参数请看后面的解释:

图像混合其实也是加法,但是不同的是两幅图像的权重不同。图像混合的计算公式如下: g(x) = (1-α)f0{x} αf1{x} γ, α取值在0~1之间 ,g(x)表示最终的图像(混合后的图像),f0{x}和f1{x}表示两幅图像,可以看到前面的参数是1-α和α,和为1,我们这里取得都是0.5,0.5 0.5=1,后面的γ参数 一般默认为0。

1.1 效果展示

按位运算

二、简介

这里包括的按位操作有:AND,OR,NOT,XOR 等。对应函数分别为cv2.bitwise_and()、cv2.bitwise_or()、cv2.bitwise_not() 和 cv2.bitwise_xor()

按位运算与图像混合达到的目的是一样的,都是把两幅图像叠加在一起,但是按位运算可以实现特定位置的图像融合,而且不一定是矩形ROI都可以哦,一起来看看吧!

2.1 原始图像

logo:

img:1

2.2 代码实践

代码语言:javascript复制
# -*- coding:utf-8 -*-
import cv2
import numpy as np

img1 = cv2.imread('green.jpg')
img2 = cv2.imread('opencv.jpg')

img2 = cv2.resize(img2,(100,100))

# 获取green图像的长度和宽度
image1_width = img1.shape[1]
image1_height = img1.shape[0]

# 获取logo图像的长度和宽度
image2_width = img2.shape[1]
image2_height = img2.shape[0]
# 在green图像的右上角创建logo图像大小的ROI感兴趣的区域
roi = img1[0:image2_height, image1_width//2:(100 image1_width//2)]
cv2.imshow('roi',roi)

#cv2.imshow('roi',roi)
# 创建logo掩码和掩码取反
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 200, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)

# 取反和相与操作
img1_bg = cv2.bitwise_and(roi,roi,mask = mask)

# 取反和相与操作
img2_fg = cv2.bitwise_and(img2,img2,mask = mask_inv)

# 将logo放到整张图像上
dst = cv2.add(img1_bg,img2_fg)
img1[0:image2_height, image1_width//2:(100 image1_width//2) ] = dst

cv2.imshow('res',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码解读:经过小编实测,该段代码的解读性不太好理解,主要记住按位取反函数cv2.bitwise_not()就好,然后就是注意你要将logo添加到那个位置即可,比如这里:

img1[0:image2_height,image1_width//2:(100 image1_width//2)]

是右上角,跟之间讲的图像切割的切割方式一样,大家务必好好理解,小编也是经过几次测试才成功的。

2.3 效果演示

结语

又到了说再见的时候了,今天的两个代码实例都还不错,第一图像混合的代码较为简单,第二个按位取反也不难,只是在逻辑理解的时候需要费点心思,希望朋友们多去理解,实在不理解就打印或者显示图像查看结果,一步步调试总能弄懂得。我们下期再见!

编辑:玥怡居士|审核:小圈圈居士

0 人点赞