本篇介紹如何用 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- #!/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)
複製代碼
結果圖如下所示: [/td][/tr]
[tr][td]可以發現右邊影像的線條明顯地變細了[/td][/tr]
[tr][td]
OpenCV 影像侵蝕 erode 與影像膨脹 dilate
[/td][/tr]
[tr][td]Dilation 影像膨脹再來介紹 Dilation 影像膨脹, [/td][/tr]
[tr][td]用途1:Dilation 影像膨脹通常是配合著影像侵蝕 Erosion 使用,先使用侵蝕的方式使影像中的線條變窄,同時也去除雜訊,之後再透過 Dilation 將影像膨脹回來。[/td][/tr]
[tr][td]用途2:用來連接兩個很靠近但分開的物體。影像膨脹的概念就是將影像中白色區域(或高亮)進行擴張,運算完的結果圖比原圖的白色區域更大,也可想像成讓該物體胖一圈,而這一圈的寬度是由捲積 kernel 的大小所決定的, [/td][/tr]
[tr][td]在實際上捲積 kernel 沿著影樣滑動並計算,如果捲積 kernel m x n 範圍內只要有一個像素值是1,那麼新的像素值就為1,[/td][/tr]
[tr][td]否則新的像素值保持原來的像素值,這表示捲積 kernel 掃過的所有像素都會被擴張或膨脹(變為1),所以整張影像的白色區域會變多。cv2.dilate() 的第一個參數為二值化的影像, 第二個參數為使用的捲積 kernel,第三個參數為迭代次數(預設為1), [/td][/tr]
[tr][td]範例中的 kernel 捲積大小為 3x3,可以改成 5x5 或 7x7 較為常見,預設值為 3x3[/td][/tr]
[tr][td]opencv-dilate.py[/td][/tr]
[tr][td]- #!/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)
複製代碼 [/td][/tr]
[tr][td]結果圖如下所示:
OpenCV 影像侵蝕 erode 與影像膨脹 dilate
文章出處 |