OpenCV学习4-图像上的算术运算

本文深入探讨了图像处理中的核心概念,包括图像加法、图像混合和ROI操作。介绍了如何使用OpenCV库进行图像算术运算,如饱和加法和权重混合,以及如何在图像中选定感兴趣区域进行特定处理,实现图像的无缝融合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

'''图像上的算术运算
目标
• 学习图像上的算术运算,加法,减法,位运算等。
• 将要学习的函数与有:cv2.add(),cv2.addWeighted() 等。'''

#图像加法
'''你可以使用函数 cv2.add() 将两幅图像进行加法运算,当然也可以直接使用 numpy,res=img1+img。
两幅图像的大小,类型必须一致,或者第二个图像可以使一个简单的标量值。
注意:OpenCV 中的加法与 Numpy 的加法是有所不同的。OpenCV 的加法是一种饱和操作,而 Numpy 
的加法是一种模操作。'''

x = np.uint8([250])
y = np.uint8([10])
cv.add(x,y)  # OpenCV 的加法是一种饱和操作。 250+10 = 260 => 255
#array([[255]], dtype=uint8)
x+y			 # Numpy 的加法是一种模操作。250+10 = 260 % 256 = 4
#array([4], dtype=uint8)


#图像混合
'''这其实也是加法,但是不同的是两幅图像的权重不同,这就会给人一种混合或者透明的感觉。
			g (x) = (1 − α) f0 (x) + αf1 (x)
通过修改 α 的值(0 → 1),可以实现非常酷的混合。
现在我们把两幅图混合在一起。第一幅图的权重是 0.7,第二幅图的权重是 0.3。函数 cv2.addWeighted() 可以按下面的公式对图片进行混合操作。
		    dst = α · img1 + β · img2 + γ  
这里 γ 的取值为 0。 
取两个行列值相同的图片'''

img1 = cv.imread('img1.jpg')
img2 = cv.imread('img2.jpg')

#将两张图片进行混合,第一张图的融合比例0.4,第二张图的融合比例0.6 
dst = cv.addWeighted(img1,0.4,img2,0.6,0)

#存储图片
cv.imwrite('dst.jpg',dst)
cv.imshow('image',dst)
cv.waitKey(10)
cv.destroyAllWindows()

从左往右: img1.jpg img2.jpg dst.jpg
img1img2dst

'''ROI操作,它的英文全称是Region Of Interest,对应的中文解释就是感兴趣区域。
感兴趣区域,就是我们从图像中选择一个图像区域,这个区域就是图像分析所关注的焦点。
我们圈定这个区域,那么我们要处理的图像就从大图像变为一个小图像区域了,这样以便进
行进一步处理,可以大大减小处理时间。
用小图贴到大图的左上角'''
import cv2 as cv
import numpy as np

#导入大图和小图
img1= cv.imread('timg.jpg')
img2 = cv.imread('img2.jpg')

#获取小图的行、列、通道数
rows,cols,channels = img2.shape

#以小图的行、列、通道数值,用大图创建ROI
roi = img1[0:rows,0:cols]
#将两张图混合
roi = cv.addWeighted(roi,0.4,img2,0.6,0)
#将img1左上角区域替换成混合的图片
cv.imshow('image',img1)
cv.waitKey(10)
cv.destroyAllWindows()
'''最后显示的图片左上角有白色背景,不够美观 ''' 

不美观的图片

#
import cv2 as cv
import numpy as np

#导入大图和小图
img1= cv.imread('timg.jpg')
img2 = cv.imread('img2.jpg')

#获取小图的行、列、通道数
rows,cols,channels = img2.shape

#生成roi图,按照小图的行、列值取大图值
roi = img1[0:rows, 0:cols]

#取小图转化为灰度图,不然后面的运算会报错。
img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY)

#二值化小图,将小图中灰度值小于175的点置0,灰度值大于175的点置255。[https://blog.youkuaiyun.com/a19990412/article/details/81172426](https://blog.youkuaiyun.com/a19990412/article/details/81172426)
ret, mask = cv.threshold(img2gray, 175, 255, cv.THRESH_BINARY)

#对二值化小图进行非操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作,~1=0,~0=1。[https://blog.youkuaiyun.com/u011028345/article/details/77278467](https://blog.youkuaiyun.com/u011028345/article/details/77278467)
mask_inv = cv.bitwise_not(mask)

#生成img1背景图。对roi图与掩膜mask做与操作,即对图像(灰度图像或彩色图像均可)
#每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0
img1_bg = cv.bitwise_and(roi,roi,mask = mask)

#生成img2前景图。对img2图与mask_inv做与操作。
img2_fg = cv.bitwise_and(img2,img2,mask = mask_inv)

#将img1背景图和img2前景图相加
dst = cv.add(img1_bg,img2_fg)

#将img1左上角区域替换成混合的图片
img1[0:rows, 0:cols ] = dst
cv.imshow('image',img1)
cv.waitKey(10)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值