天天看點

OpenCV 腐蝕和膨脹

腐蝕和膨脹是最基本的形态學操作,腐蝕和膨脹都是針對白色部分(高亮部分)而言的。

膨脹就是使圖像中高亮部分擴張,效果圖擁有比原圖更大的高亮區域;腐蝕是原圖中的高亮區域被蠶食,效果圖擁有比原圖更小的高亮區域。膨脹是求局部最大值的操作,腐蝕是求局部最小值的操作。

  1. 腐蝕

具體操作是:用一個結構元素掃描圖像中的每一個像素,用結構元素中的每一個像素與其覆寫的像素做“與”操作,如果都為1,則該像素為1,否則為0。如下圖所示,結構A被結構B腐蝕後:

OpenCV 腐蝕和膨脹

腐蝕的作用是:消除物體邊界點,使目标縮小,可以消除小于結構元素的噪聲點。

cv.erode(img,kernel,iterations)      
  • img: 要處理的圖像
  • kernel: 核結構
  • iterations: 腐蝕的次數,預設是1
  1. 膨脹

具體操作是:用一個結構元素掃描圖像中的每一個像素,用結構元素中的每一個像素與其覆寫的像素做“與”操作,如果都為0,則該像素為0,否則為1。如下圖所示,結構A被結構B膨脹後:

OpenCV 腐蝕和膨脹
cv.dilate(img,kernel,iterations)      
  • img: 要處理的圖像
  • kernel: 核結構
  • iterations: 膨脹的次數,預設是1
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

# 1 讀取圖像
img = cv.imread("./1.png")

# 2 建立核結構
kernel = np.ones((5, 5), np.uint8)

# 3 圖像腐蝕和膨脹
erosion = cv.erode(img, kernel)  # 腐蝕
dilate = cv.dilate(img, kernel)  # 膨脹

# 4 圖像展示
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(10, 8), dpi=100)
axes[0].imshow(img[:, :, ::-1])
axes[0].set_title("原圖")
axes[1].imshow(erosion[:, :, ::-1])
axes[1].set_title("腐蝕後結果")
axes[2].imshow(dilate[:, :, ::-1])
axes[2].set_title("膨脹後結果")
plt.show()