- 禮帽運算
原圖像與“開運算“的結果圖之差,如下式計算:
因為開運算帶來的結果是放大了裂縫或者局部低亮度的區域,是以,從原圖中減去開運算後的圖,得到的效果圖突出了比原圖輪廓周圍的區域更明亮的區域,且這一操作和選擇的核的大小相關。
禮帽運算用來分離比鄰近點亮一些的斑塊。當一幅圖像具有大幅的背景的時候,而微小物品比較有規律的情況下,可以使用頂帽運算進行背景提取。
- 黑帽運算
為”閉運算“的結果圖與原圖像之差。數學表達式為:
黑帽運算後的效果圖突出了比原圖輪廓周圍的區域更暗的區域,且這一操作和選擇的核的大小相關。
cv.morphologyEx(img, op, kernel)
- img: 要處理的圖像
- op: 處理方式:
- cv.MORPH_OPEN:開運算
- cv:MORPH_CLOSE:閉運算
- cv:MORPH_TOPHAT:禮帽運算
- cv:MORPH_BLACKHAT:黑帽運算
- Kernel: 核結構
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1 讀取圖像
img1 = cv.imread("./1.png")
img2 = cv.imread("./2.png")
# 2 建立核結構
kernel = np.ones((10, 10), np.uint8)
# 3 圖像的禮帽和黑帽運算
cvOpen = cv.morphologyEx(img1, cv.MORPH_TOPHAT, kernel) # 禮帽運算
cvClose = cv.morphologyEx(img2, cv.MORPH_BLACKHAT, kernel) # 黑帽運算
# 4 圖像顯示
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8))
axes[0, 0].imshow(img1)
axes[0, 0].set_title("原圖")
axes[0, 1].imshow(cvOpen)
axes[0, 1].set_title("禮帽運算結果")
axes[1, 0].imshow(img2)
axes[1, 0].set_title("原圖")
axes[1, 1].imshow(cvClose)
axes[1, 1].set_title("黑帽運算結果")
plt.show()