天天看點

一起來學opencv-python(六)—— 圖像處理之形态學操作系列文章目錄前言形态學操作

系列文章目錄

文章目錄

  • 系列文章目錄
  • 前言
  • 形态學操作
    • 1. 理論
    • 2. 腐蝕
    • 3. 膨脹
    • 4. 開操作
    • 5. 閉操作
    • 6. 形态學梯度
    • 7. 頂帽
    • 8. 黑帽
    • 9. 結構體元素
    • 10. 擴充資料

前言

本節将介紹形态學操作

形态學操作

形态學操作:如腐蝕,膨脹,打開,關閉等。

函數如下: cv.erode(), cv.dilate(), cv.morphologyEx() 等.

1. 理論

形态變換是一些基于圖像形狀的簡單操作。它通常在二值圖像上執行。它需要兩個輸入,一個是我們的原始圖像,另一個是決定操作性質的結構元素或核心。兩個基本的形态學算子是腐蝕和膨脹。然後它的變體形式,如開,閉,梯度等也發揮作用。我們将通過以下圖檔逐一了解它們:

一起來學opencv-python(六)—— 圖像處理之形态學操作系列文章目錄前言形态學操作

2. 腐蝕

腐蝕的基本思想就像土壤腐蝕一樣,它腐蝕了前景對象的邊界(總是嘗試保持前景為白色)。那麼它是做什麼的呢?核心在圖像中滑動(就像在2D卷積中一樣)。隻有當核下的所有像素都為1時,原始圖像中的一個像素(1或0)才會被認為是1,否則就會被腐蝕(使其為0)。

是以,根據kernel的大小,邊界附近的所有像素都将被丢棄。是以前景物體的厚度或大小減少了,或者隻是圖像中的白色區域減少了。它對去除小的白噪聲(如我們在顔色空間章節中看到的),分離兩個連接配接的物體等都很有用。

在這裡,作為一個示例,我将使用一個充滿1的5x5核心。讓我們看看它是如何工作的:

import cv2 as cv
import numpy as np
img = cv.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv.erode(img,kernel,iterations = 1)
           
一起來學opencv-python(六)—— 圖像處理之形态學操作系列文章目錄前言形态學操作

3. 膨脹

它正好與腐蝕相反。在這裡,如果核心下隻要有一個像素是“1”,那麼像素元素就是“1”。是以它增加了圖像中的白色區域或者前景物體的大小增加了。通常情況下,在去除噪音的情況下,腐蝕緊随其後的是膨脹。因為腐蝕去除了白噪聲,但它也縮小了我們的對象。是以我們把它放大。因為噪音消失了,它們不會再回來,但是我們的物體面積增加了。它在連接配接一個物體的破碎部分時也很有用。

一起來學opencv-python(六)—— 圖像處理之形态學操作系列文章目錄前言形态學操作

4. 開操作

開操作為腐蝕+膨脹。正如我們上面所解釋的,它在消除噪聲方面是有用的。這裡我們使用函數**cv.morphologyEx()**

一起來學opencv-python(六)—— 圖像處理之形态學操作系列文章目錄前言形态學操作

5. 閉操作

閉操作和開操作相反,為膨脹+腐蝕。它在關閉前景物體内部的小孔或物體上的小黑點時很有用。

一起來學opencv-python(六)—— 圖像處理之形态學操作系列文章目錄前言形态學操作

6. 形态學梯度

形态學梯度為膨脹-腐蝕。

結果将看起來像對象的輪廓。

一起來學opencv-python(六)—— 圖像處理之形态學操作系列文章目錄前言形态學操作

7. 頂帽

原圖-開操作

一起來學opencv-python(六)—— 圖像處理之形态學操作系列文章目錄前言形态學操作

8. 黑帽

閉操作後的圖檔 - 原圖

一起來學opencv-python(六)—— 圖像處理之形态學操作系列文章目錄前言形态學操作

9. 結構體元素

在前面的例子中,我們在Numpy的幫助下手動建立了一個結構化元素。它是矩形的。但在某些情況下,你可能需要橢圓形或圓形的kernels。是以,為了達到這個目的,OpenCV有一個函數,cv.getStructuringElement()。隻要傳遞出kernels的形狀和大小,就能得到想要的kernels。

# Rectangular Kernel
>>> cv.getStructuringElement(cv.MORPH_RECT,(5,5))
array([[1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1]], dtype=uint8)
# Elliptical Kernel
>>> cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))
array([[0, 0, 1, 0, 0],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1],
       [0, 0, 1, 0, 0]], dtype=uint8)
# Cross-shaped Kernel
>>> cv.getStructuringElement(cv.MORPH_CROSS,(5,5))
array([[0, 0, 1, 0, 0],
       [0, 0, 1, 0, 0],
       [1, 1, 1, 1, 1],
       [0, 0, 1, 0, 0],
       [0, 0, 1, 0, 0]], dtype=uint8)
           

10. 擴充資料

  1. Morphological Operations at HIPR2

繼續閱讀