形态学:是分析几何形状和结构的数学方法,它建立在集合代数的基础上,是用集合论方法定量描述目标几何结构的学科
图像处理中的运用:
(1).去除干扰噪声
(2).边界提取
(3).目标定位
(4).区域填充
图像腐蚀:表示用某种“探针”(即某种形状的基元或结构元素)对一个图像进行探测,以便找出在图像内部可以放下该基元的区域
几何A被集合B腐蚀,表现为A B,数学形式为:
A B = {x:B+xA}
opencv自带函数代码实现:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取原始图像
imgGray = cv2.imread(r"D:\picture\pic01.jpg", flags=0) # flags=0 读取为灰度图像
ret, imgBin = cv2.threshold(imgGray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) # 二值化处理
# 图像腐蚀
kernel = np.ones((3,3), dtype=np.uint8) # 生成盒式卷积核; (3, 3):卷积核的尺寸
imgErode = cv2.erode(imgBin, kernel=kernel) # 腐蚀图像
plt.subplot(1,2,1),plt.imshow(imgBin),plt.titlt('Origin')
plt.subplot(1,2,2),plt.imshow(imgErode),plt.title('erode KSize=(3,3)')
函数实现:
def Erode(img):
h,w = img.shape
out = img.copy()
kernel = np.array(((0,1,0),(1,0,1),(0,1,0)),dtype=np.int)
for i in range(1):
tmp = np.pad(out,(1,1),'edge')
for y in range(1,h):
for x in range(1,w):
if np.sum(kernel*tmp[y-1:y+2,x-1:x+2]) < 255*4:
out[y,x] = 0
return out
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
img = cv.imread(r"D:\picture\pic01.jpg",flags = 0)
ret, imgBin = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) # 二值化处理
erode_img = Erode(imgBin)
cv.imshow(erode_img)
cv.waitKey(0)
图像膨胀:膨胀 类似与 ' 领域扩张 ' ,将图像的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大,求局部最大值的操作,将 1 值扩充到邻近像素,从而扩大白色值范围、压缩黑色值范围。
几何A被集合B膨胀,表现为A B,数学形式为:
A B= {x:(B+x)A}
A B表示将B平移后仍然击中A的所有点x组成的集合。
opencv自带函数实现:
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
# 读取原始图像
imgGray = cv2.imread(r"D:\picture\pic01.jpg", flags=0) # flags=0 读取为灰度图像
ret, imgBin = cv2.threshold(imgGray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) # 二值化处理
# 图像膨胀
kSize = (3, 3) # 卷积核的尺寸,可以改变(5,5),(7,7)...
kernel = np.ones(kSize, dtype=np.uint8) # 生成盒式卷积核
imgDilate = cv2.dilate(imgBin, kernel=kernel) # 膨胀图像
plt.subplot(1,2,1),plt.imshow(imgBin),plt.titlt('Origin')
plt.subplot(1,2,2),plt.imshow(imgDilate),plt.title('dilate KSize=(3,3)')
函数实现:
def Expand(img):
h,w = img.shape
kernel = np.array(((0,1,0),(1,0,1),(0,1,0)),dtype=np.int)
out = img.copy()
for i in range(1):
tmp = np.pad(out,(1,1),'edge')
for y in range(1,h):
for x in range(1,w):
if np.sum(kernel*tmp[y-1:y+2,x-1:x+2]) >= 255:
out[y,x] = 255
return out
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
img = cv.imread(r"D:\picture\pic01.jpg",flags = 0)
ret, imgBin = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) # 二值化处理
expand_img = Expand(imgBin)
cv.imshow(expand_img)
cv.waitKey(0)