我們知道,使用OpenCV在獲取一幅BGR圖像的信息時(shape屬性),會同時獲得一幅圖像的RGB圖層數。那麼,問題來了,如何將這些圖像拆分和合併呢?本篇文章作為另一篇博文使用Python中OpenCV庫創建一幅圖片的RGB通道圖片的補充。這篇博文中我們使用了數組切片及索引實現了分離BGR通道的功能。
今天,我們使用OpenCV提供的一組函數來實現相同的功能,並對比兩種方案的優劣。
一般方法
對於圖像BGR通道的獲取,我們使用索引的方法是這樣的:
import cv2
img = cv2.imread('test.jpg')
b_img = img[:, :, 0] # B通道
g_img = img[:, :, 1] # G通道
r_img = img[:, :, 2] # R通道
這樣選取的是整個圖片的各個通道的顏色數值。拆分的時候我們直接保存相應的圖像即可。
還有沒有別的辦法呢?
答案是肯定的,我們看下OpenCV為我們封裝的方法吧。
cv2.split(img)
實現功能:傳入一個圖像數組,並將圖像拆分為BGR三個通道的圖像,返回值是BGR三個通道圖像的元組
cv2.merge((b,g,r))
實現功能:分別傳入BGR三個通道的圖像組成的元組,將其三個圖像合併為一個BGR三通道圖像
我們使用代碼來驗證下這兩個函數實現的效果吧!
import cv2
img = cv2.imread('test.jpg')
b, g, r = cv2.split(img)
# 拆分後顯示cv2.imshow('b', b)cv2.imshow('g', g)cv2.imshow('r', r)
# 合併
img2 = cv2.merge(b, g, r)
cv2.imshow('Merge', img2)
# 響應事件while True:key = cv2.waitKey(0)
# esc退出if key == 27: break
# 關閉全部窗口
cv2.destroyAllWindows()
上述代碼可以準確地提取圖片的BGR通道值,並進行合併。
兩種方法哪個更好?
現在我們定義兩個函數,分別測試下函數耗時,比較兩個方案的優劣,具體代碼如下所示。
我們來看下測試結果,如下圖所示。
因此,我們在使用OpenCV進行圖層拆分時,除非必須使用,否則,首選拆分圖層還是要使用數組切片拆分的方法。
好了,今天就到這裡了,今天帶大家了解了一下對於圖層拆分的兩種可選方案,並且分析了兩種方案的性能優劣。建議在使用OpenCV進行圖像的圖層拆分時,首選數組切片拆分的方案。
歡迎大家留言討論,加關注後續內容會更精彩哦。
轉載請註明出處,百家號:Python高手養成。