TShopping

 找回密碼
 註冊
搜索
查看: 132|回復: 0

[教學] Python+OpenCV 影像侵蝕 erode 與影像膨脹 dilate

[複製鏈接]
發表於 2020-12-16 21:04:48 | 顯示全部樓層 |閱讀模式
 
Push to Facebook Push to Plurk  
本篇介紹如何用 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. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import cv2
  4. import numpy as np

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

  8. cv2.imshow('Input', image)
  9. cv2.imshow('Result', erosion)
  10. cv2.waitKey(0)
複製代碼

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

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

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]
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import cv2
  4. import numpy as np

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

  8. cv2.imshow('Input', image)
  9. cv2.imshow('Result', dilation)
  10. cv2.waitKey(0)
複製代碼
[/td][/tr]
[tr][td]
結果圖如下所示:

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

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


文章出處

 

臉書網友討論
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2021-1-20 07:59 , Processed in 0.054595 second(s), 22 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表