[OpenCV基礎][Python]形態學運算(侵蝕、膨脹、梯度)

閱讀時間約 6 分鐘

形態學操作在影像處理中有多種應用,特別是在處理二值化影像(黑白影像)。

在影像處理應用上,基本上都由侵蝕,膨脹這兩種方法,組合搭配而成。

raw-image

形態學運算是是通過使用結構元素(也稱為卷積核內核)在圖像上滑動,對覆蓋區域進行矩陣運算,將覆蓋區域中的像素值設置為結構元素中相應位置最大值最小值

膨脹運算圖

膨脹運算圖

侵蝕運算圖

侵蝕運算圖


常見應用場景

  1. 物體檢測與分割:
    • 形態學操作可以用於增強或改善二值化影像中的物體邊界,使得物體的檢測和分割更加準確。這對於計算機視覺中的目標檢測分割任務非常有用。
    • OpenCV與有提供一個圖像分割的演算法watershed敝人文章連結如下:
    • [OpenCV應用][Python]應用watershed分割圖像(硬幣分割)
  2. 雜訊去除:
    • 在二值化影像中,形態學操作可以用來去除小的雜訊點,使影像更加清晰。侵蝕操作特別適合這一應用,它可以消除小的斑點和細小連接,而不影響主要的物體結構
  3. 填充與洞補:
    • 閉運算可以用來填充物體內的小洞,使物體更加完整。
  4. 文本的二值化:
    • 在光學字符識別(OCR)等應用中,形態學操作可以用來處理二值化的圖像,增強文本區域的形狀,使得字符更容易被識別
  5. 圖像的特徵提取:
    • 形態學操作可以用於提取影像中的結構和特徵,例如提取圖像中的邊緣、角點等。這對於後續的圖像分析特徵識別非常重要。

膨脹(Dilation):

通常用於擴大和強調二值影像中的物體。膨脹的效果是將物體的邊界擴張

import cv2
import numpy as np

# 讀取二值影像
binary_image = cv2.imread('binary_image.jpg', cv2.IMREAD_GRAYSCALE)

# 定義膨脹的結構元素
kernel = np.ones((5, 5), np.uint8)

# 進行膨脹操作
dilated_image = cv2.dilate(binary_image, kernel, iterations=2)

cv2.imread('binary_image.jpg', cv2.IMREAD_GRAYSCALE)
1. 使用OpenCV的imread函數讀取名為'binary_image.jpg'的影像
2. 並使用cv2.IMREAD_GRAYSCALE將其轉換為灰度影像。

np.ones((5, 5), np.uint8)
1. 創建一個大小為 (5, 5) 的二維NumPy陣列,所有元素都是1,並指定數據類型為 np.uint8
2. 這個陣列被用作侵蝕操作結構元素,它決定了侵蝕的形狀和大小。

cv2.dilate(binary_image, kernel, iterations=1)
1. binary_image:要進行膨脹的影像,這裡是灰度影像。
2. kernel:膨脹的結構元素。
3. iterations膨脹迭代次數,可以控制膨脹的程度。在這裡設定為2,表示進行二次膨脹操作。


侵蝕(Erosion):

通常用於縮小和平滑二值影像中的物體。侵蝕的效果是將物體的邊界收縮

import cv2
import numpy as np

# 讀取二值影像
binary_image = cv2.imread('binary_image.jpg', cv2.IMREAD_GRAYSCALE)

# 定義侵蝕的結構元素
kernel = np.ones((5, 5), np.uint8)

# 進行侵蝕操作
eroded_image = cv2.erode(binary_image, kernel, iterations=1)

cv2.erode(binary_image, kernel, iterations=1)
1. binary_image:要進行侵蝕的影像,這裡是灰度影像。
2. kernel:侵蝕的結構元素。
3. iterations:侵蝕的迭代次數,可以控制侵蝕的程度。在這裡設定為1,表示進行一次侵蝕操作。


形態學梯度運算

Morphological Gradient)是形態學操作的一種,膨脹的圖減去侵蝕的圖,通常用於檢測物體的邊緣。它是膨脹操作和侵蝕操作的差異。

import cv2
import numpy as np

# 讀取影像
image = cv2.imread('your_image.jpg', cv2.IMREAD_GRAYSCALE)

# 定義膨脹的結構元素
dilation_kernel = np.ones((5, 5), np.uint8)

# 定義侵蝕的結構元素
erosion_kernel = np.ones((5, 5), np.uint8)

# 進行膨脹操作
dilated_image = cv2.dilate(image, dilation_kernel, iterations=1)

# 進行侵蝕操作
eroded_image = cv2.erode(image, erosion_kernel, iterations=1)

# 形態學梯度運算:膨脹的結果減去侵蝕的結果
morphological_gradient = cv2.subtract(dilated_image, eroded_image)

