歡迎大家來到“Python從零到壹”,在這里我將分享約200篇Python系列文章,帶大家一起去學習和玩耍,看看Python這個有趣的世界,所有文章都將結合案例、代碼和作者的經驗講解,真心想把自己近十年的編程經驗分享給大家,希望對您有所幫助,文章中不足之處也請海涵,Python系列整體框架包括基礎語法10篇、網路爬蟲30篇、可視化分析10篇、機器學習20篇、大資料分析20篇、影像識別30篇、人工智能40篇、Python安全20篇、其他技巧10篇,您的關注、點贊和轉發就是對秀璋最大的支持,知識無價人有情,希望我們都能在人生路上開心快樂、共同成長,
該系列文章主要講解Python OpenCV影像處理和影像識別知識,前期主要講解影像處理基礎知識、OpenCV基礎用法、常用影像繪制方法、影像幾何變換等,中期講解影像處理的各種運算,包括影像點運算、形態學處理、影像銳化、影像增強、影像平滑等,后期研究影像識別、影像分割、影像分類、影像特效處理以及影像處理相關應用,
上一篇文章介紹了影像演算法運算與邏輯運算,包括影像加法、影像減法、影像與運算、影像或運算、影像非運算與影像異或運算,這篇文章將詳細講解影像融合處理和ROI區域繪制,同時補充影像屬性、通道和型別轉換,希望文章對您有所幫助,如果有不足之處,還請海涵,
文章目錄
- 一.影像融合
- 二.影像ROI區域定位
- 三.影像屬性
- 四.影像通道分離及合并
- 五.影像型別轉換
- 六.總結
下載地址:
- https://github.com/eastmountyxz/Python-zero2one
前文賞析:
第一部分 基礎語法
- [Python從零到壹] 一.為什么我們要學Python及基礎語法詳解
- [Python從零到壹] 二.語法基礎之條件陳述句、回圈陳述句和函式
- [Python從零到壹] 三.語法基礎之檔案操作、CSV檔案讀寫及面向物件
第二部分 網路爬蟲
- [Python從零到壹] 四.網路爬蟲之入門基礎及正則運算式抓取博客案例
- [Python從零到壹] 五.網路爬蟲之BeautifulSoup基礎語法萬字詳解
- [Python從零到壹] 六.網路爬蟲之BeautifulSoup爬取豆瓣TOP250電影詳解
- [Python從零到壹] 七.網路爬蟲之Requests爬取豆瓣電影TOP250及CSV存盤
- [Python從零到壹] 八.資料庫之MySQL基礎知識及操作萬字詳解
- [Python從零到壹] 九.網路爬蟲之Selenium基礎技術萬字詳解(定位元素、常用方法、鍵盤滑鼠操作)
- [Python從零到壹] 十.網路爬蟲之Selenium爬取在線百科知識萬字詳解(NLP語料構造必備技能)
第三部分 資料分析和機器學習
- [Python從零到壹] 十一.資料分析之Numpy、Pandas、Matplotlib和Sklearn入門知識萬字詳解(1)
- [Python從零到壹] 十二.機器學習之回歸分析萬字總結全網首發(線性回歸、多項式回歸、邏輯回歸)
- [Python從零到壹] 十三.機器學習之聚類分析萬字總結全網首發(K-Means、BIRCH、層次聚類、樹狀聚類)
- [Python從零到壹] 十四.機器學習之分類演算法三萬字總結全網首發(決策樹、KNN、SVM、分類演算法對比)
- [Python從零到壹] 十五.文本挖掘之資料預處理、Jieba工具和文本聚類萬字詳解
- [Python從零到壹] 十六.文本挖掘之詞云熱點與LDA主題分布分析萬字詳解
- [Python從零到壹] 十七.可視化分析之Matplotlib、Pandas、Echarts入門萬字詳解
- [Python從零到壹] 十八.可視化分析之Basemap地圖包入門詳解
- [Python從零到壹] 十九.可視化分析之熱力圖和箱圖繪制及應用詳解
- [Python從零到壹] 二十.可視化分析之Seaborn繪圖萬字詳解
- [Python從零到壹] 二十一.可視化分析之Pyechart繪圖萬字詳解
- [Python從零到壹] 二十二.可視化分析之OpenGL繪圖萬字詳解
- [Python從零到壹] 二十三.十大機器學習演算法之決策樹分類分析詳解(1)
- [Python從零到壹] 二十四.十大機器學習演算法之KMeans聚類分析詳解(2)
- [Python從零到壹] 二十五.十大機器學習演算法之KNN演算法及影像分類詳解(3)
- [Python從零到壹] 二十六.十大機器學習演算法之樸素貝葉斯演算法及文本分類詳解(4)
- [Python從零到壹] 二十七.十大機器學習演算法之線性回歸演算法分析詳解(5)
- [Python從零到壹] 二十八.十大機器學習演算法之SVM演算法分析詳解(6)
- [Python從零到壹] 二十九.十大機器學習演算法之隨機森林演算法分析詳解(7)
- [Python從零到壹] 三十.十大機器學習演算法之邏輯回歸演算法及惡意請求檢測應用詳解(8)
- [Python從零到壹] 三十一.十大機器學習演算法之Boosting和AdaBoost應用詳解(9)
- [Python從零到壹] 三十二.十大機器學習演算法之層次聚類和樹狀圖聚類應用詳解(10)
第四部分 Python影像處理基礎
- [Python從零到壹] 三十三.影像處理基礎篇之什么是影像處理和OpenCV配置
- [Python從零到壹] 三十四.OpenCV入門詳解——顯示讀取修改及保存影像
- [Python從零到壹] 三十五.影像處理基礎篇之OpenCV繪制各類幾何圖形
- [Python從零到壹] 三十六.影像處理基礎篇之影像算術與邏輯運算詳解
- [Python從零到壹] 三十七.影像處理基礎篇之影像融合處理和ROI區域繪制
第五部分 Python影像運算和影像增強
第六部分 Python影像識別和影像處理經典案例
第七部分 NLP與文本挖掘
第八部分 人工智能入門知識
第九部分 網路攻防與AI安全
第十部分 知識圖譜構建實戰
擴展部分 人工智能高級案例
作者新開的“娜璋AI安全之家”將專注于Python和安全技術,主要分享Web滲透、系統安全、人工智能、大資料分析、影像識別、惡意代碼檢測、CVE復現、威脅情報分析等文章,雖然作者是一名技術小白,但會保證每一篇文章都會很用心地撰寫,希望這些基礎性文章對你有所幫助,在Python和安全路上與大家一起進步,
一.影像融合
影像融合通常是指多張影像的資訊進行融合,從而獲得資訊更豐富的結果,能夠幫助人們觀察或計算機處理,圖5-1是將兩張不清晰的影像融合得到更清晰的效果圖,

