提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 一、梯度的概念
- 二、梯度的應用
- 三、梯度如何實現
一、梯度的概念
形態學梯度(Morphological Gradient)是數字圖像處理中的一種基本操作,用于檢測圖像中的邊緣和輪廓。它結合了形態學膨脹(Dilation)和形態學腐蝕(Erosion)兩種基本操作的結果,從而得到一個圖像的邊緣信息。
二、梯度的應用
現在有個問題請大家想一下,上面我們提到了梯度可以得到圖像的邊緣信息,那我們通過前幾節的課程想一下 梯度是如何實現的?
例如我現在有個圓,我如何得到圓的邊緣?
我如果把這個圓給膨脹一下,這個圓就變大了一圈,我再給腐蝕一下,圓又變小了,如果拿膨脹減去腐蝕的 不就是邊緣了嗎。
那有人可能又問了:膨脹過后減去原圖不也能得到邊緣嗎,為什么還要在腐蝕一下在減呢?
其實膨脹減去原圖也能得到邊緣,但是這和膨脹減去腐蝕是有差距的:
當我們將膨脹操作的結果減去原始圖像時,實際上得到的是原始圖像中比周圍更亮的區域。這是因為膨脹操作會擴大圖像中較亮的區域,而減去原始圖像后,差異部分就是原始圖像中相對較亮的區域。因此,這樣的操作會突出原始圖像中的亮部分,而不是物體的邊緣。
對于檢測邊緣,我們需要考慮的是圖像中亮暗交界處的變化,而不僅僅是圖像中較亮的區域。形態學梯度通過膨脹和腐蝕操作的差異來捕獲這種變化,因為它考慮了物體與背景之間的差異,即使在較暗的物體周圍也能有效地檢測到邊緣。
因此,直接將膨脹操作的結果減去原始圖像并不適合用于突出圖像的邊緣信息,而形態學梯度通過膨脹減去腐蝕來更準確地實現這一目的。
三、梯度如何實現
import cv2
import numpy as np# 讀取圖像
image = cv2.imread('yunfeng.jpg', cv2.IMREAD_GRAYSCALE)# 定義結構元素
kernel = np.ones((5,5), np.uint8)# 膨脹操作
dilated = cv2.dilate(image, kernel, iterations=1)# 腐蝕操作
eroded = cv2.erode(image, kernel, iterations=1)# 形態學梯度
gradient = cv2.morphologyEx(image, cv2.MORPH_GRADIENT, kernel)# 顯示原始圖像、膨脹結果、腐蝕結果和形態學梯度結果
cv2.imshow('Original 、', image)
cv2.imshow('Dilated ', dilated)
cv2.imshow('Eroded ', eroded)
cv2.imshow('Morphological', gradient)cv2.waitKey(0)
cv2.destroyAllWindows()
上面代碼對圖像腐蝕和膨脹是為了看對比效果,實際上梯度是通過morphologyEx MORPH_GRADIENT這個參數實現的。
我們看下最終效果: