Python圖像處理之圖像算術與邏輯運算詳解

一.圖像加法運算

圖像加法運算主要有兩種方法。第一種是調用Numpy庫實現,目標圖像像素為兩張圖像的像素之和;第二種是通過OpenCV調用add()函數實現。第二種方法的函數原型如下:

dst = add(src1, src2[, dst[, mask[, dtype]]])

– src1表示第一張圖像的像素矩陣

– src2表示第二張圖像的像素矩陣

– dst表示輸出的圖像,必須和輸入圖像具有相同的大小和通道數

– mask表示可選操作掩碼(8位單通道數組),用於指定要更改的輸出數組的元素。

– dtype表示輸出數組的可選深度

註意,當兩幅圖像的像素值相加結果小於等於255時,則輸出圖像直接賦值該結果,如120+48賦值為168;如果相加值大於255,則輸出圖像的像素結果設置為255,如(255+64) 賦值為255。下面的代碼實現瞭圖像加法運算。

#coding:utf-8
# By:Eastmount
import cv2  
import numpy as np  
 
#讀取圖片
img = cv2.imread("luo.png")

#圖像各像素加100
m = np.ones(img.shape, dtype="uint8")*100

#OpenCV加法運算
result = cv2.add(img, m)

#顯示圖像
cv2.imshow("original", img)
cv2.imshow("result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出如圖4-1所示,左邊為“小珞珞”的原始圖像,右邊為像素值增加100像素後的圖像,輸出圖像顯示更偏白。

二.圖像減法運算

圖像減法運算主要調用subtract()函數實現,其原型如下所示:

dst = subtract(src1, src2[, dst[, mask[, dtype]]])

– src1表示第一張圖像的像素矩陣

– src2表示第二張圖像的像素矩陣

– dst表示輸出的圖像,必須和輸入圖像具有相同的大小和通道數

– mask表示可選操作掩碼(8位單通道數組),用於指定要更改的輸出數組的元素。

– dtype表示輸出數組的可選深度

具體實現代碼如下所示:

#coding:utf-8
# By:Eastmount
import cv2  
import numpy as np  
 
#讀取圖片 
img = cv2.imread("luo.png")

#圖像各像素減50
m = np.ones(img.shape, dtype="uint8")*50

#OpenCV減法運算
result = cv2.subtract(img, m)

#顯示圖像
cv2.imshow("original", img)
cv2.imshow("result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出如圖4-2所示,左邊為原始圖像,右邊為像素值減少50像素後的圖像,輸出圖像顯示更偏暗。

三.圖像與運算

與運算是計算機中一種基本的邏輯運算方式,符號表示為“&”,其運算規則為:

  • 0&0=0
  • 0&1=0
  • 1&0=0
  • 1&1=1

圖像的與運算是指兩張圖像(灰度圖像或彩色圖像均可)的每個像素值進行二進制“與”操作,實現圖像裁剪。

dst = bitwise_and(src1, src2[, dst[, mask]])

– src1表示第一張圖像的像素矩陣

– src2表示第二張圖像的像素矩陣

– dst表示輸出的圖像,必須和輸入圖像具有相同的大小和通道數

– mask表示可選操作掩碼(8位單通道數組),用於指定要更改的輸出數組的元素。

下面代碼是通過圖像與運算實現圖像剪裁的功能。

#coding:utf-8
# By:Eastmount
import cv2  
import numpy as np  
 
#讀取圖片 
img = cv2.imread("luo.png", cv2.IMREAD_GRAYSCALE)

#獲取圖像寬和高
rows, cols = img.shape[:2]
print(rows, cols)

#畫圓形
circle = np.zeros((rows, cols), dtype="uint8")
cv2.circle(circle, (int(rows/2),int(cols/2)), 100, 255, -1)
print(circle.shape)
print(img.size, circle.size)

#OpenCV圖像與運算
result = cv2.bitwise_and(img, circle)

#顯示圖像
cv2.imshow("original", img)
cv2.imshow("circle", circle)
cv2.imshow("result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出如圖4-3所示,原始圖像與圓形進行與運算之後,提取瞭其中心輪廓。同時輸出圖像的形狀為377×326。註意,兩張圖像的大小和類型必須一致。

四.圖像或運算

邏輯或運算是指如果一個操作數或多個操作數為 true,則邏輯或運算符返回佈爾值 true;隻有全部操作數為false,結果才是 false。圖像的或運算是指兩張圖像(灰度圖像或彩色圖像均可)的每個像素值進行二進制“或”操作,實現圖像裁剪。其函數原型如下所示:

dst = bitwise_or(src1, src2[, dst[, mask]])

– src1表示第一張圖像的像素矩陣

– src2表示第二張圖像的像素矩陣

– dst表示輸出的圖像,必須和輸入圖像具有相同的大小和通道數

– mask表示可選操作掩碼(8位單通道數組),用於指定要更改的輸出數組的元素。

下面代碼是通過圖像或運算實現圖像剪裁的功能。

#coding:utf-8
# By:Eastmount
import cv2  
import numpy as np  
 
#讀取圖片 
img = cv2.imread("luo.png", cv2.IMREAD_GRAYSCALE)

#獲取圖像寬和高
rows, cols = img.shape[:2]

#畫圓形
circle = np.zeros((rows, cols), dtype="uint8")
cv2.circle(circle, (int(rows/2),int(cols/2)), 100, 255, -1)

#OpenCV圖像或運算
result = cv2.bitwise_or(img, circle)

#顯示圖像
cv2.imshow("original", img)
cv2.imshow("circle", circle)
cv2.imshow("result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出如圖4-4所示,原始圖像與圓形進行或運算之後,提取瞭圖像除中心原形之外的像素值。

五.圖像非運算

圖像非運算就是圖像的像素反色處理,它將原始圖像的黑色像素點轉換為白色像素點,白色像素點則轉換為黑色像素點,其函數原型如下:

dst = bitwise_not(src1, src2[, dst[, mask]])

– src1表示第一張圖像的像素矩陣

– src2表示第二張圖像的像素矩陣

– dst表示輸出的圖像,必須和輸入圖像具有相同的大小和通道數

– mask表示可選操作掩碼(8位單通道數組),用於指定要更改的輸出數組的元素。

圖像非運算的實現代碼如下所示。

#coding:utf-8
import cv2  
import numpy as np  
 
#讀取圖片 
img = cv2.imread("Lena.png", cv2.IMREAD_GRAYSCALE)

#OpenCV圖像非運算
result = cv2.bitwise_not(img)

#顯示圖像
cv2.imshow("original", img)
cv2.imshow("result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

原始圖像非運算之後輸出如圖4-5所示。

六.圖像異或運算

邏輯異或運算(xor)是一個數學運算符,數學符號為“⊕”,計算機符號為“xor”,其運算法則為:如果a、b兩個值不相同,則異或結果為1;如果a、b兩個值相同,異或結果為0。

圖像的異或運算是指兩張圖像(灰度圖像或彩色圖像均可)的每個像素值進行二進制“異或”操作,實現圖像裁剪。其函數原型如下所示:

dst = bitwise_xor(src1, src2[, dst[, mask]])

– src1表示第一張圖像的像素矩陣

– src2表示第二張圖像的像素矩陣

– dst表示輸出的圖像,必須和輸入圖像具有相同的大小和通道數

– mask表示可選操作掩碼(8位單通道數組),用於指定要更改的輸出數組的元素。

圖像異或運算的實現代碼如下所示。

#coding:utf-8
# By:Eastmount
import cv2  
import numpy as np  
 
#讀取圖片 
img = cv2.imread("luo.png", cv2.IMREAD_GRAYSCALE)

#獲取圖像寬和高
rows, cols = img.shape[:2]

#畫圓形
circle = np.zeros((rows, cols), dtype="uint8")
cv2.circle(circle, (int(rows/2),int(cols/2)), 100, 255, -1)

#OpenCV圖像異或運算
result = cv2.bitwise_xor(img, circle)

#顯示圖像
cv2.imshow("original", img)
cv2.imshow("circle", circle)
cv2.imshow("result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

原始圖像與圓形進行異或運算之後輸出如圖4-6所示。

七.總結

本文詳細介紹瞭圖像處理的算術運算與邏輯運算,包括圖像加法、圖像減法、圖像與運算、圖像或運算、圖像非運算與圖像異或運算,並以“小珞珞”圖像為案例進行講解,希望對您有所幫助。

到此這篇關於Python圖像處理之圖像算術與邏輯運算詳解的文章就介紹到這瞭,更多相關Python圖像算術 邏輯運算內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: