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

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

科普

知识

前言

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

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

图像混合

一、简介

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

1.1 原始图像

img1:

img2:

 

1.1 代码实践

# -*- 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 代码实践

# -*- 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 效果演示

结语

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

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

往期精彩回顾

【图像篇】OpenCV图像处理(五)---图像的色彩空间

【图像篇】OpenCV图像处理(四)---图像切割&ROI选取

【图像篇】OpenCV图像处理(三)---图像数据&通道分离

扫码关注

点亮在看,给你好看

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值