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 的高帽變換和黑帽變換操作。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP