数字图像处理-形态学图像处理

news2024/11/30 14:35:17

形态学图像处理

  • 一、基础知识
    • 1.1 什么是形态学操作
  • 二、腐蚀与膨胀
    • 2.1 腐蚀
    • 2.2 膨胀
  • 三、开操作与闭操作
    • 3.1 开操作
    • 3.2 闭操作
    • 3.3 实验对比
  • 四、一些基本的形态学算法
    • 4.1边界提取
    • 4.2空洞填充
    • 4.3 凸壳

一、基础知识

1.1 什么是形态学操作

数字图像处理中的形态学操作是一组用于处理二值图像(通常是黑白图像)的数学操作,旨在改变图像中物体的形状和结构。形态学操作通常用于图像分割、去噪、特征提取和形状分析等应用中。

二、腐蚀与膨胀

设有两幅图象B,X。若X是被处理的对象,而B是用来处理X的,则称B为结构元素(structure element),又被形象地称做刷子。结构元素通常都是一些比较小的图象。

2.1 腐蚀

腐蚀操作用于减小图像中物体的大小。它将一个结构元素与原始图像卷积,使物体边缘逐渐减小,可以用于去除小噪点或分离邻近物体。

import cv2
import numpy as np 
import matplotlib.pyplot as plt

# 将图片转成二值图像
def img2binary_img(img):
    param = 177
    binary_img = np.ones(img.shape[0:2])
    binary_img[img<177] = 0
    return binary_img
# 执行腐蚀操作
def img_erode(binary, kernel_size):
    #可以修改卷积核大小来增加腐蚀效果,越大腐蚀越强
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(kernel_size,kernel_size))
    dst = cv2.erode(binary,kernel)
    return dst
img = cv2.imread("img/image.jpg",0)
binary_img = img2binary_img(img)
erode_img_5 = img_erode(binary_img, 5)
erode_img_7 = img_erode(binary_img, 7)
erode_img_9 = img_erode(binary_img, 9)

在这里插入图片描述
通过设定不同的滤波器大小,可以发现滤波器尺寸越大,图片中的白色区域越小,反之亦然。

2.2 膨胀

膨胀操作用于增加图像中物体的大小。它将一个结构元素(通常是一个小的二值图像或核)与原始图像进行卷积操作,将物体边缘扩张,增加其面积。该过程可以看做是腐蚀的逆操作。

# 将图片转成二值图像
def img2binary_img(img):
    param = 177
    binary_img = np.ones(img.shape[0:2])
    binary_img[img<177] = 0
    return binary_img
# 执行膨胀操作
def img_dilate(binary, kernel_size):
    #可以修改卷积核大小来增加膨胀效果,越大膨胀越强
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(kernel_size,kernel_size))
    dst = cv2.dilate(binary,kernel)
    return dst
img = cv2.imread('img/image.jpg',0)
binary_img = img2binary_img(img)
erode_img_5 = img_dilate(binary_img, 5)
erode_img_7 = img_dilate(binary_img, 7)
erode_img_9 = img_dilate(binary_img, 9)

在这里插入图片描述
可以发现卷积核越大,图像的白色区域越大。腐蚀可以去除图像中的噪声,但是会导致图片变小对于腐蚀后的图像进行膨胀处理可以在去除噪声的同时保持原有形状。

三、开操作与闭操作

开操作闭操作简称开闭运算,即开操作=开运算;闭操作=闭运算。说白了就是打腐蚀和膨胀的组合拳。 为什么有了膨胀、腐蚀还要开运算闭运算呢? 其实开闭运算最重要的一点就是,可以保持物体原有大小。然后一个是消除物体外部噪声(开运算)的另一个是增强物体之间连接点(闭运算)的。

3.1 开操作

开运算=腐蚀+膨胀
在这里插入图片描述

3.2 闭操作

闭运算 = 膨胀+腐蚀
在这里插入图片描述

3.3 实验对比

在这里插入图片描述

def img2binary_img(img):
    param = 177
    binary_img = np.ones(img.shape[0:2])
    binary_img[img<177] = 0
    return binary_img
img = cv2.imread('img/morph_close.png',0)
binary_img = img2binary_img(img)
kernel = np.ones((5,5),np.uint8)
open_img = cv2.morphologyEx(binary_img, cv2.MORPH_OPEN, kernel)
close_img = cv2.morphologyEx(binary_img, cv2.MORPH_CLOSE, kernel) 

根据实验结果可以看出来开运算对于孤立的小点,毛刺等现象,整体形状与位置不会发生太大的变化。而闭运算可以填充小裂缝。

四、一些基本的形态学算法

当处理二值图像时,形态学的主要应用是提取表示和描述形状的有用成分。特别是用形态学方法提取某一区域边界线,连接成分,骨骼,凸壳的算法是十分有效的。此外,区域填充,细化,加粗,裁剪等处理方法也经常与上述算法相结合在预处理和后处理中使用。

4.1边界提取

与边缘检测类似,可以使用canny等边缘检测算法实现:
在这里插入图片描述