影像融合是在影像加法的基礎上增加了系數和亮度調節量,它與影像的主要區別如下[1-3]:
- 影像加法:目標影像 = 影像1 + 影像2
- 影像融合:目標影像 = 影像1 × 系數1 + 影像2 × 系數2 + 亮度調節量
在OpenCV中,影像融合主要呼叫addWeighted()函式實作,其原型如下,需要注意的是,兩張融合影像的像素大小必須一致,引數gamma不能省略,
dst = cv2.addWeighted(scr1, alpha, src2, beta, gamma)
dst = src1 * alpha + src2 * beta + gamma
下面的代碼是將兩張圖片進行影像融合,兩張圖片的系數均為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()
輸出結果如圖5-2所示,它將src1影像和src2影像按比例系數進行了融合,生成目標結果圖result,

同樣可以設定不同的融合比例,圖5-3是下面核心函式的效果圖,
- cv2.addWeighted(src1, 0.6, src2, 0.8, 10)

二.影像ROI區域定位
ROI(Region of Interest)表示感興趣區域,是指從被處理影像以方框、圓形、橢圓、不規則多邊形等方式勾勒出需要處理的區域,可以通過各種算子(Operator)和函式求得感興趣ROI區域,被廣泛應用于熱點地圖、人臉識別、影像分割等領域,如圖5-4獲取Lena圖的臉部輪廓[4],

通過像素矩陣可以直接獲取ROI區域,如img[200:400, 200:400],下面的代碼是獲取臉部ROI區域并顯示,
# -*- coding:utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
#讀取圖片
img = cv2.imread("lena.png")
#定義200×200矩陣 3對應BGR
face = np.ones((200, 200, 3))
#顯示原始影像
cv2.imshow("Demo", img)
#顯示ROI區域
face = img[150:350, 150:350]
cv2.imshow("face", face)
#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()
輸出結果如圖5-5所示,它將Lena原圖的臉部提取出來,

