前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【图像篇】OpenCV图像处理(六)---图像混合VS按位运算

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

作者头像
用户5410712
发布2022-06-01 19:06:57
4960
发布2022-06-01 19:06:57
举报
文章被收录于专栏:居士说AI

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

前言

又是一期再见时,受疫情影响,小编已在家中上课两周了,一个多月没出过门了,实在是种说不出的感受,相信大家也一样,虽然待在家里,但不要除了手机还是手机,在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 效果演示

结语

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT进阶之旅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档