python形态学处理(腐蚀,膨胀,开运算和闭运算等)

python形态学处理(腐蚀,膨胀,开运算和闭运算等),第1张

python形态学处理(腐蚀膨胀,开运算和闭运算等)

图像的膨胀(dilation)和腐蚀(erosion)是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域.
  其中膨胀类似与 ‘领域扩张’ ,将图像的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大.
  腐蚀类似 ‘领域被蚕食’ ,将图像中的高亮区域或白色部分进行缩减细化,其运行结果图比原图的高亮区域更小.

图像腐蚀:


  让位于图像圆点的结构元素S在Z平面上移动,如果S的圆点移动到z点时,S能够完全的包含于A中,则认为这样的z点构成的集合是S对A的腐蚀图像。
  下图左侧是原图X,B是结构元素,右图是腐蚀的结果。
腐蚀的方法是,拿B的中心点和X上的点一个一个地对比,如果B上的所有点都在X的范围内,则该点保留,否则将该点去掉;右边是腐蚀后的结果。可以看出,它仍在原来X的范围内,且比X包含的点要少,就象X被腐蚀掉了一层。图像腐蚀类似于“领域被蚕食”,将图像中的高亮区域或白色部分进行缩减细化,其运行结果图比原图的高亮区域更小。


opencv 参数含义:
MORPH_RECT: 产生矩形的结构元
MORPH_ELLIPSEM: 产生椭圆形的结构元
MORPH_CROSS: 产生十字交叉形的结构元

test.tif图像:
这里图像原本就是灰度图像。

#实验九,图像腐蚀
import cv2
import matplotlib.pyplot as plt
I = cv2.imread('test.tif')
# 创建矩形结构元
s = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
# 腐蚀图像,迭代次数采用默认值1
r = cv2.erode(I, s)
# 边界提取
e = I - r
# 显示原图和腐蚀后的结果
plt.figure()
plt.imshow(I)
plt.show()
plt.figure()
plt.imshow(r)
plt.show()
plt.figure()
plt.imshow(e)
plt.show()

图像膨胀:

1、原理
所谓的图片的膨胀处理,其实就是在图像的边缘添加像素值,使得整体的像素值扩张,进而达到图像的膨胀效果,也可以说是信号与系统书中所提到的像素插值处理。
对Z2上元素集合A和结构体元素S,使用S对A进行腐蚀,记作:
                   A⊕S={z|(S)z ∩ A ≠ Ø}

让位于图像圆点的结构元素S在Z平面上移动,如果S的圆点移动到z点时,S与A有公共的交集(非空集),则认为这样的z点构成的集合是S对A的膨胀图像。
下图左侧是原图X,B是结构元素,右图是膨胀的结果。膨胀的方法是,拿B的中心点和X上的点一个一个地对比,如果B上至少有一个点在X的范围内,则该点为前景有效点;右边是膨胀后的结果。可以看出,膨胀后的图比原图点数多,就象X被膨胀增加了一层。

#实验九,图像膨胀
import cv2
import matplotlib.pyplot as plt
I = cv2.imread('test.tif')
# 显示原图
cv2.imshow('origin', I)
# 结构元半径
r = 1
MAX_R = 20
# 显示膨胀效果的窗口
cv2.namedWindow('dilate', 1)
def nothing(*args):
    pass
# 调整结构元半径
cv2.createTrackbar('r', 'dilate', r, MAX_R, nothing)
while True:
    # 得到当前的r值
    r = cv2.getTrackbarPos('r', 'dilate')
    # 创建结构元
    s = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2*r+1, 2*r+1))
    # 膨胀图像
    d = cv2.dilate(I, s)
    # 显示膨胀效果
    cv2.imshow('dilate', d)
    ch = cv2.waitKey(5)
    # 按esc退出循环
    if ch == 27:
        break
cv2.destroyAllWindows()

开运算和闭运算

cv2.morphologyEx(src, op, element[, dst[, anchor[, iterations[, borderType[, borderValue ]]]]])

src输入矩阵op形态学处理的各种运算,值的设置如下:
MORPH_OPEN:开运算
MORPH_CLOSE:闭运算
MORPH_GRADIENT:形态梯度
MORPH_TOPHAT:顶帽运算
MORPH_BLACKHAT:底帽运算elememt结构元anchor结构元的锚点iterations迭代次数

开运算:先腐蚀后膨胀

#实验九,开运算
import cv2 as cv

src = cv.imread('test.tif')
# 结构元初始半径,最大半径
r, MAX_R = 0, 20
# 初始迭代次数,最大迭代次数
i, MAX_I = 0, 20
# 创建窗口
cv.namedWindow('morphology')
# 设置回调函数
def nothing(*args):
    pass
# 创建滑动条,分别为半径和迭代次数
cv.createTrackbar('r', 'morphology', r, MAX_R, nothing)
cv.createTrackbar('i', 'morphology', i, MAX_I, nothing)

while True:
    # 得到进度条上当前的r值
    r = cv.getTrackbarPos('r', 'morphology')
    # 得到进度条上当前的i值
    i = cv.getTrackbarPos('i', 'morphology')
    # 创建结构元
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (2 * r + 1, 2 * r + 1))
    # 形态学处理:开运算
    result = cv.morphologyEx(src, cv.MORPH_OPEN, kernel, iterations=i)
    # 显示效果
    cv.imshow('morphology', result)
    # 按Esc退出
    ch = cv.waitKey(5)
    if ch == 27:
        break
cv.destroyAllWindows()

闭运算:先膨胀后腐蚀

#实验九,闭运算
import cv2 as cv
src = cv.imread('test.tif')
# 结构元初始半径,最大半径
r, MAX_R = 0, 20
# 初始迭代次数,最大迭代次数
i, MAX_I = 0, 20
# 创建窗口
cv.namedWindow('morphology')
# 设置回调函数
def nothing(*args):
    pass
# 创建滑动条,分别为半径和迭代次数
cv.createTrackbar('r', 'morphology', r, MAX_R, nothing)
cv.createTrackbar('i', 'morphology', i, MAX_I, nothing)
while True:
    # 得到进度条上当前的r值
    r = cv.getTrackbarPos('r', 'morphology')
    # 得到进度条上当前的i值
    i = cv.getTrackbarPos('i', 'morphology')
    # 创建结构元
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (2 * r + 1, 2 * r + 1))
    # 形态学处理:闭运算
    result = cv.morphologyEx(src, cv.MORPH_CLOSE, kernel, iterations=i)
    # 显示效果
    cv.imshow('morphology', result)
    # 按Esc退出
    ch = cv.waitKey(5)
    if ch == 27:
        break
cv.destroyAllWindows()

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5625398.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存