来自opencv-python官方学习文档,本人谨做翻译和注释,以及一些自己的理解
本文由作者翻译并进行代码验证,转载请注明出处~
官方文档请参阅:https://docs.opencv.org/4.0.1/d0/d86/tutorial_py_image_arithmetics.html
运行环境:
windows 10+pycharm professional 2018.3+python 3.7.1+opencv 4.0.1
目标:
1,学习opencv对图像的操作,比如加,减和按位操作等
2,学习cv.add()和cv.addWeighted()函数
一:图像的加运算操作
您可以通过cv.add()函数对两张图片做加运算操作,也可以使用numpy的方式,即res=img1+img2.进行加运算操作,要求两张图片的深度和类型必须一致,或者第二张图片只是一个标量值。
值得注意的是:OpenCV和numpy对于图像的加运算操作是不同的。opencv是饱和运算:即运算结果超过最大值之后,直接取最大值。而numpy是模运算:即运算结果超出最大值之后,取模运算。代码如下:
import numpy as np import cv2 as cv x = np.uint8([250]) print(x) y = np.uint8([10]) print(y) print( cv.add(x,y) ) # 250+10 = 260 => 255 print( x+y ) # 250+10 = 260 % 256 = 4
二:图像混合
图像的混合,主要是采用以下公式来实现的:
g(x)=(1−α)f0(x)+αf1(x)
示例代码如下:
import cv2 as cv
img = cv.imread('C:\Users\xjtu\Desktop\1.png')
img1 = cv.imread('C:\Users\xjtu\Desktop\roi.jpg')
res = cv.resize(img,(600,500),interpolation=cv.INTER_CUBIC)
res1 = cv.resize(img1,(600,500),interpolation=cv.INTER_CUBIC)
dst = cv.add(res,res1)
cv.imshow('opencv',dst)
cv.waitKey(0)
cv.destroyAllWindows()
运行截图如下:
三:位运算
这主要包括AND,OR,NOT,XOR操作。这在提取图片任何区域(后续章节中会讲到)、定义和使用非矩形ROI等时是非常有用的。代码如下:
import cv2 as cv img2=cv.imread('C:\Users\xjtu\Desktop\1.png') img1=cv.imread('C:\Users\xjtu\Desktop\roi.jpg') print(img2.shape) img2=cv.resize(img2,(100,80),interpolation=cv.INTER_CUBIC) print(img2.shape) # 读取出image2的像素值,并在image1创造roi区域 rows,cols,channels=img2.shape roi=img1[0:rows,0:cols] img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY) # threshold函数是图像的二值化操作 ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY) mask_inv = cv.bitwise_not(mask) # Now black-out the area of logo in ROI img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv) # Take only region of logo from logo image. img2_fg = cv.bitwise_and(img2,img2,mask = mask) # Put logo in ROI and modify the main image dst = cv.add(img1_bg,img2_fg) img1[0:rows, 0:cols ] = dst cv.imshow('res',img1) cv.waitKey(0) cv.destroyAllWindows()
运行截图如下:
2019年1月12日第一次修改:
1、bitwise_not 是取反操作。通过输出mask和mask_inv可以看出结果。