OpenCV学习系列教程第四篇:图像的算术操作

 

来自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可以看出结果。

 

posted @ 2019-01-11 21:37  刘云生  阅读(424)  评论(0编辑  收藏  举报