同樣,如果想將提取的ROI區域融合至其他圖片,則使用賦值陳述句即可,下面代碼是將提取的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對應BGR
face = np.ones((150, 150, 3))
#顯示原始影像
cv2.imshow("Demo", img)
#顯示ROI區域
face = img[200:350, 200:350]
test[250:400, 250:400] = face
cv2.imshow("Result", test)
#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()
運行結果如圖5-6所示,它將提取的150×150臉部輪廓融合至新的影像[250:400, 250:400] 區域,

三.影像屬性
前面一篇文章中我們已經看到了size、shape等關鍵字,這篇文章就對影像中最常見的三個屬性進行介紹,它們分別是影像形狀(shape)、像素大小(size)和影像型別(dtype),
(1)shape
通過shape關鍵字獲取影像的形狀,回傳包含行數、列數、通道數的元組,其中灰度影像回傳行數和列數,彩色影像回傳行數、列數和通道數,
# -*- 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()
最終輸出結果如圖5-7所示,(412,412,3),它表示該影像共412行、412列像素,包括3個通道,

(2)size
通過size關鍵字獲取影像的像素數目,其中灰度影像回傳行數×列數,彩色影像回傳行數×列數×通道數,下述代碼就是獲取“luo.png”影像的大小,
# -*- coding:utf-8 -*-
# By:Eastmount
import cv2
import numpy
#讀取圖片
img = cv2.imread("luo.png")
#獲取影像形狀
print(img.shape)
#獲取像素數目
print(img.size)
輸出結果如下所示,包含510468個像素,即為413×412×3,
- (412, 412, 3)
- 509232
(3)dtype
通過dtype關鍵字獲取影像的資料型別,通常回傳uint8,
# -*- coding:utf-8 -*-
# By:Eastmount
import cv2
import numpy
#讀取圖片
img = cv2.imread("Lena.png")
#獲取影像形狀
print(img.shape)
#獲取像素數目
print(img.size)
#獲取影像資料型別
print(img.dtype)
四.影像通道分離及合并
OpenCV通過split()函式和merge()函式實作對影像通道的處理,包括通道分離和通道合并,
(1)split()函式
OpenCV讀取的彩色影像由藍色(B)、綠色(G)、紅色(R)三原色組成,每一種顏色可以認為是一個通道分量[4],如圖5-8所示,

split()函式用于將一個多通道陣列分量成三個單通道,其函式原型如下所示:
- mv = split(m[, mv])
– m表示輸入的多通道陣列
– mv表示輸出的陣列或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()
顯示結果如圖5-9所示,它展示了B、G、R三個通道的顏色分量,

同時,可以獲取不同通道顏色,核心代碼為:
- b = cv2.split(a)[0]
- g = cv2.split(a)[1]
- r = cv2.split(a)[2]
(2)merge()函式
該函式是split()函式的逆向操作,將多個陣列合成一個通道的陣列,從而實作影像通道的合并,其函式原型如下:
- dst = merge(mv[, dst])
– mv表示輸入的需要合并的陣列,所有矩陣必須有相同的大小和深度
– dst表示輸出具有與mv相同大小和深度的陣列
實作影像三個顏色通道融合的代碼如下:
# -*- 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()
顯示結果如圖5-10所示,它將拆分的B、G、R三個通道的顏色分量進行了合并,接著顯示合并后的影像,

同時,可以呼叫該函式提取影像的不同顏色,比如提取B顏色通道,G、B通道設定為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]
#設定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()
此時顯示的影像為藍色通道,如圖5-11所示,其他顏色的通道方法也類似,

五.影像型別轉換
在日常生活中,我們看到的大多數彩色影像都是RGB型別,但是在影像處理程序中,常常需要用到灰度影像、二值影像、HSV、HSI等顏色,影像型別轉換是指將一種型別轉換為另一種型別,比如彩色影像轉換為灰度影像、BGR影像轉換為RGB影像,OpenCV提供了200多種不同型別之間的轉換,其中最常用的包括3類,如下:
- cv2.COLOR_BGR2GRAY
- cv2.COLOR_BGR2RGB
- cv2.COLOR_GRAY2BGR
OpenCV提供了cvtColor()函式實作這些功能,其函式原型如下所示:
- dst = cv2.cvtColor(src, code[, dst[, dstCn]])
– src表示輸入影像,需要進行顏色空間變換的原影像
– dst表示輸出影像,其大小和深度與src一致
– code表示轉換的代碼或標識
– dstCn表示目標影像通道數,其值為0時,則有src和code決定
該函式的作用是將一個影像從一個顏色空間轉換到另一個顏色空間,其中,RGB是指Red、Green和Blue,一副影像由這三個通道(channel)構成;Gray表示只有灰度值一個通道;HSV包含Hue(色調)、Saturation(飽和度)和Value(亮度)三個通道,在OpenCV中,常見的顏色空間轉換標識包括CV_BGR2BGRA、CV_RGB2GRAY、CV_GRAY2RGB、CV_BGR2HSV、CV_BGR2XYZ、CV_BGR2HLS[3],
下面是呼叫cvtColor()函式將影像進行灰度化處理的代碼,
# -*- coding:utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#讀取圖片
src = cv2.imread('luo.png')
#影像型別轉換
result = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
#顯示影像
cv2.imshow("src", src)
cv2.imshow("result", result)
#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()
輸出結果如圖5-12所示,它將左邊的彩色影像轉換為右邊的灰度影像,更多灰度轉化演算法將在后面的文章詳細介紹,

