import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
# 设置兼容中文
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
D:\Anaconda\AZWZ\lib\site-packages\numpy\_distributor_init.py:30: UserWarning: loaded more than 1 DLL from .libs:
D:\Anaconda\AZWZ\lib\site-packages\numpy\.libs\libopenblas.NOIJJG62EMASZI6NYURL6JBKM4EVBGM7.gfortran-win_amd64.dll
D:\Anaconda\AZWZ\lib\site-packages\numpy\.libs\libopenblas.WCDJNK7YVMPZQ2ME2ZZHJJRJ3JIKNDB7.gfortran-win_amd64.dll
warnings.warn("loaded more than 1 DLL from .libs:\n%s" %
rain = cv.imread('img/rain.jpg')[:500,:500,:]
view = cv.imread('img/view.jpg')
letter = cv.imread('img/letter.png')
plt.figure()
plt.subplot(1,3,1)
m1 = plt.imshow(rain[:,:,::-1])
plt.title('rain.jpg')
plt.subplot(1,3,2)
m2 = plt.imshow(view[:,:,::-1])
plt.title('view.jpg')
plt.subplot(1,3,3)
m2 = plt.imshow(letter[:,:,::-1])
plt.title('letter.jpg')
Text(0.5, 1.0, 'letter.jpg')
1.腐蚀与膨胀
# 创建核结构 5*5
kenel = np.ones((5,5),np.uint8)
kenel
array([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]], dtype=uint8)
# 腐蚀
img1 = cv.erode(letter,kenel)
# 膨胀
img2 = cv.dilate(letter,kenel)
plt.figure()
plt.subplot(1,3,1)
m1 = plt.imshow(letter[:,:,::-1])
plt.title('原图')
plt.subplot(1,3,2)
m2 = plt.imshow(img1[:,:,::-1])
plt.title('腐蚀')
plt.subplot(1,3,3)
m3 = plt.imshow(img2[:,:,::-1])
plt.title('膨胀')
Text(0.5, 1.0, '膨胀')
2.开闭运算
letter_open = cv.imread('img/letter_open.png')
letter_close = cv.imread('img/letter_close.png')
# 核结构
kenel = np.ones((10,10),np.uint8)
kenel
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], dtype=uint8)
# 开运算 先腐蚀再膨胀 消除主要图像外面的噪点
cv_open = cv.morphologyEx(letter_open,cv.MORPH_OPEN,kenel)
plt.figure()
plt.subplot(1,2,1)
m1 = plt.imshow(letter_open[:,:,::-1])
plt.title('原图')
plt.subplot(1,2,2)
m2 = plt.imshow(cv_open[:,:,::-1])
plt.title('开运算后')
Text(0.5, 1.0, '开运算后')
# 闭运算 先膨胀再腐蚀 消除主要图像内部的噪点
cv_close = cv.morphologyEx(letter_close,cv.MORPH_CLOSE,kenel)
plt.figure()
plt.subplot(1,2,1)
m1 = plt.imshow(letter_close[:,:,::-1])
plt.title('原图')
plt.subplot(1,2,2)
m2 = plt.imshow(cv_close[:,:,::-1])
plt.title('闭运算后')
Text(0.5, 1.0, '闭运算后')
3.礼帽和黑帽运算
# 核结构
kenel = np.ones((10,10),np.uint8)
kenel
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], dtype=uint8)
# 礼帽 原图减去开运算结果图 作用是突出较亮的部分
top = cv.morphologyEx(letter_open,cv.MORPH_TOPHAT,kenel)
# 可视化
plt.figure()
plt.subplot(1,2,1)
m1 = plt.imshow(letter_open[:,:,::-1])
plt.title('原图')
plt.subplot(1,2,2)
m2 = plt.imshow(top[:,:,::-1])
plt.title('礼帽后')
Text(0.5, 1.0, '礼帽后')
# 黑帽 闭运算结果图减去原图 作用是突出较暗的部分
black = cv.morphologyEx(letter_close,cv.MORPH_BLACKHAT,kenel)
# 可视化
plt.figure()
plt.subplot(1,2,1)
m1 = plt.imshow(letter_close[:,:,::-1])
plt.title('原图')
plt.subplot(1,2,2)
m2 = plt.imshow(black[:,:,::-1])
plt.title('黑帽后')
Text(0.5, 1.0, '黑帽后')