目標(biāo):
-訪問(wèn)單個(gè)像素并作出修改
-查看圖像相關(guān)屬性
-操作圖像中指定區(qū)域
-圖像通道的分離和合并
大部分操作除了用到 opencv 也用到了 numpy
訪問(wèn)單個(gè)像素并作出修改
首先引入需要的庫(kù)
import cv2
import numpy as np
加載一張圖像
img = cv2.imread('photo.jpg')
通過(guò)行列坐標(biāo)訪問(wèn)圖像中的像素 -> img[行,列]
px = img[100, 100]
比如 BGR 圖像會(huì)返回關(guān)于 B G R 值的數(shù)組,灰度圖像則會(huì)直接返回相應(yīng)的灰度
px = img[10, 10]
print px
>>>[157, 166, 200]
只訪問(wèn)藍(lán)色像素
blue = img[10, 10, 0]
print blue
>>>157
對(duì)像素作出修改
img[10, 10] = [255, 255, 255]
print img[100, 100]
>>>[255, 255, 255]
注意: Numpy 可以更快速高效的訪問(wèn)數(shù)組陣列鞋既,所以像上面這樣直接訪問(wèn),修改單個(gè)像素哈肖,是相對(duì)低效的练俐。但 Numpy 總是返回一個(gè)純量注暗,在操作一塊區(qū)域上還是需要使用上面提到的方法磷醋。
使用 Numpy 更高效的訪問(wèn)單個(gè)像素
# accessing RED value
img.item(10, 10, 2)
>>>59
使用 Numpy 修改像素
# modifying RED value
img.itemset((10, 10, 2), 100)
img.item(10, 10, 2)
>>> 100
查看圖像相關(guān)屬性
圖像屬性包括行列數(shù)猫牡,通道,數(shù)據(jù)類(lèi)型邓线,像素總數(shù)淌友。
.shape 返回圖像的行列數(shù)煌恢,如果圖像具有色彩還會(huì)返回通道數(shù)
print img.shape
>>>(512, 512, 3)
注意:如果是灰度圖像只會(huì)返回行列數(shù)
.size 返回總像素?cái)?shù)
print img.size
>>>786432
.dtype 返回?cái)?shù)據(jù)類(lèi)型
print img.dtype
>>>uint8
操作圖像中的指定區(qū)域
有時(shí)候我們需要操作圖像中的某一塊區(qū)域。比如檢測(cè)出圖像中的人的眼睛震庭,首先在整張圖片中檢測(cè)臉的位置瑰抵,接著僅在檢測(cè)到的臉區(qū)域中再檢索出眼睛,而不用直接在全圖中找器联,這樣做提高了準(zhǔn)確性(因?yàn)檠劬Φ拈L(zhǎng)在臉上的呀 :D)二汛,同時(shí)也提高了效率(畢竟我們最終只搜索了一小塊區(qū)域)
ball = img[280:340, 330:390]
img[273:333, 100:160] = ball
上面的操作產(chǎn)生下圖的效果
圖像通道的分離和合并
有時(shí)候我們需要單獨(dú)操作圖像的各個(gè)通道,所以要先分離它們主籍,處理完成還需要再次合并它們习贫。我們可以這么做:
b,g,r = cv2.split(img)
img = cv2.merge((b,g,r))
或者
b = img[ : , : , 0]
再比如我們只需要將紅色像素全部置0逛球,可以直接使用 numpy 進(jìn)行操作千元,而不用先分離,修改颤绕,再合并幸海,那樣更快不是嗎,就像下面這樣
img[ : , : , 2] = 0
cv2.split() 是個(gè)相對(duì)耗時(shí)的操作奥务,除非你確實(shí)需要用它物独,不然的話(huà)盡可能使用高效快速的 numpy 吧
原文:
http://docs.opencv.org/master/d3/df2/tutorial_py_basic_ops.html