Python圖像處理之圖像算術(shù)與邏輯運算詳解
一.圖像加法運算
圖像加法運算主要有兩種方法。第一種是調(diào)用Numpy庫實現(xiàn),目標(biāo)圖像像素為兩張圖像的像素之和;第二種是通過OpenCV調(diào)用add()函數(shù)實現(xiàn)。第二種方法的函數(shù)原型如下:
dst = add(src1, src2[, dst[, mask[, dtype]]])
– src1表示第一張圖像的像素矩陣
– src2表示第二張圖像的像素矩陣
– dst表示輸出的圖像,必須和輸入圖像具有相同的大小和通道數(shù)
– mask表示可選操作掩碼(8位單通道數(shù)組),用于指定要更改的輸出數(shù)組的元素。
– dtype表示輸出數(shù)組的可選深度
注意,當(dāng)兩幅圖像的像素值相加結(jié)果小于等于255時,則輸出圖像直接賦值該結(jié)果,如120+48賦值為168;如果相加值大于255,則輸出圖像的像素結(jié)果設(shè)置為255,如(255+64) 賦值為255。下面的代碼實現(xiàn)了圖像加法運算。
#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像素后的圖像,輸出圖像顯示更偏白。

二.圖像減法運算
圖像減法運算主要調(diào)用subtract()函數(shù)實現(xiàn),其原型如下所示:
dst = subtract(src1, src2[, dst[, mask[, dtype]]])
– src1表示第一張圖像的像素矩陣
– src2表示第二張圖像的像素矩陣
– dst表示輸出的圖像,必須和輸入圖像具有相同的大小和通道數(shù)
– mask表示可選操作掩碼(8位單通道數(shù)組),用于指定要更改的輸出數(shù)組的元素。
– dtype表示輸出數(shù)組的可選深度
具體實現(xiàn)代碼如下所示:
#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像素后的圖像,輸出圖像顯示更偏暗。

三.圖像與運算
與運算是計算機中一種基本的邏輯運算方式,符號表示為“&”,其運算規(guī)則為:
- 0&0=0
- 0&1=0
- 1&0=0
- 1&1=1
圖像的與運算是指兩張圖像(灰度圖像或彩色圖像均可)的每個像素值進行二進制“與”操作,實現(xiàn)圖像裁剪。
dst = bitwise_and(src1, src2[, dst[, mask]])
– src1表示第一張圖像的像素矩陣
– src2表示第二張圖像的像素矩陣
– dst表示輸出的圖像,必須和輸入圖像具有相同的大小和通道數(shù)
– mask表示可選操作掩碼(8位單通道數(shù)組),用于指定要更改的輸出數(shù)組的元素。
下面代碼是通過圖像與運算實現(xiàn)圖像剪裁的功能。
#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。注意,兩張圖像的大小和類型必須一致。

四.圖像或運算
邏輯或運算是指如果一個操作數(shù)或多個操作數(shù)為 true,則邏輯或運算符返回布爾值 true;只有全部操作數(shù)為false,結(jié)果才是 false。圖像的或運算是指兩張圖像(灰度圖像或彩色圖像均可)的每個像素值進行二進制“或”操作,實現(xiàn)圖像裁剪。其函數(shù)原型如下所示:
dst = bitwise_or(src1, src2[, dst[, mask]])
– src1表示第一張圖像的像素矩陣
– src2表示第二張圖像的像素矩陣
– dst表示輸出的圖像,必須和輸入圖像具有相同的大小和通道數(shù)
– mask表示可選操作掩碼(8位單通道數(shù)組),用于指定要更改的輸出數(shù)組的元素。
下面代碼是通過圖像或運算實現(xiàn)圖像剪裁的功能。
#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所示,原始圖像與圓形進行或運算之后,提取了圖像除中心原形之外的像素值。