img = cv2.imread("img/image.jpg",0)
blurred = cv2.GaussianBlur(img,(11,11),0)
gaussImg = cv2.Canny(blurred, 10, 70)

4.2空洞填充

使用空洞填充,可以对图像进行填充。使用函数为泛洪函数。原型为:cv2.floodFill(img, mask, seed, newvalue(BGR), (loDiff1, loDiff2, loDiff3), (upDiff1, upDiff2, upDiff3), flag)

  • img:为待使用泛洪算法的图像
  • mask:为掩码层,使用掩码可以规定是在哪个区域使用该算法,如果是对于完整图像都要使用,则掩码层大小为原图行数+2,列数+2.是一个二维的0矩阵,边缘一圈会在使用算法是置为1。而只有对于掩码层上对应为0的位置才能泛洪,所以掩码层初始化为0矩阵。【dtype:np.uint8】
  • seed:为泛洪算法的种子点,也是根据该点的像素判断决定和其相近颜色的像素点,是否被泛洪处理。
  • newvalue:是对于泛洪区域新赋的值(B,G,R)
  • (loDiff1,loDiff2,loDiff3):是相对于seed种子点像素可以往下的像素值,即seed(B0,G0,R0),泛洪区域下界为(B0-loDiff1,G0-loDiff2,R0-loDiff3)
  • (upDiff1,upDiff2,upDiff3):是相对于seed种子点像素可以往上的像素值,即seed(B0,G0,R0),泛洪区域上界为(B0+upDiff1,G0+upDiff2,R0+upDiff3)
  • flag:为泛洪算法的处理模式。
    如下图所示使用泛洪函数简单对彩色图像进行填充:
    在这里插入图片描述
img = cv2.imread("img/image.jpg")
img = img[:, :, [2, 1, 0]]
im_floodfill = img.copy()
h, w = img.shape[:2]
mask = np.zeros((h+2, w+2), np.uint8)
cv2.floodFill(im_floodfill, mask, (220, 250), (0, 255, 255), (100, 100, 100), (50, 50 ,50), cv2.FLOODFILL_FIXED_RANGE)

4.3 凸壳

凸壳是一个包含给定点集中所有点的最小凸多边形或多面体。这个凸多边形或多面体的特点是,任何两点都在它的内部或边界上,而不在外部。
在这里插入图片描述

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

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

相关文章

PY32F003F18串口printf功能

1、PY32F003F18复用功能总结&#xff1a; //GPIOxGPIOA,PinGPIO_PIN_0,alternateGPIO_AF9_USART2,则将PA0引脚复用为USART2_TX //GPIOxGPIOA,PinGPIO_PIN_0,alternateGPIO_AF10_SPI1,则将PA0引脚复用为SPI1_MISO //GPIOxGPIOA,PinGPIO_PIN_1,alternateGPIO_AF0_SPI1,则将PA1引…

容器编排学习(六)服务管理与用户权限管理

一 service管理 1 概述 容器化带来的问题 自动调度&#xff1a;在 Pod 创建之前&#xff0c;用户无法预知 Pod 所在的节点&#xff0c;以及 Pod的IP 地址一个已经存在的 Pod 在运行过程中&#xff0c;如果出现故障&#xff0c;Pod也会在新的节点使用新的IP 进行部署应用程…

安达发APS|APS智能排程软件的核心优势

APS软件是一种实时、具有约束能力的排产计划软件&#xff0c;能够对所有资源进行同步优化。它能够模拟生产中的物料、机器设备、人员、供应、客户需求、运输等影响计划的因素&#xff0c;不论是长期的或短期的计划&#xff0c;都具有优化、对比和可执行性。 APS软件采用基于内…

蓝桥杯官网填空题(土地测量)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 造成高房价的原因有许多&#xff0c;比如土地出让价格。既然地价高&#xff0c;土地的面积必须仔细计算。遗憾的是&#xff0c;有些地块的形状不规则&#xff0c;比…

echarts条形图实现颜色渐变

eCharts——柱状图中的柱体颜色渐变_echarts 柱状图渐变_小美同学的博客-CSDN博客 【Echarts】柱状图渐变两种实现方式_echarts柱状图渐变_芳草萋萋鹦鹉洲哦的博客-CSDN博客

C++中的stack和queue

文章目录 1. stack的介绍和使用1.1 stack的介绍1.2 stack的使用 2. queue的介绍和使用2.1 queue的介绍2.2 queue的使用 3 priority_queue的介绍和使用3.1 priority_queue的介绍3.2 priority_queue的使用 4. 容器适配器4.1 什么是适配器4.2 STL标准库中stack和queue的底层结构4.…

Vue3学习(仅为了记录,参考意义不大)

一.Vue3介绍 1.Vue3的优势 2.使用create-vue创建vue3项目 vue-cli是创建vue2.0的脚手架工具&#xff0c;create-vue是创建vue3的脚手架工具&#xff0c;create-vue构建速度非常快 3.vue3项目目录和关键文件 二.Vue3组合式API 1.setup选项 setup语法糖&#xff1a; 总结…

