opencv-python 2 影象基本操作

2023-03-24 18:01:05

影象的基本操作

獲取並修改影象的畫素值

可以通過行和列的座標值獲取該畫素點的畫素值。對於BGR影象,它返回一個藍色,綠色,紅色值的陣列。對於灰度影象,僅返回相應的強度值。

可以用同樣的方法修改畫素點的畫素值:

更好的畫素獲取和編輯方法:

獲取影象的屬性

影象屬性包括行數,列數和通道數,影象資料型別,畫素數等。
使用img.shape可以獲取影象的形狀。它返回一組行,列和通道的元組(如果影象是彩色的):

注意:如果影象是灰度影象,則返回的元組僅包含行數和列數,因此這是檢查載入的影象是灰度還是彩色的一種很好的方法。

使用img.size獲取的畫素總數, img.dtype獲取影象資料型別:

影象ROI

有時你需要對一幅影象的特定區域進行操作。例如我們要檢測一副影象中眼睛的位置,我們首先應該在影象中找到臉,再在臉的區域中找眼睛,而不是直接在一整幅影象中搜尋。這樣會提高程式的準確性(因為眼睛總在臉上)和效能(因為我們在很小的區域內搜尋)。 ROI 也是使用 Numpy 索引來獲得的。
1.我們先在影象上建立一個目標區域

2.移動目標區域

影象通道的拆分與合併

有時您需要分別處理影象的B、G、R通道。在這種情況下,需要將BGR影象分割為單個通道。或者在其他情況下,可能需要將這些單獨的通道合併到BGR影象。

拆分有兩種方式,cv.split()是一項代價高昂的操作(就消耗時間而言)。所以只有在你需要時才這樣做。否則使用Numpy索引

合併用cv.merge()

假設你要將所有紅色畫素設定為零,則無需先拆分通道。使用Numpy索引更快:

製作影象邊框(padding)

如果要在影象周圍建立邊框,比如相框,可以使用cv.copyMakeBorder()。它在折積運算,零填充等方面有更多的應用。該函數需要以下引數:

  • src - 輸入影象
  • top, bottom, left, right - 對應邊界的畫素數目。
  • borderType - 要新增那種型別的邊界,型別如下:
  • cv2.BORDER_CONSTANT - 新增一個固定的彩色邊框,還需要下一個引數(value)。
  • cv2.BORDER_REFLECT - 邊界元素的映象。比如: fedcba|abcdefgh|hgfedcb
  • cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT - 跟上面一樣,但稍作改動。例如: gfedcb|abcdefgh|gfedcba
  • cv2.BORDER_REPLICATE 重複最後一個元素。例如: aaaaaa|abcdefgh|hhhhhhh
  • cv2.BORDER_WRAP - 不知道怎麼說了, 就像這樣: cdefgh|abcdefgh|abcdefg
  • value 邊界顏色,如果邊界的型別是 cv2.BORDER_CONSTANT

其他邊框demo

replicate = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REPLICATE)
reflect = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REFLECT)
reflect101 = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REFLECT_101)
wrap = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_WRAP)