Python中圖像算術(shù)運(yùn)算的示例詳解
介紹
還記得你在小學(xué)時(shí)學(xué)習(xí)如何加減數(shù)字嗎?現(xiàn)在,你也可以對(duì)圖像做同樣的事情!
輸入圖像可以進(jìn)行算術(shù)運(yùn)算,例如加法、減法和按位運(yùn)算(AND、OR、NOT、XOR)。這些操作可以幫助提高輸入照片的質(zhì)量。
在本文中,你將了解使用 OpenCV Python 包對(duì)圖像執(zhí)行算術(shù)和按位運(yùn)算的步驟。讓我們開(kāi)始吧!
對(duì)圖像進(jìn)行算術(shù)運(yùn)算是什么意思?
因此,假設(shè)我們希望合并兩張單獨(dú)的照片中的兩個(gè)像素。我們?cè)鯓硬拍軐⑺鼈兒喜ⅲ?/p>
讓我們想象以下場(chǎng)景。第一個(gè)像素的顏色強(qiáng)度為 (200, 0, 0),而第二個(gè)像素的顏色強(qiáng)度為 (100, 0, 0)。如果我們只是將這些值相加,我們得到 (300, 0, 0)。這在處理 RGB 圖像時(shí)是完全可能的。
那么,我們?nèi)绾卧?Python 中解決這個(gè)問(wèn)題呢?
該解決方案附帶實(shí)現(xiàn)了 cv2.add() 和 cv2.subtract() 函數(shù)的 OpenCV 庫(kù)。
要執(zhí)行這些操作,你必須在系統(tǒng)上安裝 OpenCV Python 庫(kù)。
算術(shù)運(yùn)算:圖像相加
使用 cv2.add() 函數(shù),我們可以添加兩個(gè)圖像。cv2.add() 將兩個(gè)圖像中的圖片像素相加。執(zhí)行此操作時(shí)要記住的一件事是,兩個(gè)圖像應(yīng)該具有相同的深度和類型,或者第二個(gè)圖像可以只是一個(gè)標(biāo)量值。
這個(gè)函數(shù)的語(yǔ)法是:cv2.add(img1, img2)
對(duì)于這個(gè)博客,我們將考慮以下兩張圖片來(lái)將兩張圖片相加。
在進(jìn)行算術(shù)運(yùn)算之前,你必須知道如何讀取和顯示加載的圖像。
現(xiàn)在,按照下面的代碼片段閱讀,執(zhí)行兩個(gè)圖像的添加,最后顯示添加的圖像。
import cv2 img1 = cv2.imread('image1_add.jpg', 1) #or #img1 = cv2.imread('C:\\Users\\Admin\\Downloads\\image1_add.jpg', 1) cv2.imshow('Image 1', img1) cv2.waitKey(0) cv2.destroyAllWindows() img2 = cv2.imread('image2_add.jpg', 1) #or #img2 = cv2.imread('C:\\Users\\Admin\\Downloads\\image2_add.jpg', 1) cv2.imshow('Image 2', img2) cv2.waitKey(0) cv2.destroyAllWindows() # Add the images added_img = cv2.add(img1, img2) cv2.imshow('Added Image', added_img) cv2.waitKey(0) cv2.destroyAllWindows()
從上面的代碼片段中添加的圖像如下:
這只是簡(jiǎn)單的添加。我們可以使用另一個(gè)名為 cv2.addWeighted 的函數(shù)來(lái)混合圖像。這類似于圖像添加,但圖像被賦予不同的權(quán)重以產(chǎn)生混合或透明的錯(cuò)覺(jué)。
這個(gè)函數(shù)的語(yǔ)法是:cv2.addWeighted(img1, wt1, img2, wt2, gammaValue)
按照下面的代碼片段對(duì)兩個(gè)圖像執(zhí)行加權(quán)加法。
import cv2 img1 = cv2.imread('image1_add.jpg', 1) #or #img1 = cv2.imread('C:\\Users\\Admin\\Downloads\\image1_add.jpg', 1) cv2.imshow('Image 1', img1) cv2.waitKey(0) cv2.destroyAllWindows() img2 = cv2.imread('image2_add.jpg', 1) #or #img2 = cv2.imread('C:\\Users\\Admin\\Downloads\\image2_add.jpg', 1) cv2.imshow('Image 2', img2) cv2.waitKey(0) cv2.destroyAllWindows() #Addition - weighted addition added_wt_img = cv2.addWeighted(img1, 0.6, img2, 0.4, 0) cv2.imshow('Added Weight Image', added_wt_img) cv2.waitKey(0) cv2.destroyAllWindows()
加權(quán)加法的輸出如下:
在這里,拍攝了兩張圖像將它們混合在一起。第一張圖片的權(quán)重為 0.6,第二張圖片的權(quán)重為 0.4。你可以根據(jù)需要更改圖像的權(quán)重!
算術(shù)運(yùn)算:圖像減法
就像兩個(gè)圖像相加一樣,你可以減去兩個(gè)圖像。這可以使用 cv2.subtract() 函數(shù)來(lái)完成。請(qǐng)注意,要減去的圖像必須具有相同的大小和深度。
這個(gè)函數(shù)的語(yǔ)法是:cv2.subtract(src1, src2)
下面的代碼片段顯示了如何減去兩個(gè)圖像。已經(jīng)減去了之前使用的圖像(我們?cè)诩臃ㄖ惺褂玫膱D像)。
import cv2 img1 = cv2.imread('image1_add.jpg', 1) #or #img1 = cv2.imread('C:\\Users\\Admin\\Downloads\\image1_add.jpg', 1) cv2.imshow('Image 1', img1) cv2.waitKey(0) cv2.destroyAllWindows() img2 = cv2.imread('image2_add.jpg', 1) #or #img2 = cv2.imread('C:\\Users\\Admin\\Downloads\\image2_add.jpg', 1) cv2.imshow('Image 2', img2) cv2.waitKey(0) cv2.destroyAllWindows() sub_img = cv2.subtract(img1, img2) cv2.imshow('Subtracted Image', sub_img) cv2.waitKey(0) cv2.destroyAllWindows()
減去的圖像如下:
還嘗試減去兩個(gè)更簡(jiǎn)單的圖像以使其更易于理解。使用的兩張圖片是:
減去的輸出是:
既然我們已經(jīng)了解了如何對(duì)圖像執(zhí)行算術(shù)運(yùn)算,我們將繼續(xù)對(duì)圖像進(jìn)行按位運(yùn)算。
位運(yùn)算
當(dāng)我們只需要提取圖像所需的元素時(shí),我們會(huì)使用按位運(yùn)算。
這些按位技術(shù)用于各種計(jì)算機(jī)視覺(jué)應(yīng)用,例如創(chuàng)建圖像蒙版、將水印應(yīng)用于圖像以及創(chuàng)建新圖像。與 OpenCV 中的其他變形方法相比,這些操作對(duì)圖像中的單個(gè)像素起作用,以產(chǎn)生更準(zhǔn)確的結(jié)果。
圖像上的 And、Or 和 Not 操作
在開(kāi)始之前,假設(shè)你熟悉三個(gè)基本的位運(yùn)算符:AND、OR、NOT。
OpenCV 包括用于執(zhí)行與、或和非操作的內(nèi)置函數(shù)。它們是按位與、按位或和按位非??紤]下面的兩張黑白圖像?,F(xiàn)在讓我們將這三個(gè)操作應(yīng)用于這兩個(gè)圖像,看看會(huì)發(fā)生什么。
import cv2 #read the images img1 = cv2.imread('bitwise_image_1.jpg') img2 = cv2.imread('bitwise_image_2.jpg') bitwise_AND = cv2.bitwise_and(img1, img2) bitwise_OR = cv2.bitwise_or(img1, img2) bitwise_NOT = cv2.bitwise_not(img1) cv2.imshow('img1', img1) cv2.waitKey(0) cv2.destroyAllWindows() cv2.imshow('img2', img2) cv2.waitKey(0) cv2.destroyAllWindows() cv2.imshow('AND', bitwise_AND) cv2.waitKey(0) cv2.destroyAllWindows() cv2.imshow('OR', bitwise_OR) cv2.waitKey(0) cv2.destroyAllWindows() cv2.imshow('NOT', bitwise_NOT) cv2.waitKey(0) cv2.destroyAllWindows()
上述代碼段的輸出將如下所示:
希望你已經(jīng)學(xué)會(huì)了如何使用 OpenCV 對(duì)圖像進(jìn)行算術(shù)和按位運(yùn)算。
以上就是Python中圖像算術(shù)運(yùn)算的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Python圖像算術(shù)運(yùn)算的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python [:3] 實(shí)現(xiàn)提取數(shù)組中的數(shù)
今天小編就為大家分享一篇python [:3] 實(shí)現(xiàn)提取數(shù)組中的數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11Python3.5以上版本lxml導(dǎo)入etree報(bào)錯(cuò)的解決方案
這篇文章主要介紹了Python3.5以上版本lxml導(dǎo)入etree報(bào)錯(cuò)的解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-06-06學(xué)習(xí)python如何處理需要登錄的網(wǎng)站步驟
這篇文章主要為大家介紹了python如何處理需要登錄的網(wǎng)站步驟學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10Python Flask搭建yolov3目標(biāo)檢測(cè)系統(tǒng)詳解流程
YOLOv3沒(méi)有太多的創(chuàng)新,主要是借鑒一些好的方案融合到Y(jié)OLO里面。不過(guò)效果還是不錯(cuò)的,在保持速度優(yōu)勢(shì)的前提下,提升了預(yù)測(cè)精度,尤其是加強(qiáng)了對(duì)小物體的識(shí)別能力2021-11-11python利用小波分析進(jìn)行特征提取的實(shí)例
今天小編就為大家分享一篇python利用小波分析進(jìn)行特征提取的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Python安裝xarray庫(kù)讀取.nc文件的詳細(xì)步驟
大家應(yīng)該都知道庫(kù)xarray可以幫我們讀取出nc文件的內(nèi)容,所以下面這篇文章主要給大家介紹了關(guān)于Python安裝xarray讀取.nc文件的詳細(xì)步驟,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07