同樣,可以呼叫下列核心代碼將彩色影像轉換為HSV顏色空間,如圖5-13所示,
- grayImage = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)

下面代碼對比了九種常見的顏色空間,包括BGR、RGB、GRAY、HSV、YCrCb、HLS、XYZ、LAB和YUV,并回圈顯示處理后的影像,
# -*- coding:utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#讀取原始影像
img_BGR = cv2.imread('luo.png')
#BGR轉換為RGB
img_RGB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2RGB)
#灰度化處理
img_GRAY = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2GRAY)
#BGR轉HSV
img_HSV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HSV)
#BGR轉YCrCb
img_YCrCb = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YCrCb)
#BGR轉HLS
img_HLS = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HLS)
#BGR轉XYZ
img_XYZ = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2XYZ)
#BGR轉LAB
img_LAB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2LAB)
#BGR轉YUV
img_YUV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YUV)
#呼叫matplotlib顯示處理結果
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()
其運行結果如圖5-14所示:

六.總結
本章主要講解Python和OpenCV的影像基礎處理,從讀取顯示影像到讀取修改像素,從創建、復制、保存影像到獲取影像屬性合通道,再詳細講解了影像算數與邏輯運算,包括影像加法、減法、與運算、或運算、異或運算、非運算,最后講解了影像融合和獲取影像ROI區域及影像型別轉換,本章知識為后續的影像處理、影像識別、影像變換打下扎實基礎,
最近寒假日更,為了感謝讀者,同時感謝在求學路上的同行者,不負遇見,勿忘初心,影像處理系列主要包括三部分,分別是:



這周的留言感慨~
十二年CSDN的博客分享,如果要說分享最讓我開心的是什么?不是傳道,不是授業,也不是解惑,而是接下來這類事,這些年已經陸續鼓勵了一些朋友當老師,而昨天得知這一位博友真的去到新疆南疆成為了一名小學老師,我很是感動,是真的感動,六年前我曾鼓勵他如果想,就放棄高額工資的互聯網大廠,去做自己想做的,沒想到已經當了四年老師,又當爹又當媽,國語普及,文化教育,這里面的艱辛不是一兩句道得清,除了佩服就是鼓勵,
正如你說的一樣,“一輩子總得做點有意義的事情,生命實在太短暫,一定要活得積極、正面”,或許,這也是我在CSDN分享博客的最大意義,再比如云南那位老友的留言,“農村的孩子下雨沒有傘,只能拼命奔跑”,希望你以后也能成為一名教師,感恩有你們,感謝有你們,我也希望自己早日畢業回到家鄉,花上三四十年做好兩件事,一是認真教書,二是將少數民族文物搶救和文字語音保護做好,也鼓勵更多人一起加入進來,自己雖然很菜吧,但還是有一些喜歡的事,尤其陪伴愛的人,挺好,愛你們喔,2022年繼續加油,在CSDN分享更高質量的博客和專欄,
(By:娜璋之家 Eastmount 2022-01-26 夜于貴陽 https://blog.csdn.net/Eastmount )
參考文獻:
- [1]岡薩雷斯. 數字影像處理(第3版)[M]. 北京:電子工業出版社, 2013.
- [2]毛星云, 冷雪飛. OpenCV3編程入門[M]. 北京:電子工業出版社, 2015.
- [3]Eastmount. [Python影像處理] 五.影像融合、加法運算及影像型別轉換[EB/OL]. (2018-09-03). https://blog.csdn.net/Eastmount/article/details/82347501.
- [4]Eastmount. [Python影像處理] 三.獲取影像屬性、興趣ROI區域及通道處理[EB/OL]. (2018-08-29). https://blog.csdn.net/Eastmount/article/details/82177300.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/421849.html
標籤:AI

