Python圖像處理之圖像融合與ROI區(qū)域繪制詳解
一.圖像融合
圖像融合通常是指多張圖像的信息進(jìn)行融合,從而獲得信息更豐富的結(jié)果,能夠幫助人們觀察或計(jì)算機(jī)處理。圖5-1是將兩張不清晰的圖像融合得到更清晰的效果圖。
圖像融合是在圖像加法的基礎(chǔ)上增加了系數(shù)和亮度調(diào)節(jié)量,它與圖像的主要區(qū)別如下[1-3]:
圖像加法:目標(biāo)圖像 = 圖像1 + 圖像2
圖像融合:目標(biāo)圖像 = 圖像1 × 系數(shù)1 + 圖像2 × 系數(shù)2 + 亮度調(diào)節(jié)量
在OpenCV中,圖像融合主要調(diào)用addWeighted()函數(shù)實(shí)現(xiàn),其原型如下。需要注意的是,兩張融合圖像的像素大小必須一致,參數(shù)gamma不能省略。
dst = cv2.addWeighted(scr1, alpha, src2, beta, gamma) dst = src1 * alpha + src2 * beta + gamma
下面的代碼是將兩張圖片進(jìn)行圖像融合,兩張圖片的系數(shù)均為1。
#coding:utf-8 # By:Eastmount import cv2 ? import numpy as np ? import matplotlib.pyplot as plt ? #讀取圖片 src1 = cv2.imread('lena.png') src2 = cv2.imread('luo.png') #圖像融合 result = cv2.addWeighted(src1, 1, src2, 1, 0) #顯示圖像 cv2.imshow("src1", src1) cv2.imshow("src2", src2) cv2.imshow("result", result) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
輸出結(jié)果如圖5-2所示,它將src1圖像和src2圖像按比例系數(shù)進(jìn)行了融合,生成目標(biāo)結(jié)果圖result。
同樣可以設(shè)置不同的融合比例,圖5-3是下面核心函數(shù)的效果圖。
cv2.addWeighted(src1, 0.6, src2, 0.8, 10)
二.圖像ROI區(qū)域定位
ROI(Region of Interest)表示感興趣區(qū)域,是指從被處理圖像以方框、圓形、橢圓、不規(guī)則多邊形等方式勾勒出需要處理的區(qū)域??梢酝ㄟ^(guò)各種算子(Operator)和函數(shù)求得感興趣ROI區(qū)域,被廣泛應(yīng)用于熱點(diǎn)地圖、人臉識(shí)別、圖像分割等領(lǐng)域。如圖5-4獲取Lena圖的臉部輪廓[4]。
通過(guò)像素矩陣可以直接獲取ROI區(qū)域,如img[200:400, 200:400]。下面的代碼是獲取臉部ROI區(qū)域并顯示。
# -*- coding:utf-8 -*- # By:Eastmount import cv2 import numpy as np #讀取圖片 img = cv2.imread("lena.png") #定義200×200矩陣 3對(duì)應(yīng)BGR face = np.ones((200, 200, 3)) #顯示原始圖像 cv2.imshow("Demo", img) #顯示ROI區(qū)域 face = img[150:350, 150:350] cv2.imshow("face", face) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
輸出結(jié)果如圖5-5所示,它將Lena原圖的臉部提取出來(lái)。
同樣,如果想將提取的ROI區(qū)域融合至其他圖片,則使用賦值語(yǔ)句即可。下面代碼是將提取的Lena頭部輪廓融合至一幅新的圖像中。
# -*- coding:utf-8 -*- # By:Eastmount import cv2 import numpy as np #讀取圖片 img = cv2.imread("Lena.png") test = cv2.imread("luo.png",) #定義150×150矩陣 3對(duì)應(yīng)BGR face = np.ones((150, 150, 3)) #顯示原始圖像 cv2.imshow("Demo", img) #顯示ROI區(qū)域 face = img[200:350, 200:350] test[250:400, 250:400] = face cv2.imshow("Result", test) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
運(yùn)行結(jié)果如圖5-6所示,它將提取的150×150臉部輪廓融合至新的圖像[250:400, 250:400] 區(qū)域。
三.圖像屬性
前面一篇文章中我們已經(jīng)看到了size、shape等關(guān)鍵字。這篇文章就對(duì)圖像中最常見(jiàn)的三個(gè)屬性進(jìn)行介紹,它們分別是圖像形狀(shape)、像素大?。╯ize)和圖像類型(dtype)。
(1)shape
通過(guò)shape關(guān)鍵字獲取圖像的形狀,返回包含行數(shù)、列數(shù)、通道數(shù)的元組。其中灰度圖像返回行數(shù)和列數(shù),彩色圖像返回行數(shù)、列數(shù)和通道數(shù)。
# -*- coding:utf-8 -*- # By:Eastmount import cv2 import numpy #讀取圖片 img = cv2.imread("luo.png") #獲取圖像形狀 print(img.shape) #顯示圖像 cv2.imshow("Demo", img) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
最終輸出結(jié)果如圖5-7所示,(412,412,3),它表示該圖像共412行、412列像素,包括3個(gè)通道。
(2)size
通過(guò)size關(guān)鍵字獲取圖像的像素?cái)?shù)目,其中灰度圖像返回行數(shù)×列數(shù),彩色圖像返回行數(shù)×列數(shù)×通道數(shù)。下述代碼就是獲取“luo.png”圖像的大小。
# -*- coding:utf-8 -*- # By:Eastmount import cv2 import numpy #讀取圖片 img = cv2.imread("luo.png") #獲取圖像形狀 print(img.shape) #獲取像素?cái)?shù)目 print(img.size)
輸出結(jié)果如下所示,包含510468個(gè)像素,即為413×412×3。
(412, 412, 3)
509232
(3)dtype
通過(guò)dtype關(guān)鍵字獲取圖像的數(shù)據(jù)類型,通常返回uint8。
# -*- coding:utf-8 -*- # By:Eastmount import cv2 import numpy #讀取圖片 img = cv2.imread("Lena.png") #獲取圖像形狀 print(img.shape) #獲取像素?cái)?shù)目 print(img.size) #獲取圖像數(shù)據(jù)類型 print(img.dtype)
四.圖像通道分離及合并
OpenCV通過(guò)split()函數(shù)和merge()函數(shù)實(shí)現(xiàn)對(duì)圖像通道的處理,包括通道分離和通道合并。
(1)split()函數(shù)
OpenCV讀取的彩色圖像由藍(lán)色(B)、綠色(G)、紅色(R)三原色組成,每一種顏色可以認(rèn)為是一個(gè)通道分量[4],如圖5-8所示。
split()函數(shù)用于將一個(gè)多通道數(shù)組分量成三個(gè)單通道,其函數(shù)原型如下所示:
mv = split(m[, mv])
– m表示輸入的多通道數(shù)組
– mv表示輸出的數(shù)組或vector容器
下面的代碼是獲取彩色“小珞珞”圖像三個(gè)顏色通道并分別顯示。
# -*- coding:utf-8 -*- # By:Eastmount import cv2 import numpy #讀取圖片 img = cv2.imread("luo.png") #拆分通道 b, g, r = cv2.split(img) #顯示原始圖像 cv2.imshow("B", b) cv2.imshow("G", g) cv2.imshow("R", r) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
顯示結(jié)果如圖5-9所示,它展示了B、G、R三個(gè)通道的顏色分量。
同時(shí),可以獲取不同通道顏色,核心代碼為:
- b = cv2.split(a)[0]
- g = cv2.split(a)[1]
- r = cv2.split(a)[2]
(2)merge()函數(shù)
該函數(shù)是split()函數(shù)的逆向操作,將多個(gè)數(shù)組合成一個(gè)通道的數(shù)組,從而實(shí)現(xiàn)圖像通道的合并,其函數(shù)原型如下:
dst = merge(mv[, dst])
– mv表示輸入的需要合并的數(shù)組,所有矩陣必須有相同的大小和深度
– dst表示輸出具有與mv相同大小和深度的數(shù)組
實(shí)現(xiàn)圖像三個(gè)顏色通道融合的代碼如下:
# -*- coding:utf-8 -*- # By:Eastmount import cv2 import numpy as np #讀取圖片 img = cv2.imread("luo.png") #拆分通道 b, g, r = cv2.split(img) #合并通道 m = cv2.merge([b, g, r]) cv2.imshow("Merge", m) ? ? ? ? ? ? #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
顯示結(jié)果如圖5-10所示,它將拆分的B、G、R三個(gè)通道的顏色分量進(jìn)行了合并,接著顯示合并后的圖像。
同時(shí),可以調(diào)用該函數(shù)提取圖像的不同顏色,比如提取B顏色通道,G、B通道設(shè)置為0。代碼如下所示:
# -*- coding:utf-8 -*- # By:Eastmount import cv2 import numpy as np #讀取圖片 img = cv2.imread("luo.png") rows, cols, chn = img.shape #拆分通道 b = cv2.split(img)[0] #設(shè)置g、r通道為0 g = np.zeros((rows,cols), dtype=img.dtype) r = np.zeros((rows,cols), dtype=img.dtype) #合并通道 m = cv2.merge([b, g, r]) cv2.imshow("Merge", m) ? ? ? ? ? ? #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
此時(shí)顯示的圖像為藍(lán)色通道,如圖5-11所示,其他顏色的通道方法也類似。
五.圖像類型轉(zhuǎn)換
在日常生活中,我們看到的大多數(shù)彩色圖像都是RGB類型,但是在圖像處理過(guò)程中,常常需要用到灰度圖像、二值圖像、HSV、HSI等顏色。圖像類型轉(zhuǎn)換是指將一種類型轉(zhuǎn)換為另一種類型,比如彩色圖像轉(zhuǎn)換為灰度圖像、BGR圖像轉(zhuǎn)換為RGB圖像。OpenCV提供了200多種不同類型之間的轉(zhuǎn)換,其中最常用的包括3類,如下:
- cv2.COLOR_BGR2GRAY
- cv2.COLOR_BGR2RGB
- cv2.COLOR_GRAY2BGR
OpenCV提供了cvtColor()函數(shù)實(shí)現(xiàn)這些功能。其函數(shù)原型如下所示:
dst = cv2.cvtColor(src, code[, dst[, dstCn]])
– src表示輸入圖像,需要進(jìn)行顏色空間變換的原圖像
– dst表示輸出圖像,其大小和深度與src一致
– code表示轉(zhuǎn)換的代碼或標(biāo)識(shí)
– dstCn表示目標(biāo)圖像通道數(shù),其值為0時(shí),則有src和code決定
該函數(shù)的作用是將一個(gè)圖像從一個(gè)顏色空間轉(zhuǎn)換到另一個(gè)顏色空間,其中,RGB是指Red、Green和Blue,一副圖像由這三個(gè)通道(channel)構(gòu)成;Gray表示只有灰度值一個(gè)通道;HSV包含Hue(色調(diào))、Saturation(飽和度)和Value(亮度)三個(gè)通道。在OpenCV中,常見(jiàn)的顏色空間轉(zhuǎn)換標(biāo)識(shí)包括CV_BGR2BGRA、CV_RGB2GRAY、CV_GRAY2RGB、CV_BGR2HSV、CV_BGR2XYZ、CV_BGR2HLS[3]。
下面是調(diào)用cvtColor()函數(shù)將圖像進(jìn)行灰度化處理的代碼。
# -*- coding:utf-8 -*- # By:Eastmount import cv2 ? import numpy as np ? import matplotlib.pyplot as plt ? #讀取圖片 src = cv2.imread('luo.png') #圖像類型轉(zhuǎn)換 result = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) #顯示圖像 cv2.imshow("src", src) cv2.imshow("result", result) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
輸出結(jié)果如圖5-12所示,它將左邊的彩色圖像轉(zhuǎn)換為右邊的灰度圖像,更多灰度轉(zhuǎn)化算法將在后面的文章詳細(xì)介紹。
同樣,可以調(diào)用下列核心代碼將彩色圖像轉(zhuǎn)換為HSV顏色空間,如圖5-13所示。
grayImage = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
下面代碼對(duì)比了九種常見(jiàn)的顏色空間,包括BGR、RGB、GRAY、HSV、YCrCb、HLS、XYZ、LAB和YUV,并循環(huán)顯示處理后的圖像。
# -*- coding:utf-8 -*- # By:Eastmount import cv2 ? import numpy as np ? import matplotlib.pyplot as plt #讀取原始圖像 img_BGR = cv2.imread('luo.png') #BGR轉(zhuǎn)換為RGB img_RGB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2RGB) #灰度化處理 img_GRAY = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2GRAY) #BGR轉(zhuǎn)HSV img_HSV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HSV) #BGR轉(zhuǎn)YCrCb img_YCrCb = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YCrCb) #BGR轉(zhuǎn)HLS img_HLS = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HLS) #BGR轉(zhuǎn)XYZ img_XYZ = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2XYZ) #BGR轉(zhuǎn)LAB img_LAB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2LAB) #BGR轉(zhuǎn)YUV img_YUV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YUV) #調(diào)用matplotlib顯示處理結(jié)果 titles = ['BGR', 'RGB', 'GRAY', 'HSV', 'YCrCb', 'HLS', 'XYZ', 'LAB', 'YUV'] ? images = [img_BGR, img_RGB, img_GRAY, img_HSV, img_YCrCb, ? ? ? ? ? img_HLS, img_XYZ, img_LAB, img_YUV] ? for i in range(9): ? ? ?plt.subplot(3, 3, i+1), plt.imshow(images[i], 'gray') ? ? ?plt.title(titles[i]) ? ? ?plt.xticks([]),plt.yticks([]) ? plt.show()
其運(yùn)行結(jié)果如圖5-14所示:
六.總結(jié)
本章主要講解Python和OpenCV的圖像基礎(chǔ)處理,從讀取顯示圖像到讀取修改像素,從創(chuàng)建、復(fù)制、保存圖像到獲取圖像屬性合通道,再詳細(xì)講解了圖像算數(shù)與邏輯運(yùn)算,包括圖像加法、減法、與運(yùn)算、或運(yùn)算、異或運(yùn)算、非運(yùn)算,最后講解了圖像融合和獲取圖像ROI區(qū)域及圖像類型轉(zhuǎn)換。本章知識(shí)為后續(xù)的圖像處理、圖像識(shí)別、圖像變換打下扎實(shí)基礎(chǔ)。
以上就是Python圖像處理之圖像融合與ROI區(qū)域繪制詳解的詳細(xì)內(nèi)容,更多關(guān)于Python圖像處理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
selenium2.0中常用的python函數(shù)匯總
這篇文章主要介紹了selenium2.0中常用的python函數(shù),總結(jié)分析了selenium2.0中常用的python函數(shù)的功能、原理與基本用法,需要的朋友可以參考下2019-08-08pyinstaller打包單個(gè)exe后無(wú)法執(zhí)行錯(cuò)誤的解決方法
今天小編就為大家分享一篇pyinstaller打包單個(gè)exe后無(wú)法執(zhí)行錯(cuò)誤的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06Python實(shí)現(xiàn)前向和反向自動(dòng)微分的示例代碼
自動(dòng)微分技術(shù)(稱為“automatic differentiation, autodiff”)是介于符號(hào)微分和數(shù)值微分的一種技術(shù),它是在計(jì)算效率和計(jì)算精度之間的一種折衷。本文主要介紹了Python如何實(shí)現(xiàn)前向和反向自動(dòng)微分,需要的可以參考一下2022-12-12Python?Fuzzywuzzy庫(kù)基本函數(shù)及模糊字符串匹配應(yīng)用實(shí)戰(zhàn)
fuzzywuzzy?是一個(gè)用于模糊字符串匹配的?Python?庫(kù),它基于編輯距離算法,提供了多個(gè)函數(shù)來(lái)比較字符串之間的相似性,在實(shí)際開(kāi)發(fā)中,字符串匹配是一項(xiàng)常見(jiàn)但具有挑戰(zhàn)性的任務(wù),用戶可能犯拼寫錯(cuò)誤,使用縮寫或者輸入同義詞,因此,我們需要一種方法來(lái)處理這些情況2023-12-12Python?pandas處理缺失值方法詳解(dropna、drop、fillna)
缺失數(shù)據(jù)會(huì)在很多數(shù)據(jù)分析應(yīng)用中出現(xiàn),pandas的目標(biāo)之一就是盡可能無(wú)痛地處理缺失值,下面這篇文章主要給大家介紹了關(guān)于Python?pandas處理缺失值方法的相關(guān)資料,處理方法分別是dropna、drop、fillna,需要的朋友可以參考下2022-08-08python實(shí)現(xiàn)把兩個(gè)二維array疊加成三維array示例
今天小編就為大家分享一篇python實(shí)現(xiàn)把兩個(gè)二維array疊加成三維array示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11Python編程應(yīng)用設(shè)計(jì)原則詳解
什么是好用的代碼呢?其實(shí)就是代碼質(zhì)量比較高,如何評(píng)價(jià)代碼質(zhì)量的高低呢?最常用的、最重要的評(píng)價(jià)標(biāo)準(zhǔn),就是代碼的可維護(hù)性、可讀性、可擴(kuò)展性、靈活性、簡(jiǎn)潔性、可復(fù)用性、可測(cè)試性2021-09-09