[Python从零到壹] 三十七.图像处理基础篇之图像融合处理和ROI区域绘制
歡迎大家來到“Python從零到壹”,在這里我將分享約200篇Python系列文章,帶大家一起去學(xué)習(xí)和玩耍,看看Python這個有趣的世界。所有文章都將結(jié)合案例、代碼和作者的經(jīng)驗講解,真心想把自己近十年的編程經(jīng)驗分享給大家,希望對您有所幫助,文章中不足之處也請海涵。Python系列整體框架包括基礎(chǔ)語法10篇、網(wǎng)絡(luò)爬蟲30篇、可視化分析10篇、機(jī)器學(xué)習(xí)20篇、大數(shù)據(jù)分析20篇、圖像識別30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的關(guān)注、點贊和轉(zhuǎn)發(fā)就是對秀璋最大的支持,知識無價人有情,希望我們都能在人生路上開心快樂、共同成長。
該系列文章主要講解Python OpenCV圖像處理和圖像識別知識,前期主要講解圖像處理基礎(chǔ)知識、OpenCV基礎(chǔ)用法、常用圖像繪制方法、圖像幾何變換等,中期講解圖像處理的各種運算,包括圖像點運算、形態(tài)學(xué)處理、圖像銳化、圖像增強(qiáng)、圖像平滑等,后期研究圖像識別、圖像分割、圖像分類、圖像特效處理以及圖像處理相關(guān)應(yīng)用。
上一篇文章介紹了圖像算法運算與邏輯運算,包括圖像加法、圖像減法、圖像與運算、圖像或運算、圖像非運算與圖像異或運算。這篇文章將詳細(xì)講解圖像融合處理和ROI區(qū)域繪制,同時補充圖像屬性、通道和類型轉(zhuǎn)換。希望文章對您有所幫助,如果有不足之處,還請海涵。
文章目錄
- 一.圖像融合
- 二.圖像ROI區(qū)域定位
- 三.圖像屬性
- 四.圖像通道分離及合并
- 五.圖像類型轉(zhuǎn)換
- 六.總結(jié)
下載地址:
- https://github.com/eastmountyxz/Python-zero2one
前文賞析:
第一部分 基礎(chǔ)語法
- [Python從零到壹] 一.為什么我們要學(xué)Python及基礎(chǔ)語法詳解
- [Python從零到壹] 二.語法基礎(chǔ)之條件語句、循環(huán)語句和函數(shù)
- [Python從零到壹] 三.語法基礎(chǔ)之文件操作、CSV文件讀寫及面向?qū)ο?/li>
第二部分 網(wǎng)絡(luò)爬蟲
- [Python從零到壹] 四.網(wǎng)絡(luò)爬蟲之入門基礎(chǔ)及正則表達(dá)式抓取博客案例
- [Python從零到壹] 五.網(wǎng)絡(luò)爬蟲之BeautifulSoup基礎(chǔ)語法萬字詳解
- [Python從零到壹] 六.網(wǎng)絡(luò)爬蟲之BeautifulSoup爬取豆瓣TOP250電影詳解
- [Python從零到壹] 七.網(wǎng)絡(luò)爬蟲之Requests爬取豆瓣電影TOP250及CSV存儲
- [Python從零到壹] 八.數(shù)據(jù)庫之MySQL基礎(chǔ)知識及操作萬字詳解
- [Python從零到壹] 九.網(wǎng)絡(luò)爬蟲之Selenium基礎(chǔ)技術(shù)萬字詳解(定位元素、常用方法、鍵盤鼠標(biāo)操作)
- [Python從零到壹] 十.網(wǎng)絡(luò)爬蟲之Selenium爬取在線百科知識萬字詳解(NLP語料構(gòu)造必備技能)
第三部分 數(shù)據(jù)分析和機(jī)器學(xué)習(xí)
- [Python從零到壹] 十一.數(shù)據(jù)分析之Numpy、Pandas、Matplotlib和Sklearn入門知識萬字詳解(1)
- [Python從零到壹] 十二.機(jī)器學(xué)習(xí)之回歸分析萬字總結(jié)全網(wǎng)首發(fā)(線性回歸、多項式回歸、邏輯回歸)
- [Python從零到壹] 十三.機(jī)器學(xué)習(xí)之聚類分析萬字總結(jié)全網(wǎng)首發(fā)(K-Means、BIRCH、層次聚類、樹狀聚類)
- [Python從零到壹] 十四.機(jī)器學(xué)習(xí)之分類算法三萬字總結(jié)全網(wǎng)首發(fā)(決策樹、KNN、SVM、分類算法對比)
- [Python從零到壹] 十五.文本挖掘之?dāng)?shù)據(jù)預(yù)處理、Jieba工具和文本聚類萬字詳解
- [Python從零到壹] 十六.文本挖掘之詞云熱點與LDA主題分布分析萬字詳解
- [Python從零到壹] 十七.可視化分析之Matplotlib、Pandas、Echarts入門萬字詳解
- [Python從零到壹] 十八.可視化分析之Basemap地圖包入門詳解
- [Python從零到壹] 十九.可視化分析之熱力圖和箱圖繪制及應(yīng)用詳解
- [Python從零到壹] 二十.可視化分析之Seaborn繪圖萬字詳解
- [Python從零到壹] 二十一.可視化分析之Pyechart繪圖萬字詳解
- [Python從零到壹] 二十二.可視化分析之OpenGL繪圖萬字詳解
- [Python從零到壹] 二十三.十大機(jī)器學(xué)習(xí)算法之決策樹分類分析詳解(1)
- [Python從零到壹] 二十四.十大機(jī)器學(xué)習(xí)算法之KMeans聚類分析詳解(2)
- [Python從零到壹] 二十五.十大機(jī)器學(xué)習(xí)算法之KNN算法及圖像分類詳解(3)
- [Python從零到壹] 二十六.十大機(jī)器學(xué)習(xí)算法之樸素貝葉斯算法及文本分類詳解(4)
- [Python從零到壹] 二十七.十大機(jī)器學(xué)習(xí)算法之線性回歸算法分析詳解(5)
- [Python從零到壹] 二十八.十大機(jī)器學(xué)習(xí)算法之SVM算法分析詳解(6)
- [Python從零到壹] 二十九.十大機(jī)器學(xué)習(xí)算法之隨機(jī)森林算法分析詳解(7)
- [Python從零到壹] 三十.十大機(jī)器學(xué)習(xí)算法之邏輯回歸算法及惡意請求檢測應(yīng)用詳解(8)
- [Python從零到壹] 三十一.十大機(jī)器學(xué)習(xí)算法之Boosting和AdaBoost應(yīng)用詳解(9)
- [Python從零到壹] 三十二.十大機(jī)器學(xué)習(xí)算法之層次聚類和樹狀圖聚類應(yīng)用詳解(10)
第四部分 Python圖像處理基礎(chǔ)
- [Python從零到壹] 三十三.圖像處理基礎(chǔ)篇之什么是圖像處理和OpenCV配置
- [Python從零到壹] 三十四.OpenCV入門詳解——顯示讀取修改及保存圖像
- [Python從零到壹] 三十五.圖像處理基礎(chǔ)篇之OpenCV繪制各類幾何圖形
- [Python從零到壹] 三十六.圖像處理基礎(chǔ)篇之圖像算術(shù)與邏輯運算詳解
- [Python從零到壹] 三十七.圖像處理基礎(chǔ)篇之圖像融合處理和ROI區(qū)域繪制
第五部分 Python圖像運算和圖像增強(qiáng)
第六部分 Python圖像識別和圖像處理經(jīng)典案例
第七部分 NLP與文本挖掘
第八部分 人工智能入門知識
第九部分 網(wǎng)絡(luò)攻防與AI安全
第十部分 知識圖譜構(gòu)建實戰(zhàn)
擴(kuò)展部分 人工智能高級案例
作者新開的“娜璋AI安全之家”將專注于Python和安全技術(shù),主要分享Web滲透、系統(tǒng)安全、人工智能、大數(shù)據(jù)分析、圖像識別、惡意代碼檢測、CVE復(fù)現(xiàn)、威脅情報分析等文章。雖然作者是一名技術(shù)小白,但會保證每一篇文章都會很用心地撰寫,希望這些基礎(chǔ)性文章對你有所幫助,在Python和安全路上與大家一起進(jìn)步。
一.圖像融合
圖像融合通常是指多張圖像的信息進(jìn)行融合,從而獲得信息更豐富的結(jié)果,能夠幫助人們觀察或計算機(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ù)實現(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ū)域。可以通過各種算子(Operator)和函數(shù)求得感興趣ROI區(qū)域,被廣泛應(yīng)用于熱點地圖、人臉識別、圖像分割等領(lǐng)域。如圖5-4獲取Lena圖的臉部輪廓[4]。
通過像素矩陣可以直接獲取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對應(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原圖的臉部提取出來。
同樣,如果想將提取的ROI區(qū)域融合至其他圖片,則使用賦值語句即可。下面代碼是將提取的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對應(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()運行結(jié)果如圖5-6所示,它將提取的150×150臉部輪廓融合至新的圖像[250:400, 250:400] 區(qū)域。
三.圖像屬性
前面一篇文章中我們已經(jīng)看到了size、shape等關(guān)鍵字。這篇文章就對圖像中最常見的三個屬性進(jìn)行介紹,它們分別是圖像形狀(shape)、像素大小(size)和圖像類型(dtype)。
(1)shape
通過shape關(guān)鍵字獲取圖像的形狀,返回包含行數(shù)、列數(shù)、通道數(shù)的元組。其中灰度圖像返回行數(shù)和列數(shù),彩色圖像返回行數(shù)、列數(shù)和通道數(shù)。
最終輸出結(jié)果如圖5-7所示,(412,412,3),它表示該圖像共412行、412列像素,包括3個通道。
(2)size
通過size關(guān)鍵字獲取圖像的像素數(shù)目,其中灰度圖像返回行數(shù)×列數(shù),彩色圖像返回行數(shù)×列數(shù)×通道數(shù)。下述代碼就是獲取“l(fā)uo.png”圖像的大小。
輸出結(jié)果如下所示,包含510468個像素,即為413×412×3。
- (412, 412, 3)
- 509232
(3)dtype
通過dtype關(guān)鍵字獲取圖像的數(shù)據(jù)類型,通常返回uint8。
四.圖像通道分離及合并
OpenCV通過split()函數(shù)和merge()函數(shù)實現(xiàn)對圖像通道的處理,包括通道分離和通道合并。
(1)split()函數(shù)
OpenCV讀取的彩色圖像由藍(lán)色(B)、綠色(G)、紅色(R)三原色組成,每一種顏色可以認(rèn)為是一個通道分量[4],如圖5-8所示。
split()函數(shù)用于將一個多通道數(shù)組分量成三個單通道,其函數(shù)原型如下所示:
- mv = split(m[, mv])
– m表示輸入的多通道數(shù)組
– mv表示輸出的數(shù)組或vector容器
下面的代碼是獲取彩色“小珞珞”圖像三個顏色通道并分別顯示。
# -*- 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三個通道的顏色分量。
同時,可以獲取不同通道顏色,核心代碼為:
- b = cv2.split(a)[0]
- g = cv2.split(a)[1]
- r = cv2.split(a)[2]
(2)merge()函數(shù)
該函數(shù)是split()函數(shù)的逆向操作,將多個數(shù)組合成一個通道的數(shù)組,從而實現(xiàn)圖像通道的合并,其函數(shù)原型如下:
- dst = merge(mv[, dst])
– mv表示輸入的需要合并的數(shù)組,所有矩陣必須有相同的大小和深度
– dst表示輸出具有與mv相同大小和深度的數(shù)組
實現(xiàn)圖像三個顏色通道融合的代碼如下:
# -*- 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三個通道的顏色分量進(jìn)行了合并,接著顯示合并后的圖像。
同時,可以調(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()此時顯示的圖像為藍(lán)色通道,如圖5-11所示,其他顏色的通道方法也類似。
五.圖像類型轉(zhuǎn)換
在日常生活中,我們看到的大多數(shù)彩色圖像都是RGB類型,但是在圖像處理過程中,常常需要用到灰度圖像、二值圖像、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ù)實現(xiàn)這些功能。其函數(shù)原型如下所示:
- dst = cv2.cvtColor(src, code[, dst[, dstCn]])
– src表示輸入圖像,需要進(jìn)行顏色空間變換的原圖像
– dst表示輸出圖像,其大小和深度與src一致
– code表示轉(zhuǎn)換的代碼或標(biāo)識
– dstCn表示目標(biāo)圖像通道數(shù),其值為0時,則有src和code決定
該函數(shù)的作用是將一個圖像從一個顏色空間轉(zhuǎn)換到另一個顏色空間,其中,RGB是指Red、Green和Blue,一副圖像由這三個通道(channel)構(gòu)成;Gray表示只有灰度值一個通道;HSV包含Hue(色調(diào))、Saturation(飽和度)和Value(亮度)三個通道。在OpenCV中,常見的顏色空間轉(zhuǎn)換標(biāo)識包括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)
下面代碼對比了九種常見的顏色空間,包括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()其運行結(jié)果如圖5-14所示:
六.總結(jié)
本章主要講解Python和OpenCV的圖像基礎(chǔ)處理,從讀取顯示圖像到讀取修改像素,從創(chuàng)建、復(fù)制、保存圖像到獲取圖像屬性合通道,再詳細(xì)講解了圖像算數(shù)與邏輯運算,包括圖像加法、減法、與運算、或運算、異或運算、非運算,最后講解了圖像融合和獲取圖像ROI區(qū)域及圖像類型轉(zhuǎn)換。本章知識為后續(xù)的圖像處理、圖像識別、圖像變換打下扎實基礎(chǔ)。
最近寒假日更,為了感謝讀者。同時感謝在求學(xué)路上的同行者,不負(fù)遇見,勿忘初心。圖像處理系列主要包括三部分,分別是:
這周的留言感慨~
十二年CSDN的博客分享,如果要說分享最讓我開心的是什么?不是傳道,不是授業(yè),也不是解惑,而是接下來這類事。這些年已經(jīng)陸續(xù)鼓勵了一些朋友當(dāng)老師,而昨天得知這一位博友真的去到新疆南疆成為了一名小學(xué)老師,我很是感動,是真的感動,六年前我曾鼓勵他如果想,就放棄高額工資的互聯(lián)網(wǎng)大廠,去做自己想做的,沒想到已經(jīng)當(dāng)了四年老師。又當(dāng)?shù)之?dāng)媽,國語普及,文化教育,這里面的艱辛不是一兩句道得清,除了佩服就是鼓勵。
正如你說的一樣,“一輩子總得做點有意義的事情,生命實在太短暫,一定要活得積極、正面”?;蛟S,這也是我在CSDN分享博客的最大意義,再比如云南那位老友的留言,“農(nóng)村的孩子下雨沒有傘,只能拼命奔跑”,希望你以后也能成為一名教師,感恩有你們,感謝有你們。我也希望自己早日畢業(yè)回到家鄉(xiāng),花上三四十年做好兩件事,一是認(rèn)真教書,二是將少數(shù)民族文物搶救和文字語音保護(hù)做好,也鼓勵更多人一起加入進(jìn)來。自己雖然很菜吧,但還是有一些喜歡的事,尤其陪伴愛的人,挺好,愛你們喔。2022年繼續(xù)加油,在CSDN分享更高質(zhì)量的博客和專欄。
(By:娜璋之家 Eastmount 2022-01-26 夜于貴陽 https://blog.csdn.net/Eastmount )
參考文獻(xiàn):
- [1]岡薩雷斯. 數(shù)字圖像處理(第3版)[M]. 北京:電子工業(yè)出版社, 2013.
- [2]毛星云, 冷雪飛. OpenCV3編程入門[M]. 北京:電子工業(yè)出版社, 2015.
- [3]Eastmount. [Python圖像處理] 五.圖像融合、加法運算及圖像類型轉(zhuǎn)換[EB/OL]. (2018-09-03). https://blog.csdn.net/Eastmount/article/details/82347501.
- [4]Eastmount. [Python圖像處理] 三.獲取圖像屬性、興趣ROI區(qū)域及通道處理[EB/OL]. (2018-08-29). https://blog.csdn.net/Eastmount/article/details/82177300.
總結(jié)
以上是生活随笔為你收集整理的[Python从零到壹] 三十七.图像处理基础篇之图像融合处理和ROI区域绘制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Python从零到壹] 三十五.图像处
- 下一篇: [Python从零到壹] 四十一.图像处