【OpenCV】11 形态学操作

二值化

将图像的每个像素变成2种值,如0,255

image

import cv2
import numpy as np


cat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)

# THRESH_BINARY_INV 取反
ret, dst = cv2.threshold(cat_gray, 100, 255, cv2.THRESH_BINARY)

cv2.imshow('cat', cat)
cv2.imshow('cat_gray', cat_gray)
cv2.imshow('dst', dst)

cv2.waitKey(0)

thresholdType

image

自适应阈值二值化

由于光照不均匀以及阴影的存在,只有一个阈值会使得在阴影处的白色被二值化为黑色。

image

import cv2
import numpy as np


cat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)


dst = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 0)

cv2.imshow('cat', cat)
cv2.imshow('cat_gray', cat_gray)
cv2.imshow('dst', dst)

cv2.waitKey(0)

腐蚀 erode

image
一般使用全1卷积核
image

import cv2
import numpy as np


cat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 0)

kernel = np.ones((3, 3), np.uint8)
dst = cv2.erode(cat_binary, kernel, iterations=1)


cv2.imshow('cat', cat)
cv2.imshow('cat_gray', cat_binary)
cv2.imshow('dst', dst)

cv2.waitKey(0)

获得形态学卷积核 getStructuringElement

  • MORPH_RECT
  • MORPH_ELLIPSE
  • MORPH_CROSS
import cv2
import numpy as np


cat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 0)

# kernel = np.ones((3, 3), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (7, 7))
print(kernel)
dst = cv2.erode(cat_binary, kernel, iterations=1)


cv2.imshow('cat', cat)
cv2.imshow('cat_gray', cat_binary)
cv2.imshow('dst', dst)

cv2.waitKey(0)

膨胀 dilate

image

import cv2
import numpy as np


cat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 0)

kernel = np.ones((3, 3), np.uint8)
# kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (7, 7))
print(kernel)
dst = cv2.dilate(cat_binary, kernel, iterations=1)


cv2.imshow('cat', cat)
cv2.imshow('cat_gray', cat_binary)
cv2.imshow('dst', dst)

cv2.waitKey(0)

开运算 = 腐蚀 + 膨胀

消除噪点

image

import cv2
import numpy as np


cat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 0)

# kernel = np.ones((3, 3), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
print(kernel)

dst = cv2.morphologyEx(cat_binary, cv2.MORPH_OPEN, kernel)

cv2.imshow('cat', cat)
cv2.imshow('cat_gray', cat_binary)
cv2.imshow('dst', dst)

cv2.waitKey(0)

闭运算 = 膨胀 + 腐蚀

image

import cv2
import numpy as np


cat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 0)

# kernel = np.ones((3, 3), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
print(kernel)

dst = cv2.morphologyEx(cat_binary, cv2.MORPH_CLOSE, kernel)

cv2.imshow('cat', cat)
cv2.imshow('cat_gray', cat_binary)
cv2.imshow('dst', dst)

cv2.waitKey(0)

形态学梯度 = 原图 - 腐蚀

计算边缘

import cv2
import numpy as np


cat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 3, 0)

# kernel = np.ones((3, 3), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
print(kernel)

dst = cv2.morphologyEx(cat_binary, cv2.MORPH_GRADIENT, kernel)

cv2.imshow('cat', cat)
cv2.imshow('cat_binary', cat_binary)
cv2.imshow('dst', dst)

cv2.waitKey(0)

顶帽运算 = 原图 - 开运算

只保留大块外小噪点

image

import cv2
import numpy as np


cat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 3, 0)

# kernel = np.ones((3, 3), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
print(kernel)

dst = cv2.morphologyEx(cat_binary, cv2.MORPH_TOPHAT, kernel)

cv2.imshow('cat', cat)
cv2.imshow('cat_binary', cat_binary)
cv2.imshow('dst', dst)

cv2.waitKey(0)

黑帽运算 = 原图 - 闭运算

保留大块中的小噪点
image

import cv2
import numpy as np


cat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 3, 0)

# kernel = np.ones((3, 3), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
print(kernel)

dst = cv2.morphologyEx(cat_binary, cv2.MORPH_BLACKHAT, kernel)

cv2.imshow('cat', cat)
cv2.imshow('cat_binary', cat_binary)
cv2.imshow('dst', dst)

cv2.waitKey(0)
posted @ 2025-09-23 09:28  苦涩如影相随固  阅读(43)  评论(0)    收藏  举报