OpenCV Python中的高帽變換和黑帽變換


高帽變換和黑帽變換是二值影像的形態學變換操作。通常,形態學操作基於形態、結構或形狀處理影像。

高帽變換是一種先對影像進行開運算,然後從原始影像中減去開運算結果的操作(高帽 = 影像 - 開運算)。它用於從給定影像中提取小的元素和細節,這也就是特徵提取、影像增強和其他操作。

黑帽變換操作是影像閉運算與輸入影像本身之差(黑帽 = 閉運算 - 影像)。它在從原始影像中減去閉運算結果之前先對影像進行閉運算。結果影像包含比周圍環境和結構元素更暗更小的物體。

OpenCV 提供了一個函式 `cv2.morphologyEx()`,它直接在影像上實現這些變換操作。

`cv2.morphologyEx()` 函式

該函式使用基本的腐蝕和膨脹操作執行這些高階形態變換。

語法

cv.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

引數

  • Src:源影像,可以有任意數量的通道。深度應為 CV_8U、CV_16U、CV_16S、CV_32F 或 CV_64F 之一。

  • Op:指定要應用的形態學操作型別。

    • MORPH_OPEN – 開運算

    • MORPH_CLOSE – 閉運算

    • MORPH_GRADIENT – 形態梯度

    • MORPH_TOPHAT: “高帽”

    • MORPH_BLACKHAT: “黑帽”

  • Kernel:結構元素,其原點由錨點定義。可以使用 `getStructuringElement` 建立。

  • Anchor:核心的錨點位置,預設為 (-1,-1)。負值指定錨點位於核心中心。

  • Dst:目標影像。

  • Iterations:指定應用腐蝕和膨脹的次數。

  • borderType 和 borderValue:這些引數用於填充影像以考慮邊界畫素,或者如果影像是非規則形狀。

高帽變換

高帽變換就是原始影像與其開運算結果之差。

示例

讓我們取一張影像,並使用 `cv2.morphologyEx()` 方法進行高帽變換。

import cv2
import numpy as np
img = cv2.imread('Images/Dog.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (13, 5))
tophat = cv2.morphologyEx(gray, cv2.MORPH_TOPHAT, Kernel)
cv2.imshow("Original", img)
cv2.imshow("TopHat", tophat)
cv2.waitKey(0)

輸入影像

輸出影像

示例

在這個例子中,我們將手動實現高帽操作,首先找到影像開運算,然後從原始影像中減去它。

import cv2
import numpy as np
img = cv2.imread('Images/Dog.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (13, 5))
opening = cv2.morphologyEx(gray, cv2.MORPH_OPEN, Kernel)
tophat_manual = np.subtract(gray, opening)

cv2.imshow("Original", img)
cv2.imshow("TopHat_manual approach", tophat_manual)
cv2.waitKey(0)

輸出

以下是上述程式的輸入和輸出影像:

黑帽變換

黑帽變換就是閉運算影像與原始影像之差。

示例

讓我們透過為 `cv2.morphologyEx()` 方法指定 MorphType `cv2.MORPH_BLACKHAT` 引數來執行黑帽變換操作。

import cv2
import numpy as np
img = cv2.imread('Images/Dog.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (13, 5))
blackhat = cv2.morphologyEx(gray, cv2.MORPH_BLACKHAT, Kernel)
cv2.imshow("Original", img)
cv2.imshow("BlackHat", blackhat)
cv2.waitKey(0)

輸入影像

輸出影像

示例

在這個例子中,我們將手動實現黑帽變換操作,從閉運算結果中減去原始影像。

import cv2
import numpy as np
img = cv2.imread('Images/Dog.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (13, 5))
closing = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, Kernel)
blackhat_manual = np.subtract(closing, gray)

cv2.imshow("Original", img)
cv2.imshow("BlackHat_manual approach", blackhat_manual)
cv2.waitKey(0)

輸出

在這裡,我們討論了使用 OpenCV Python 的高帽變換和黑帽變換操作。

更新於:2023年5月30日

瀏覽量 1K+

開啟您的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.