我們知道,在使用PhotoShop進行圖片的摳取、創建和存儲選區、存儲圖像的色彩資料等複雜操作時,經常會用到一個功能,那就是「RGB」通道,它能從三原色角度對一幅圖片進行精準處理。我們在驚嘆PhotoShop中RGB通道功能強大的同時,是否想過它是如何實現的呢?今天,我們使用Python中OpenCV庫實現獲取一幅圖片的RGB三通道圖片的功能。我們以網上下載的一幅千與千尋的彩色圖片為例進行處理。
【前期準備】
在開始案例之前,我們先要下載安裝第三方庫OpenCV和numpy。對於OpenCV的安裝方式,網上有很多,大家可以自行參照學習安裝,我們安裝的是比較新的版本4.0.0版本。該版本的OpenCV安裝成功後,可以在Python編譯器中import cv2測試下安裝是否成功。numpy這個庫相信大家都很熟悉,數據分析常用的第三方庫,對於處理數組有其自身的優勢,它的使用方法本篇也不贅述,後續有專門的學習經驗跟大家交流。我們使用的Python版本是3.4.3版。
【原理分析】
我們知道,在計算機中一幅圖片通過RGB三色展現(也可以是RGBA,後面的A表示alpha值,可以設置透明度),顯示的每一個像素點都可以使用(R,G,B)這樣的數據格式來描述這個像素點的顏色,其中,RGB的取值都是在0-255之間,RGB全部取值為0表示黑色,全部為255表示白色。
對於一幅圖片中每一個像素點,我們可以使用一個二維數組來表示其具體的行列值,然後我們在這個基礎上增加一個維度,用一個表示三原色取值的列表定義具體的RGB值,數據結構應該是這樣的(row, column)= [R, G, B],我們使用Python中的列表處理這樣一種數據結構是很複雜的。有沒有好的辦法呢?答案當然是肯定的,我們需要用到的神器numpy就該登場了。但是,貌似使用cv2打開的圖片就是numpy的ndarray這種類型。但是,必須要說明的是,我們使用cv2.imread()打開的圖片中RGB的順序應該是BGR,可以自行測試以下哦。
然後,如果我們想獲取圖片的RGB通道圖片,把相應的值變為0即可,然後保存圖片即可。我們看下這個例子。
如果我們想將圖片img中所有像素點的R值改為0該怎麼操作呢?很簡單我們使用img[:, :, 2] = 0(按照BGR的順序取值的)。
【程序源碼】
為了增加程序的複雜性,我們使用一個循環同時將同一幅圖片的RGB通道圖片分別進行輸出。程序原始碼如下圖所示。
下面我們在PhotoShop中比較看下我們的輸出結果是否符合要求。
上圖中取消紅色通道就是將圖片中所有像素點的R值置為0,同理,其它通道按照紅色通道進行處理即可。
【總 結】
OpenCV是一款很不錯的計算機視覺庫,最重要的是這款視覺庫是開源並且跨平臺的,輕量而高效是其主要特點,主要接口是C++,保證了運行速率,它實現了很多圖形圖像處理及計算機視覺方面的通用算法。本例子只是OpenCV的簡單應用。對於視頻它也可以很好的處理,並且它提供的接口很容易使用。我們在後續會進一步討論其對於視頻處理的一些簡單運用,並且對於它的一些常用算法也進行初步研究,歡迎大家留言討論。
轉載請註明出處(百家號:Python高手養成)