18KW13/6-OpenCV入门-关于图像的算数运算
Posted 一步一步学Python
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了18KW13/6-OpenCV入门-关于图像的算数运算相关的知识,希望对你有一定的参考价值。
图像上的算数运算
包括加法,减法,位运算
cv2.add(),cv2.addWeighted()等
import cv2
import numpy as np
你可以使用函数 cv2.add() 将两幅图像进行加法运算,当然也可以直接使
用 numpy, res=img1+img。两幅图像的大小,类型必须一致,或者第二个
图像可以使一个简单的标量值。
x=np.uint8([250])
y=np.uint8([10])
print(cv2.add(x,y))#[[255]],260->255
print(x+y)#[4],260%256=4
图像混合
这其实也是加法,但是不同的是两幅图像的权重不同,这就会给人一种混
合或者透明的感觉。
g (x) = (1 − α) f0 (x) + αf1 (x)
函数 cv2.addWeighted() 可以按下面的公式对图片进行混合操作
dst = α · img1 + β · img2 + γ
请牢记,如果图片大小也就是水平和竖直方向上的像素数量不同,就会报错的。
我们可以在画图软件中调整一下图片大小。
img1=cv2.imread('pic/wechat.png')
img2=cv2.imread('pic/mongodb.jpg')
dst=cv2.addWeighted(img1,0.7,img2,0.3,0)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
我们来看一下两张图叠加在一起的效果。
按位操作
有: AND, OR, NOT, XOR 等。
当我们提取图像的一部分,选择非矩形 ROI 时这些操作会很有用.
我想把某部分图像放到另一幅图像上。如果使用加法,颜色会改变。
如果使用混合,会得到透明效果,但是不想要透明。
如果这部分图像是矩形,我可以象上一章那样使用 ROI。但是他不是矩形。
所以只能使用按位运算来实现:
我们把绿色的叶子,转移到另一张图上。
后面我们会把所有的图片都截图贴出来,以便大家参考。
import cv2
import numpy as np
#加载图像
img1=cv2.imread('pic/wechat.png')#这是目标图片
img2=cv2.imread('pic/leaf.jpg')#这是我们的绿叶logo
#获取img2的行、列、通道数
rows,cols,channels=img2.shape
#从目标图片中,确定好与leaf大小一致的区域
roi=img1[0:rows,0:cols]
''' # 彩色转灰度 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 灰度转BGR3通道 color = cv2.cvtColor(grayImg,cv2.COLOR_GRAY2BGR) '''
#转换成灰度照片
img2gray=cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
def threshold(src, thresh, maxval, type, dst=None)
The function applies fixed-level thresholding to a multiple-channel array.
-src input array (multiple-channel, 8-bit or 32-bit floating point).
-dst output array of the same size and type and the same number of channels as src.
-thresh threshold value.
-maxval maximum value to use with the THRESH_BINARY and THRESH_BINARY_INV thresholding types.
这个函数的作用就是将灰度图片以某一个阈值作为区分,黑和白变得很明确
小于175的就是0,其他的是255
ret,mask=cv2.threshold(img2gray,175,255,cv2.THRESH_BINARY)
#not运算就是将上面的图片进行反转,黑和白转换一下
mask_inv=cv2.bitwise_not(mask)
按位求和
我们来看一下按位求和运算的函数
def bitwise_and(src1, src2, dst=None, mask=None)
. @param src1 first input array or a scalar.
. @param src2 second input array or a scalar.
. @param dst output array that has the same size and type as the input
. arrays.
. @param mask optional operation mask, 8-bit single channel array, that
. specifies elements of the output array to be changed.
也就是说mask参数,就是用来指定输出矩阵中要改变的元素。
img1_bg=cv2.bitwise_and(roi,roi,mask=mask) img2_fg=cv2.bitwise_and(img2,img2,mask=mask_inv) dst=cv2.add(img1_bg,img2_fg) img1[0:rows,0:cols]=dst
#cv2.imshow('img2gray',img2gray)
#cv2.imshow('mask',mask)
#cv2.imshow('mask_inv',mask_inv)
cv2.imshow('img1_bg',img1_bg) cv2.imshow('img2_bg',img2_fg) cv2.imshow('dst',dst)
#cv2.imshow('res',img1)
cv2.waitKey(0) cv2.destroyAllWindows()
以上是关于18KW13/6-OpenCV入门-关于图像的算数运算的主要内容,如果未能解决你的问题,请参考以下文章