Python OpenCV 影像侵蝕 erode 與影像膨脹 dilate

本篇介紹如何用 Python 搭配 OpenCV 模組來作影像侵蝕 cv2.erode 與影像膨脹 cv2.dilate,影像的侵蝕 Erosion 與膨脹 Dilation 是型態學的兩種基本運算,形態學主要是用來處理二值化後的影像,趕緊來學習吧。

Erosion 影像侵蝕

這篇要介紹影像處理中的型態變換,首先先介紹 Erosion 影像侵蝕。
用途1:Erosion 影像侵蝕對於移除影像中的小白雜點很有幫助,可用來去噪,例如影像中的小雜點,雜訊。
用途2:細化影像,消除毛刺。

影像侵蝕的概念就是將影像中白色區域(或高亮)進行細化或縮減,運算完的結果圖比原圖的白色區域更小,也可想像成讓該物體瘦一圈,而這一圈的寬度是由捲積 kernel 的大小所決定的,
實際上捲積 kernel 沿著影樣滑動並計算,如果捲積 kernel m x n 範圍內所有像素值都是1,那麼新的像素值就保持原來的值,
否則新的像素值為0,這表示捲積 kernel 掃過的所有像素都會被腐蝕或侵蝕掉(變為0),所以整張影像的白色區域會變少。

cv2.erode() 的第一個參數為二值化的影像, 第二個參數為使用的捲積 kernel,第三個參數為迭代次數(預設為1),
範例中的 kernel 捲積大小為 3x3,可以改成 5x5 或 7x7 較為常見,預設值為 3x3

opencv-erode.py
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
import numpy as np

image = cv2.imread('LinuxLogo.jpg', 0)
kernel = np.ones((3,3), np.uint8)
erosion = cv2.erode(image, kernel, iterations = 1)

cv2.imshow('Input', image)
cv2.imshow('Result', erosion)
cv2.waitKey(0)

結果圖如下所示:
可以發現右邊影像的線條明顯地變細了

Dilation 影像膨脹

再來介紹 Dilation 影像膨脹,
用途1:Dilation 影像膨脹通常是配合著影像侵蝕 Erosion 使用,先使用侵蝕的方式使影像中的線條變窄,同時也去除雜訊,之後再透過 Dilation 將影像膨脹回來。
用途2:用來連接兩個很靠近但分開的物體。

影像膨脹的概念就是將影像中白色區域(或高亮)進行擴張,運算完的結果圖比原圖的白色區域更大,也可想像成讓該物體胖一圈,而這一圈的寬度是由捲積 kernel 的大小所決定的,
在實際上捲積 kernel 沿著影樣滑動並計算,如果捲積 kernel m x n 範圍內只要有一個像素值是1,那麼新的像素值就為1,
否則新的像素值保持原來的像素值,這表示捲積 kernel 掃過的所有像素都會被擴張或膨脹(變為1),所以整張影像的白色區域會變多。

cv2.dilate() 的第一個參數為二值化的影像, 第二個參數為使用的捲積 kernel,第三個參數為迭代次數(預設為1),
範例中的 kernel 捲積大小為 3x3,可以改成 5x5 或 7x7 較為常見,預設值為 3x3

opencv-dilate.py
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
import numpy as np

image = cv2.imread('LinuxLogo.jpg', 0)
kernel = np.ones((3,3), np.uint8)
dilation = cv2.dilate(image, kernel, iterations = 1)

cv2.imshow('Input', image)
cv2.imshow('Result', dilation)
cv2.waitKey(0)

結果圖如下所示:

參考
Morphological Transformations — OpenCV-Python Tutorials beta documentation
https://opencv24-python-tutorials.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_morphological_ops/py_morphological_ops.html
opencv-python中的腐蝕與膨脹函數
https://blog.csdn.net/hjxu2016/article/details/77837765

其它相關文章推薦
Python OpenCV 彩色轉灰階(RGB/BGR to GRAY)
Python OpenCV 彩色轉HSV(RGB/BGR to HSV)
Python OpenCV 彩色轉YCbCr(RGB/BGR to YCbCr)
Python OpenCV 灰階轉彩色(Gray to RGB/BGR)
Python OpenCV 影像二值化 Image Thresholding
Python OpenCV 影像平滑模糊化 blur
Python OpenCV 影像邊緣偵測 Canny Edge Detection
Python OpenCV 垂直vconcat 和水平hconcat 影像拼接
Python OpenCV resize 圖片縮放
Python 新手入門教學懶人包
小專案 Python OpenCV 圖片轉字元圖畫