牛顿第一运动定律:简称牛顿第一定律。又称惯性定律、惰性定律。常见的完整表述:任何物体都要保持匀速直线运动或静止状态,直到外力迫使它改变运动状态为止。
前言
又是一期再见时,受疫情影响,小编已在家中上课两周了,一个多月没出过门了,实在是种说不出的感受,相信大家也一样,虽然待在家里,但不要除了手机还是手机,在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 效果演示
结语
又到了说再见的时候了,今天的两个代码实例都还不错,第一图像混合的代码较为简单,第二个按位取反也不难,只是在逻辑理解的时候需要费点心思,希望朋友们多去理解,实在不理解就打印或者显示图像查看结果,一步步调试总能弄懂得。我们下期再见!
编辑:玥怡居士|审核:小圈圈居士