前幾篇內容我們學習了使用OpenCV打開顯示、保存圖像的方法使用Python OpenCV處理圖像之圖像文件的打開、顯示和保存操作,我們還使用OpenCV更改了微信頭像一個Pythoner獲取微信國旗頭像的正確途徑,請不要再@微信官方了。在此基礎上了解了OpenCV處理滑鼠鍵盤響應事件的基本方式使用Python OpenCV處理圖像之詳解使用OpenCV處理鍵盤滑鼠事件。
今天,我們帶大家了解下使用OpenCV獲取並修改一幅圖像的像素值。

打開一幅圖像並獲取圖像信息
import cv2
import numpy as np
img = cv2.imread('test.jpg')
我們可以獲取該圖像的屬性:行,列,通道,圖像數據類型,像素數目等,具體如下。
img.shape:獲取圖像的形狀,返回值是一個包含行數,列數,通道數的元組
img.size:圖像的像素數目,長乘以寬乘以通道數。
img.dtype:圖像的數據類型
實例如下。

一幅圖像如何表示具體像素值?

我們來看下圖,它表示了具體圖像的像素值描述方法,以BGR圖像為例。圖下所示。

問題來了,對於一幅BGR圖像,如何表示某一點的像素值呢?
比如:img[xp, yp] = [B, G. R],應該是這種形式了,想要更改該像素值,直接給該坐標上面賦值BGR通道的值即可,當然,也可以分開賦值。如下:
img[xp, yp, 0] = B
img[xp, yp, 1] = G
img[xp, yp, 2] = R
分別賦予BGR通道的值即可。灰度圖片使用類似,不再贅述,只是圖像屬性參數不一樣。怎麼樣?是不是很簡單?
有沒有更好的解決方案?
我們知道,今天來講,一幅圖片的像素值是很高的,動輒幾百萬的像素值,通常我們需要修改某一範圍內的像素值,但是,獲取這一範圍的像素值我們使用Python中的列表這一數據結構,並使用for循環語句查找某一像素範圍內的數據是非常低效的。因此,OpenCV提供的一幅圖像的表示方法是以類似numpy中數組的結構。這種數據結構的優點是高效、精準。

對於OpenCV的圖像數據結構,我們通常使用 array.item() 來獲取某一範圍的像素內容並使用array.itemset()設置該像素的信息,比較列表嵌套並使用for循環遍歷,是非常高效的。而且,程序的可讀性會更好。我們來看下面的例子。
import cv2import numpy as np
img=cv2.imread('test.jpg')
# 列印像素點(10,10)的R通道值
print(img.item(10,10,2))
# 設置像素點(10,10)的R通道為110
img.itemset((10,10,2),110)
# 列印像素點(10,10)的R通道值
print(img.item(10,10,2))
上述代碼可以準確獲取某一像素點的顏色數據。
好了,今天的內容就到這裡了,我們主要是學習了利用OpenCV獲取和設置一幅圖像的某一個像素點的顏色數據,甚至可以區分通道來設置。我們知道某一像素點的設置對於動輒幾百萬甚至上億(小米MIX Alpha,據說能拍出這種圖片)像素的圖片的設置來講,是毫無意義的。因此,在使用中我們需要的是能夠設置某一區域的像素點。我們下一篇內容具體來討論。歡迎大家留言討論。
轉載請註明出處,百家號:Python高手養成。