《数字图像处理-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 pltif __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 + 1element = 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 = 42sumSurf = np.zeros(maxSize)deltaSum = np.zeros(maxSize)for r in range(5, maxSize):size = r * 2 + 1element = 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()

运行结果:

基于形态学算法进行不同半径的粒度筛分如图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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/681830.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android的常用Drawable讲解

今天来讲讲Android开发中水都绕不开的东西----drawable。最常使用的莫过于通过XML所声明的Drawable作为View背景,通过代码创建的应用场景则较少。其有着使用简单,比自定义view的成本要低的特点。同时,非图片类型的drawable占用空间较小&#…

【教程】Kotlin语言学习笔记(一)——认识Kotlin(持续更新)

写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 文章目录 【Kotlin语言学习】系列文章一、Kotlin介绍二、学习路径 一、…

Leetcode 1035 不相交的线

题意理解: 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足满足: nums1[i] nums2[j]且绘制的直线不与任何其他连线&#xff…

面向对象2:继承

目录 2.1继承 2.2 继承的好处 2.3 权限修饰符 2.4 单继承、Object 2.5 方法重写 2.6 子类中访问成员的特点 2.7 子类中访问构造器的特点 面向对象1:静态 2.1继承 向对象编程之所以能够能够被广大开发者认可,有一个非常重要的原因,是…

1921:【02NOIP普及组】过河卒

1921:【02NOIP普及组】过河卒 【题目描述】 如图,A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。 同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有…

联合体与枚举

联合体与枚举 联合体枚举问题 联合体 联合体也是由一个或多个成员构成的数据类型,它最大的特点是只为最大的一个成员开辟空间,其他成员共用这个空间,这个东西也叫共用体!!! union Un {char c;int i; };int main() {union Un un { 0 };un.c 0x01;//先为最大的成员开辟空间un.…

开源免费的Linux服务器管理面板分享

开源免费的Linux服务器管理面板分享 一、1Panel1.1 1Panel 简介1.2 1Panel特点1.3 1Panel面板首页1.4 1Panel使用体验 二、webmin2.1 webmin简介2.2 webmin特点2.3 webmin首页2.4 webmin使用体验 三、Cockpit3.1 Cockpit简介3.2 Cockpit特点3.3 Cockpit首页3.4 Cockpit使用体验…

C++ //练习 6.10 编写一个函数,使用指针形参交换两个整数的值。在代码中调用该函数并输出交换后的结果,以此验证函数的正确性。

C Primer(第5版) 练习 6.10 练习 6.10 编写一个函数,使用指针形参交换两个整数的值。在代码中调用该函数并输出交换后的结果,以此验证函数的正确性。 环境:Linux Ubuntu(云服务器) 工具&…

酒店押金预授权怎么开通?微信酒店押金+房态+门锁关联 +电子押金单 解决方案

一、酒店押金管理有哪些? 1.渠道有银行预授权 2.微信押金支付 3.酒店押金系统 4.支付押金管理 二、银行预授权模式 酒店押金预授权通常是在客人办理入住时进行的,酒店会要求客人提供信用卡或借记卡的卡号、有效期、持卡人姓名等信息,然后…

第3讲 小程序TabBar搭建

tabBar,底部三个tab,对应三个页面,创建投票,关于锋哥,我的。 新建三个页面 pages.json 页面定义 "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/col…

蓝桥杯嵌入式第11届真题(完成) STM32G431

蓝桥杯嵌入式第11届真题(完成) STM32G431 题目 代码 程序和之前的大同小异,不过多解释 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief :…

AtCoder Beginner Contest 340 C - Divide and Divide【打表推公式】

原题链接:https://atcoder.jp/contests/abc340/tasks/abc340_c Time Limit: 2 sec / Memory Limit: 1024 MB Score: 300 points 问题陈述 黑板上写着一个整数 N。 高桥将重复下面的一系列操作,直到所有不小于2的整数都从黑板上移除: 选择…

二、DataX安装

DataX安装 一、简介二、系统要求三、部署 一、简介 官方地址:https://github.com/alibaba/DataX/blob/master/userGuid.md 二、系统要求 LinuxJDK(1.8以上,推荐1.8) Centos7.9的java1.8安装命令:yum install java-1.8.0-openjdk.x86_64 Py…

Git分支和迭代流程

Git分支 feature分支:功能分支 dev分支:开发分支 test分支:测试分支 master分支:生产环境分支 hotfix分支:bug修复分支。从master拉取,修复并测试完成merge回master和dev。 某些团队可能还会有 reale…

孙悟空吃蟠桃 - 华为OD统一考试

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C 题目描述 孙悟空爱吃蟠桃,有一天趁着蟠桃园守卫不在来偷吃。已知蟠桃园有 N 棵蟠桃树,每棵树上都桃子,守卫将在 H 小时后回来。 孙悟空…

华为数通方向HCIP-DataCom H12-821题库(单选题:441-460)

第441题 下面是一台路由输出的信息,关于这段信息描述正确的是 <R1>display bgp peerBGP local router ID : 2.2.2.2Local AS number : 100Total number of peers : 2 Peers in established state : 0Peer V AS MsgRcvd MsgSent OutQ Up/Down …

Java:什么是向上转型与向下转型(详细图解)

目录 一、什么是向上转型 1、概念 2、代码示例 3、向上转型的优缺点 二、什么是向下转型 1、向下转型的概念 ​编辑 2、代码示例 三、向下转型的缺点及 instanceof 的使用 1、向下转型的缺点 2、instanceof的使用 一、什么是向上转型 1、概念 向上转型就是创建一个…

Java并发基础:PriorityBlockingQueue全面解析!

内容概要 PriorityBlockingQueue类能高效处理优先级任务&#xff0c;确保高优先级任务优先执行&#xff0c;它内部基于优先级堆实现&#xff0c;保证了元素的有序性&#xff0c;同时&#xff0c;作为BlockingQueue接口的实现&#xff0c;它提供了线程安全的队列操作&#xff0…

C/C++内存管理:new、delete功能及原理实现

目录 一、C/C内存分布 二、C中内存管理方式 2.1new/delete操作内置类型 2.2 new和delete操作自定义类型 三、operator new与operator delete函数 四、new和delete的实现原理 4.1内置类型 4.2自定义类型 五、定位new 一、C/C内存分布 int globalVar 1; static int sta…

阅读 - 搭建博客

搭建博客的几种方式 1. 使用在线的博客系统&#xff0c;如语雀、掘金、CSDN等。 优点&#xff1a;直接创建账号使用即可&#xff0c;简单方便&#xff0c;不需要维护 缺点&#xff1a;文章分散在各个平台&#xff0c;不易于管理 2. github pages hugo、hexo等静态博客系统…