# 顯示原始影像、膨脹結果、侵蝕結果和形態學梯度結果
cv2.imshow('Original Image', image)
cv2.imshow('Dilated Image', dilated_image)
cv2.imshow('Eroded Image', eroded_image)
cv2.imshow('Morphological Gradient', morphological_gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()
梯度運算

梯度運算


還有其他形態學運算,例如開運算閉運算禮帽運算、黑帽運算。就下章節在揭曉囉







avatar-img
125會員
209內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
Python 提供了一系列內建函式,其中一部分涉及數學和數學操作。 以下是一些常用的內建函式和數學相關的函式: 基本數學運算: abs(x): 返回 x 的絕對值。 result = abs(-5) print(result) # 輸出: 5 max(iterable) 和 min(
在 Python 中,dir() 函式用於列舉對象的所有屬性和方法。這包括對象的內建屬性、方法以及自定義的屬性和方法。以下是一個簡單的示例: 列舉所有屬性與方法 class MyClass: def __init__(self): self.attribute1 = 42
前幾篇討論到各種裝飾器的用法,本文將介紹另外一種裝飾器,可以將方法轉換成屬性來使用。 property也可以動態的取出物件的值,隨著時間或其他運算改變所產生的值,讓我們繼續往下看更多介紹吧。
先前我們談論到靜態方法就像是定義工具箱一樣,那麼抽象方法就像是共用表格的概念,例如註冊帳號時會填寫的一些基本資料,就有包含制式的表格,裡面有需填寫的欄位,例如姓名,性別等。
先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。
在使用類別創建實例時,輸入的屬性的都要定義好資料型態,例如dog_1 = Dog("Buddy", 3),有沒有輸入一段字串讓他自己判斷的方法阿? 有的就是使用classmethod: classmethod 是一種裝飾器,它用於定義類別方法。類別方法與實例方法不同,它們被綁定到類別而不是實例。
Python 提供了一系列內建函式,其中一部分涉及數學和數學操作。 以下是一些常用的內建函式和數學相關的函式: 基本數學運算: abs(x): 返回 x 的絕對值。 result = abs(-5) print(result) # 輸出: 5 max(iterable) 和 min(
在 Python 中,dir() 函式用於列舉對象的所有屬性和方法。這包括對象的內建屬性、方法以及自定義的屬性和方法。以下是一個簡單的示例: 列舉所有屬性與方法 class MyClass: def __init__(self): self.attribute1 = 42
前幾篇討論到各種裝飾器的用法,本文將介紹另外一種裝飾器,可以將方法轉換成屬性來使用。 property也可以動態的取出物件的值,隨著時間或其他運算改變所產生的值,讓我們繼續往下看更多介紹吧。
先前我們談論到靜態方法就像是定義工具箱一樣,那麼抽象方法就像是共用表格的概念,例如註冊帳號時會填寫的一些基本資料,就有包含制式的表格,裡面有需填寫的欄位,例如姓名,性別等。
先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。
在使用類別創建實例時,輸入的屬性的都要定義好資料型態,例如dog_1 = Dog("Buddy", 3),有沒有輸入一段字串讓他自己判斷的方法阿? 有的就是使用classmethod: classmethod 是一種裝飾器,它用於定義類別方法。類別方法與實例方法不同,它們被綁定到類別而不是實例。
你可能也想看
Google News 追蹤
Thumbnail
Hi 我是 VK~ 在 8 月底寫完〈探索 AI 時代的知識革命:NotebookLM 如何顛覆學習和創作流程?〉後,有機會在 INSIDE POSSIBE 分享兩次「和 NotebookLM 協作如何改變我學習和創作」的主題,剛好最近也有在許多地方聊到關於 NotebookLM 等 AI 工具
Thumbnail
國泰CUBE App 整合外幣換匯、基金、證券等服務,提供簡便、低成本的美股定期定額投資解決方案。 5分鐘開戶、低投資門檻,幫助新手輕鬆進軍國際股市;提供人氣排行榜,讓投資人能夠掌握市場趨勢。
Thumbnail
這是張老師的第三本書,我想前二本應該也有很多朋友們都有讀過,我想絕對是受益良多,而這次在書名上就直接點出,著重在從投資的角度來切入
Thumbnail
在樹莓派安裝OpenCV的紀錄。板子是樹莓派3B(沒有+),系統raspbian bullseye 32bit灌到USB隨身碟。
Thumbnail
#安裝 OpenCV 相關套件 pip install opencv-python pip install opencv-contrib-python pip install matplotlib
Haar Cascade classifier OpenCV 官方 Github:https://github.com/opencv/opencv/tree/4.x/data 人臉特徵模型:haarcascade_frontalface_default.xml 資料來源: https://steam
Thumbnail
OpenCV 讀取圖片 原碼:https://reurl.cc/3354ZL 成果: OpenCV 本身有提供讀取圖檔的函數可用,讀取圖檔,只要呼叫 cv2.imread 即可將圖片讀取進來,以 cv2.imread 讀進來的資料,會儲存成一個 NumPy 的陣列。 將圖片讀取進來之後,可使用 c
opencv is use BGR color matplotlib is use RGB color 顯示圖片 opencv matplotlib
Thumbnail
初稿 作者: Stan Ht. Wu (stanwu 吳信典) 想像一下,如果整台電腦裝瀏覽器就好了?這樣多輕鬆啊!人生就是要斷捨離,什麼都不裝,就用瀏覽器就好了,您看連寫方格子的文章也是直接用瀏覽器耶!! 用瀏覽器基本上是最符合懶人原則,為什麼呢?因為從頭到尾根本不需要切換應用程式,存檔案放在雲端
Thumbnail
OpenCart 官方的 3.0.3.7 版於上周釋出,除了修正許多 3.0.x 版累積的小問題,也更新了 twig 套件解決了 PHP 7.4 的相容問題,所以 OpenCart 台灣電商技術團隊,也以 OpenCart 3.0.3.7 版為基礎,加上了在地優化及實用模組,推出台灣優化版。
Thumbnail
綠界科技雖然為 OpenCart 電商系統推出了可直接安裝使用的金流擴充模組,但其設計的模組架構,並不算完全符合 OpenCart 金流模組的架構規則,包含後臺編輯不同付款方式時的設定,無法獨立分開設定,前台的金流選擇,更是被設計成兩段式的模式,非常不符合台灣消費者慣用的習性。
Thumbnail
Hi 我是 VK~ 在 8 月底寫完〈探索 AI 時代的知識革命:NotebookLM 如何顛覆學習和創作流程?〉後,有機會在 INSIDE POSSIBE 分享兩次「和 NotebookLM 協作如何改變我學習和創作」的主題,剛好最近也有在許多地方聊到關於 NotebookLM 等 AI 工具
Thumbnail
國泰CUBE App 整合外幣換匯、基金、證券等服務,提供簡便、低成本的美股定期定額投資解決方案。 5分鐘開戶、低投資門檻,幫助新手輕鬆進軍國際股市;提供人氣排行榜,讓投資人能夠掌握市場趨勢。
Thumbnail
這是張老師的第三本書,我想前二本應該也有很多朋友們都有讀過,我想絕對是受益良多,而這次在書名上就直接點出,著重在從投資的角度來切入
Thumbnail
在樹莓派安裝OpenCV的紀錄。板子是樹莓派3B(沒有+),系統raspbian bullseye 32bit灌到USB隨身碟。
Thumbnail
#安裝 OpenCV 相關套件 pip install opencv-python pip install opencv-contrib-python pip install matplotlib
Haar Cascade classifier OpenCV 官方 Github:https://github.com/opencv/opencv/tree/4.x/data 人臉特徵模型:haarcascade_frontalface_default.xml 資料來源: https://steam
Thumbnail
OpenCV 讀取圖片 原碼:https://reurl.cc/3354ZL 成果: OpenCV 本身有提供讀取圖檔的函數可用,讀取圖檔,只要呼叫 cv2.imread 即可將圖片讀取進來,以 cv2.imread 讀進來的資料,會儲存成一個 NumPy 的陣列。 將圖片讀取進來之後,可使用 c
opencv is use BGR color matplotlib is use RGB color 顯示圖片 opencv matplotlib
Thumbnail
初稿 作者: Stan Ht. Wu (stanwu 吳信典) 想像一下,如果整台電腦裝瀏覽器就好了?這樣多輕鬆啊!人生就是要斷捨離,什麼都不裝,就用瀏覽器就好了,您看連寫方格子的文章也是直接用瀏覽器耶!! 用瀏覽器基本上是最符合懶人原則,為什麼呢?因為從頭到尾根本不需要切換應用程式,存檔案放在雲端
Thumbnail
OpenCart 官方的 3.0.3.7 版於上周釋出,除了修正許多 3.0.x 版累積的小問題,也更新了 twig 套件解決了 PHP 7.4 的相容問題,所以 OpenCart 台灣電商技術團隊,也以 OpenCart 3.0.3.7 版為基礎,加上了在地優化及實用模組,推出台灣優化版。
Thumbnail
綠界科技雖然為 OpenCart 電商系統推出了可直接安裝使用的金流擴充模組,但其設計的模組架構,並不算完全符合 OpenCart 金流模組的架構規則,包含後臺編輯不同付款方式時的設定,無法獨立分開設定,前台的金流選擇,更是被設計成兩段式的模式,非常不符合台灣消費者慣用的習性。