opencv基本的圖像操作

參考opencv官方文檔OpenCV: Basic Operations on Images

加載圖像,常用的方式是imread()函數(shù),這個函數(shù)會返回一幅圖像,而這個圖像是一個數(shù)組,會根據(jù)imread()輸入?yún)?shù)的不同,可能是一個三維數(shù)組或者二維數(shù)組。

numpy是經(jīng)過優(yōu)化了的進行快速矩陣運算的包,其中numpy.array結(jié)構(gòu)針對數(shù)組操作有很好的優(yōu)化,它可以允許bulk(塊)操作,這些操作經(jīng)常會在圖像的處理上用到。

1.獲取像素并修改像素

import cv2

import numpy

img = cv2.imread('MY_PIC.jpg')

px=img[100,100]

print(px)

blue = img[100,100,0]

print(blue)

img[101,101]=[255,255,255]

print(img[101,101])

numpy是經(jīng)過優(yōu)化了的進行快速矩陣運算的包,所以不推薦逐個獲取像素值并修改能矩陣運算就不要用循環(huán)。例如前5行的后3列,用numpy的array.item()和array.itemset()會更好。但是返回是標量,如果想獲得所有RGB的值,需要使用array.item()分割.

print(img.item(10,10,2))

img.itemset((10,10,2),100)

print(img.item(10,10,2))

2.獲取圖像屬性

img.shape 獲得圖像的形狀,返回值是一個包含行數(shù),列數(shù),通道數(shù)的元組

img.size可以返回圖像的像素數(shù)目

?img.dtype返回圖像的數(shù)據(jù)類型,在debug時很重要,因為OpenCV-Python代碼中經(jīng)常出現(xiàn)數(shù)據(jù)類型的不一致

3.對圖像的特定區(qū)域操作。ROI是使用numpy索引來獲得的

例:選擇球的部分并拷貝到其他區(qū)域


ball = img[280:340, 330:390]

img[40:40,50:50]=ball

4.拆分及合并圖像通道

有時需要拆分BGR為單個通道,對BGR三個通道分別操作。有時需要把獨立的通道的圖片合成一個BGR。

b,g,r = cv2.split(img)

img = cv2.merge((b,g,r))

?#拆分b通道

b = img[:,:,0]

# 假如想使所有紅色通道值都為0,不必拆分再賦值,可以使用numpy索引,這樣更快

img[:,:,2]=0

PS:cv2.split()是比較耗時的操作,能用numpy就盡量使用。

5.為圖像擴邊(填充)

想為圖像周圍建一個邊可以使用cv2.copyMakeBorder()函數(shù)。這經(jīng)常在卷積運算或0填充時被用到。具體參數(shù)如下:

5.1 src輸入圖像

5.2 top,bottom,left,right對應(yīng)邊界的像素數(shù)目

5.3 borderType要添加哪種類型的邊界:

5.3.1 cv2.BORDER_CONSTANT添加有顏色的常數(shù)值邊界,還需要下一個參數(shù)(value:邊界顏色)

5.3.2 cv2.BORDER_REFLIECT邊界元素的鏡像。例如:fedcba | abcdefgh | hgfedcb

5.3.3 cv2.BORDER_101或者cv2.BORDER_DEFAULT跟上面一樣,但稍作改動,例如:gfedcb | abcdefgh | gfedcba

5.3.4 cv2.BORDER_REPLICATE復(fù)后一個元素。例如: aaaaaa| abcdefgh|hhhhhhh

5.3.5 cv2.BORDER_WRAP 就像這樣: cdefgh| abcdefgh|abcdefg


運行結(jié)果圖:


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容