首頁 > 軟體

詳解影象上的OpenCV算術運算

2022-10-28 14:00:39

OpenCV 簡介

影象可以進行算術運算,例如加法、減法和按位元運算(AND、OR、NOT、XOR)。這些操作可以幫助改善輸入影象的屬性。

影象演演算法對於分析輸入影象的屬性是必要的,可以將操作後的影象用作增強的輸入影象,並且可以對影象應用更多操作,以進行閾值化、膨脹等。

影象算術是將一幅或多幅影象應用於標準算術運算或邏輯運運算元之一。運運算元是逐個畫素應用的,因此輸出影象中畫素的值僅由輸入影象中相應畫素的值決定。

因此,影象通常必須具有相同的大小。當向影象新增恆定偏移量時,輸入影象之一可能是恆定值。

雖然影象演演算法是影象處理的最基本形式,但它有很多應用。算術運運算元的一個顯著優勢是該過程簡單明瞭,因此速度很快。

新增影象

在其最基本的形式中,該運運算元將兩個相同大小的影象作為輸入,並輸出與前兩個相同大小的第三個影象,每個畫素值是兩個輸入影象中每個影象中對應畫素值的總和. 更高階的版本允許在一次操作中組合多個影象。

運運算元的一個常見變體只是允許向每個畫素新增一個指定的常數。使用函數 cv2.add(),我們可以新增兩個影象。這直接將兩個影象中的影象畫素相加。

Syntax: cv2.add(image1, image2)

但是,新增畫素並不是一個理想的情況。因此,我們使用 cv2.addweighted()。請記住,兩個輸入影象的形狀和顏色通道必須相同。

Syntax: cv2.add Weighted(image1, weight1, Image2, weight2, gammaValue)

引數:

image1:第一個影象陣列輸入

weight 1:輸入影象中第一個用於最終影象的影象元素的權重。

image2:第二個影象陣列輸入

weight 2:將第二輸入影象元素的權值應用於最終影象的伽馬值。

gammaValue:光測量。

加法程式碼

import cv2
import numpy as np
image1 = cv2.imread('input1.jpg')
image2 = cv2.imread('input2.jpg')
weightedSumadd = cv2.addWeighted(image1, 0.6, image2, 0.4, 0)
cv2.imshow('Weighted Image', weightedSumadd)
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出影象將是:

影象減法

畫素減法運算元將兩幅影象作為輸入並輸出第三幅影象,其畫素值是第一幅影象的畫素值減去第二幅影象的相應畫素值。

使用單個影象作為輸入是常見的,從所有畫素中減去一個常數值也是常見的。一些版本的運運算元將簡單地輸出畫素值之間的絕對差,而不是直接的有符號輸出。

Syntax:  cv2.subtract(image1, image2)

引數:

圖 1:第一個影象陣列輸入(單通道、8 位或浮點)

圖 2:第二個影象陣列輸入(單通道、8 位或浮點)

輸入影象

程式碼 :

import cv2
import numpy as np
image1 = cv2.imread('input1.jpg')
image2 = cv2.imread('input2.jpg')
sub = cv2.subtract(image1, image2)
cv2.imshow('Subtracted Image', sub)
cv2.waitKey(0)

輸出減去的影象將是

位運算

位運算用於影象處理以提取重要部分。本文中使用了以下按位元運算:

  • AND
  • OR
  • NOT
  • XR

位運算對於影象遮罩也很有用。這些操作可用於啟用影象建立。這些操作可以幫助改善輸入影象的屬性。

注意:按位元運算只能在相同尺寸的輸入影象上執行。

影象的 AND 位運算

AND 運運算元(以及類似方式的 NAND 運運算元)通常將兩個二進位制或整數灰度級影象作為輸入,並生成第三個影象,其畫素值只是第一個影象的畫素值與來自第二個影象的相應畫素相乘。

可以修改此運運算元以通過獲取單個輸入影象,並將每個畫素與預定的常數值進行與運算來產生輸出。

Syntax: cv2.bitwise_and(Image1, Image2, destination, mask)

引數:

Image1:第一個輸入影象 numpy 陣列

Image1:第二個輸入影象numpy陣列

destination:輸出陣列

mask: 操作掩碼影象

程式碼 :

import cv2
import numpy as np
img1 = cv2.imread('input1.png') 
img2 = cv2.imread('input2.png')
dest_and = cv2.bitwise_and(img2, img1, mask = None)
cv2.imshow('Bitwise And', dest_and)
cv2.waitKey(0)

影象的 OR 位運算

OR 運運算元通常將兩個二進位制或灰度影象作為輸入,並輸出第三個影象,其畫素值是第一個影象的畫素值與來自第二個影象的相應畫素進行或運算。

該運運算元的一個變體採用單個輸入影象並將每個畫素與一個常數值進行 OR 運算以生成輸出。

Syntax: cv2.bitwise_or(source1, source2, destination, mask)

引數:

source1 第一個輸入 numpy 影象陣列

source2 第二個輸入 numpy 影象陣列

目的地輸出陣列影象

mask 操作掩碼,輸入/輸出 8 位單通道掩碼。

程式碼 :

import cv2
import numpy as np
img1 = cv2.imread('input1.png') 
img2 = cv2.imread('input2.png')
dest_or = cv2.bitwise_or(img1, img2, mask = None)
cv2.imshow('Bitwise OR', dest_or)
cv2.waitKey(0)

影象的NOT位運算

邏輯非,也稱為反轉,是一種將二值或灰度影象作為輸入並生成其照相底片的運運算元。

Syntax: cv2.bitwise_not(Image1,Destination, mask)

引數:

Image1: 輸入影象陣列

Destination:輸出陣列影象

mask: 操作掩碼

程式碼 :

import cv2
import numpy as np
img1 = cv2.imread('input1.png') 
dest_not = cv2.bitwise_not(img1, mask = None)
cv2.imshow('Bitwise Not', dest_not)
cv2.waitKey(0)

影象的 XR 位運算

至關重要的是,正在處理的所有輸入畫素值都具有相同的位數,否則可能會出現意外結果。當輸入影象中的畫素值不是簡單的 1 位數位時,XOR 操作通常(但不總是)對畫素值中的每個對應位按位元執行。

Syntax: cv2.bitwise_xor(source1, source2, destination, mask)

引數:

source1 第一個輸入影象陣列(單通道、8 位或浮點)

source2 第二個輸入影象陣列(單通道、8 位或浮點)

目的地輸出影象陣列

mask 操作掩碼,輸入/輸出8位元單通道掩碼。

程式碼 :

import cv2
import numpy as np
img1 = cv2.imread('input1.png') 
img2 = cv2.imread('input2.png')
dest_or = cv2.bitwise_xor(img1, img2, mask = None)
cv2.imshow('Bitwise XOR', dest_xor)
cv2.waitKey(0)

OpenCV的結論

許多應用程式使用從同一場景的不同點獲取的經過處理的影象,例如通過新增相同場景的連續影象來降低噪聲或通過減去兩個連續影象來進行運動檢測。邏輯運運算元經常用於組合兩個(主要是二進位制)影象。

在整數影象的情況下,邏輯運運算元通常按位元使用。然後,例如,我們可以使用二進位制掩碼來選擇影象的特定區域。

關鍵要點:

在本文中,我們學習瞭如何對影象執行各種算術運算,OpenCV 方法是如何工作的,以及這些影象算術運算在哪裡使用。

以上就是詳解影象上的OpenCV算術運算的詳細內容,更多關於OpenCV影象算術運算的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com