五.圖像非運算
圖像非運算就是圖像的像素反色處理,它將原始圖像的黑色像素點轉(zhuǎn)換為白色像素點,白色像素點則轉(zhuǎn)換為黑色像素點,其函數(shù)原型如下:
dst = bitwise_not(src1, src2[, dst[, mask]])
– src1表示第一張圖像的像素矩陣
– src2表示第二張圖像的像素矩陣
– dst表示輸出的圖像,必須和輸入圖像具有相同的大小和通道數(shù)
– mask表示可選操作掩碼(8位單通道數(shù)組),用于指定要更改的輸出數(shù)組的元素。
圖像非運算的實現(xiàn)代碼如下所示。
#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)是一個數(shù)學(xué)運算符,數(shù)學(xué)符號為“⊕”,計算機符號為“xor”,其運算法則為:如果a、b兩個值不相同,則異或結(jié)果為1;如果a、b兩個值相同,異或結(jié)果為0。
圖像的異或運算是指兩張圖像(灰度圖像或彩色圖像均可)的每個像素值進行二進制“異或”操作,實現(xiàn)圖像裁剪。其函數(shù)原型如下所示:
dst = bitwise_xor(src1, src2[, dst[, mask]])
– src1表示第一張圖像的像素矩陣
– src2表示第二張圖像的像素矩陣
– dst表示輸出的圖像,必須和輸入圖像具有相同的大小和通道數(shù)
– mask表示可選操作掩碼(8位單通道數(shù)組),用于指定要更改的輸出數(shù)組的元素。
圖像異或運算的實現(xiàn)代碼如下所示。
#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所示。

七.總結(jié)
本文詳細介紹了圖像處理的算術(shù)運算與邏輯運算,包括圖像加法、圖像減法、圖像與運算、圖像或運算、圖像非運算與圖像異或運算,并以“小珞珞”圖像為案例進行講解,希望對您有所幫助。
到此這篇關(guān)于Python圖像處理之圖像算術(shù)與邏輯運算詳解的文章就介紹到這了,更多相關(guān)Python圖像算術(shù) 邏輯運算內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python+appium+yaml移動端自動化測試框架實現(xiàn)詳解
這篇文章主要介紹了python+appium+yaml移動端自動化測試框架實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
為什么黑客都用python(123個黑客必備的Python工具)
python支持功能強大的黑客攻擊模塊,而且Python提供多種庫,用于支持黑客攻擊,Python提供了ctypes庫, 借助它, 黑客可以訪問Windows、OS X、Linux等系統(tǒng)提供 DLL與共享庫,還有Python語言易學(xué)易用,這對黑客攻擊而言是個巨大的優(yōu)勢。2020-01-01
基于Python實現(xiàn)五子棋-(人機對戰(zhàn))
這篇文章主要為大家詳細介紹了如何利用Python實現(xiàn)五子棋游戲(人機對戰(zhàn)版),文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2022-05-05
python機器學(xué)習(xí)基礎(chǔ)決策樹與隨機森林概率論
這篇文章主要為大家介紹了python機器學(xué)習(xí)基礎(chǔ)決策樹與隨機森林概率論詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-11-11
Python 基于wxpy庫實現(xiàn)微信添加好友功能(簡潔)
這篇文章主要介紹了Python 基于wxpy庫實現(xiàn)微信添加好友功能,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-11-11
Python實現(xiàn)字符串與數(shù)組相互轉(zhuǎn)換功能示例
這篇文章主要介紹了Python實現(xiàn)字符串與數(shù)組相互轉(zhuǎn)換功能,結(jié)合具體實例形式分析了Python字符串與數(shù)組相關(guān)轉(zhuǎn)換功能的相關(guān)實現(xiàn)技巧與注意事項,需要的朋友可以參考下2017-09-09
關(guān)于python tushare Tkinter構(gòu)建的簡單股票可視化查詢系統(tǒng)(Beta v0.13)
這篇文章主要介紹了python tushare Tkinter構(gòu)建的簡單股票可視化查詢系統(tǒng)(Beta v0.13),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10