fastjson漏洞批量检测工具

JsonExp 简介 版本&#xff1a;1.3.5 1. 根据现有payload&#xff0c;检测目标是否存在fastjson或jackson漏洞&#xff08;工具仅用于检测漏洞&#xff09;2. 若存在漏洞&#xff0c;可根据对应payload进行后渗透利用3. 若出现新的漏洞时&#xff0c;可将最新的payload新增至…

湖北初级(助理)、中级、高级(副高)工程类职称申报条件和业绩要求有哪些?

湖北初级、中级、副高职称申报学历条件和业绩要求是什么&#xff1f;有哪些要求&#xff1f;以下来自于官方解答&#xff1a; 副高职称学历要求&#xff1a; 中级职称学历要求&#xff1a; 助理&#xff08;初级&#xff09;职称学历要求&#xff1a; 现在评职称&#xff0c;主…

十七、MySQL约束演示

1、约束定义 &#xff08;1&#xff09;概念 约束&#xff0c;顾名思义&#xff0c;时作用域表中字段上的规则&#xff0c;用于限制存储在表中的数据&#xff0c;主要用于保证数据库中数据的正确、有效性和完整性。 &#xff08;2&#xff09;各种约束分类 1、非空约束(限制…

Win11透明任务栏失效怎么办

近期有小伙伴反映在更新Win11最新版本之后&#xff0c;发现透明任务栏失效了&#xff0c;这是怎么回事呢&#xff0c;遇到这种情况应该怎么解决呢&#xff0c;这里小编就给大家介绍几个Win11透明任务栏失效的解决方法&#xff0c;有需要的小伙伴快来看一看吧。 软件资源&#…

【全网严谨版】L1-016 查验身份证 (C++解法 整理分析了多种方法)

问题描述 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下&#xff1a; 首先对前17位数字加权求和&#xff0c;权重分配为&#xff1a;{7&#xff0c;9&#xff0c;10&#xff0c;5&#xff0c;8&#xff0c;4&#xff0c;2&#…

二、创建个人首页页面

简介 改造 App.vue 创建一个展示页面,实现一个可以轮播的功能效果。欢迎访问个人的简历网站预览效果 本章涉及修改与新增的文件:style.css、App.vue、assets 一、 自定义全局样式 将 style.css 中的文件样式内容替换为如下代码 /* 初始化样式 --------------------------…

《Java程序设计》实验报告

实验内容&#xff1a;面向对象程序设计 1、定一个名为Person的类&#xff0c;其中含有一个String类型的成员变量name和一个int类型的成员变量age&#xff0c; 分别为这两个变量定义访问方法和修改方法&#xff0c;另外再为该类定义一个名为speak的方法&#xff0c; 在其中输出n…

图书出版如何做好软文营销

在信息技术快速发展的时代&#xff0c;大部分人的阅读方式也从传统的纸媒演变为电子书阅读&#xff0c;在这种形势下&#xff0c;图书出版行业的经营模式、经营理念都面临着许多变革&#xff0c;那么在网络时代&#xff0c;图书出版行业应该如何做好软文营销呢&#xff1f;下面…

高频微观结构:日内及隔夜动量因子

本周天软因子序列课程暂时结束&#xff0c;感谢大家百忙之中参会交流&#xff01; 本次会议主要内容有&#xff1a; 1.介绍日内及隔夜动量因子的构造逻辑&#xff0c;如何选择市 场代理变量对动量因子进行改进; 2.结合因子研究平台分别分析动量因子、日内涨幅因 子、隔夜涨幅因…

【力扣每日一题】2023.9.7 修车的最少时间

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一个数值&#xff0c;数组里每个元素表示一个老师傅&#xff0c;老师傅修车花费的时间等于数值乘上车辆数的平方。 问我们修理…

【Docker】镜像的创建、管理与发布

镜像的获取 镜像可以从以下方式获得&#xff1a; 从远程镜像仓库拉取&#xff0c;可以是公有仓库&#xff0c;也可以是私有仓库从Dockerfile构建从文件导入&#xff08;离线&#xff09;从容器提交 镜像的基本操作 跟镜像相关的命令如下&#xff1a; $ docker image --help…

linux 文件属性相关

文章目录 文件存储介绍文件颜色含义软链接和硬链接 文件目录操作压缩解压 tar目录切换 cd创建目录 mkdir删除目录 rmdir rm复制文件或目录 cp移动文件或目录 mv查看指定目录下的内容 ls文本查看 cat more tail文本编辑 vim 查找查找文件 find查找文本 grep查找文件 whereis Lin…

语义分割实践思考记录(个人备忘录)

一、任务管理器、NVDIA的GPU利用率显示[1][2] 若需要在任务管理器中查看基于Pytorch框架的GPU利用率&#xff0c;那么&#xff0c;我们需要将监控面板监测内容调整为cuda。图一&#xff08;左&#xff09;即为英伟达命令行工具面板。 图一 英伟达GPU使用率监控 二、基于混淆矩阵…