天天看點

OpenCV 禮帽和黑帽

  1. 禮帽運算

原圖像與“開運算“的結果圖之差,如下式計算:

OpenCV 禮帽和黑帽

因為開運算帶來的結果是放大了裂縫或者局部低亮度的區域,是以,從原圖中減去開運算後的圖,得到的效果圖突出了比原圖輪廓周圍的區域更明亮的區域,且這一操作和選擇的核的大小相關。

禮帽運算用來分離比鄰近點亮一些的斑塊。當一幅圖像具有大幅的背景的時候,而微小物品比較有規律的情況下,可以使用頂帽運算進行背景提取。

  1. 黑帽運算

為”閉運算“的結果圖與原圖像之差。數學表達式為:

OpenCV 禮帽和黑帽

黑帽運算後的效果圖突出了比原圖輪廓周圍的區域更暗的區域,且這一操作和選擇的核的大小相關。

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()      

繼續閱讀