1. 程式人生 > >OpenCV學習:影象的算術操作

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()

執行截圖如下: