• 《数字图像处理-OpenCV/Python》连载:形态学图像处理


    数字图像处理-OpenCV/Python》连载:形态学图像处理


    本书京东 优惠购书链接 https://item.jd.com/14098452.html
    本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html

    在这里插入图片描述


    第 12 章 形态学图像处理


    形态学图像处理是基于形状的图像处理,基本思想是利用各种形状的结构元进行形态学运算,从图像中提取表达和描绘区域形状的结构信息。形态学运算的数学原理是集合运算,处理对象是黑色背景的二值对象或深色背景的灰度对象。


    本章内容概要

    • 学习形态学运算的基本操作:腐蚀、膨胀及各种形态学高级运算。
    • 介绍灰度形态学运算。
    • 理解形态学结构元的意义,比较结构元对形态学运算的影响,构造自定义结构元。
    • 学习常用的形态学算法,如边界提取和线条细化。
    • 理解形态学重建的思想和原理,介绍形态学重建的应用,如边界清除、孔洞填充、骨架提取、粒径分离、粒度测定和角点检测。

    12.11 基于形态学的粒度测定

    粒度测度是指确定图像中颗粒的大小分布,属于判断图像中颗粒尺寸分布的邻域。

    由于颗粒通常并不是整齐地分隔排列的,要通过逐个颗粒识别来计算颗粒数量非常困难。基于形态学的粒度测定,原理就是对于比背景亮且形状规则的颗粒,使用逐渐增大的结构元对图像进行开运算。

    对于每次开运算得到的图像,称为表面区域。由于开运算会减小图像中的亮特征,使表面区域随结构元的增大而减小,由此得到一个一维阵列。计算一维阵列中相邻两个元素的差并绘图,曲线中的峰值代表图像中主要大小颗粒的分布。


    【例程1217】基于形态学的粒度测定

    本例程是基于形态学的粒度测定,通过使用逐渐增大的结构元对图像执行开操作。

    设置一个半径从小到大的结构元序列,依次对其做开操作,并且统计图像的总灰度值,计算相邻灰度值的差。当结构元尺寸与圆形颗粒尺寸吻合时,会产生一个局部灰度高峰。比较不同尺寸的灰度差序列,峰值所对应的尺寸就是圆形颗粒的大致尺寸。


    # 【1217】基于形态学的粒度测定
    import cv2 as cv
    import numpy as np
    from matplotlib import pyplot as plt
    
    if __name__ == '__main__':
        img = cv.imread("../images/Fig1208.png", flags=0)  # 灰度图像
        _, imgBin = cv.threshold(img, 205, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)  # 二值处理 (黑色背景)
        plt.figure(figsize=(9, 6))
        plt.subplot(231), plt.axis("off"), plt.title("Original")
        plt.imshow(img, cmap='gray')
    
        # 用不同半径圆形结构元进行开运算
        rList = [14, 21, 28, 35, 42]
        for i in range(5):
            size = rList[i] * 2 + 1
            element = cv.getStructuringElement(cv.MORPH_ELLIPSE, (size, size))  # 圆形结构元
            imgOpen = cv.morphologyEx(imgBin, cv.MORPH_OPEN, element)
            plt.subplot(2, 3, i + 2), plt.title("Opening (r={})".format(rList[i]))
            plt.imshow(cv.bitwise_not(imgOpen), cmap='gray'), plt.axis("off")
        plt.tight_layout()
        plt.show()
    
        # 计算圆形直径的半径分布
        maxSize = 42
        sumSurf = np.zeros(maxSize)
        deltaSum = np.zeros(maxSize)
        for r in range(5, maxSize):
            size = r * 2 + 1
            element = cv.getStructuringElement(cv.MORPH_ELLIPSE, (size, size))  # 圆形结构元
            imgOpen = cv.morphologyEx(img, cv.MORPH_OPEN, element)
            sumSurf[r] = np.concatenate(imgOpen).sum()
            deltaSum[r] = sumSurf[r-1] - sumSurf[r]
            print(r, sumSurf[r], deltaSum[r])
        r = range(maxSize)
        plt.figure(figsize=(6, 4))
        plt.plot(r[6:], deltaSum[6:], 'b-o')
        plt.title("Delta of surface area")
        plt.yticks([])
        plt.show()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    运行结果:

    基于形态学算法进行不同半径的粒度筛分如图12-17。不同半径的粒度分布统计图如图12-18所示。

    在这里插入图片描述
    图12-17 基于形态学算法进行不同半径的粒度筛分


    在这里插入图片描述

    图12-18 不同半径的粒度分布统计图


    程序说明:

    (1) 图12-17(1)所示为原始图像,图12-17(2)~(6)所示为使用不同直径的圆形结构元对原始图像进行腐蚀的结果。小于圆形结构元尺寸的圆形都被完全腐蚀,而大于圆形结构元尺寸的圆形得以保留。不同直径的圆形结构元,相当于不同粒径的筛子,起到了筛分作用。
    (2) 图12-18所示的横坐标是粒度半径r,纵坐标是半径r所对应的像素值。图中出现了3个明显的峰值,峰值对应的尺寸就是图中圆形颗粒的特征半径。


    版权声明:
    youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/136113194)
    Copyright 2024 youcans, XUPT
    Crated:2024-02-14

    《数字图像处理-OpenCV/Python》 独家连载专栏 : https://blog.csdn.net/youcans/category_12418787.html

  • 相关阅读:
    关于 GIN 的路由树
    我想不通,MySQL 为什么使用 B+ 树来作索引?
    滤波数据分析
    聊聊 asp.net core 认证和授权
    web安全漏洞
    发布 .NET MAUI / MAUI Blazor 应用 (1) - Windows
    【EMR】HBase替换现有底层存储hdfs为oss
    CentOS7安装部署Nacos
    服务器防火墙软件 --iptables
    v-on事件处理指令;简写@事件名
  • 原文地址:https://blog.csdn.net/youcans/article/details/136113194