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

形态学图像处理

  • 一、基础知识
    • 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 = 177binary_img = np.ones(img.shape[0:2])binary_img[img<177] = 0return 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 = 177binary_img = np.ones(img.shape[0:2])binary_img[img<177] = 0return 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 = 177binary_img = np.ones(img.shape[0:2])binary_img[img<177] = 0return 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.mzph.cn/news/71647.shtml

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

相关文章

Linux CPU线程绑核

为了加快程序的运行速度和充分利用CPU资源&#xff0c;我们可以人为将不同线程绑定在不同的cup上&#xff0c;例如有两个线程A,B&#xff0c;其中A已经在CPU0上运行&#xff0c;并且CPU0上还有其他的任务&#xff0c;那么我们可以将线程B绑到CPU1上&#xff0c;这样就可以减轻C…

链路追踪Skywalking快速入门

目录 1 Skywalking概述1.1 微服务系统监控三要素1.2 什么是链路追踪1.2.1 链路追踪1.2.2 OpenTracing1、数据模型&#xff1a;2、核心接口语义 1.3 常见APM系统1.4 Skywalking介绍1、SkyWalking 核心功能&#xff1a;2、SkyWalking 特点&#xff1a;3、Skywalking架构图&#x…

Medium: 9 Important Things to Remember for AB Test

There are lots of things that can go wrong [存在隐患] when you try to create AB tests. Goal & Motivation Making it clear helps align the team toward the goal. Hypothesis Your hypothesis should be short and to the point. It should not run into a coup…

直播平台源码开发搭建APP的DASH协议:流媒体技术其中一环

在直播平台源码APP中&#xff0c;有着许许多多、多种多样的功能&#xff0c;比如短视频功能&#xff0c;帮助我们去获取信息&#xff0c;看到全世界用户身边发生的事情或是他们的生活&#xff1b;又比如直播功能&#xff0c;为用户提供了实时的娱乐享受&#xff0c;还让一些用户…

【JavaEE基础学习打卡07】JDBC之应用分层设计浅尝!

目录 前言一、简单说说应用分层二、实体层1.O/R映射2.O/R映射实践三、数据访问层1.DAO层2.DAO层实战总结前言 📜 本系列教程适用于JavaWeb初学者、爱好者,小白白。我们的天赋并不高,可贵在努力,坚持不放弃。坚信量最终引发质变,厚积薄发。 🚀 文中白话居多,尽量以小白…

EVA: Visual Representation Fantasies from BAAI

本文做个简单总结&#xff0c;博主不是做自监督领域的&#xff0c;如果错误&#xff0c;欢迎指正。 链接 Code&#xff1a; Official&#xff1a;baaivision/EVA MMpretrain&#xff1a;open-mmlab/mmpretrain/tree/main/configs/eva02 Paper&#xff1a; EVA01&#xff1a;…

deepfm内容理解

对于CTR问题&#xff0c;被证明的最有效的提升任务表现的策略是特征组合(Feature Interaction)&#xff1b; 两个问题&#xff1a; 如何更好地学习特征组合&#xff0c;进而更加精确地描述数据的特点&#xff1b; 如何更高效的学习特征组合。 DNN局限 &#xff1a;当我们使…

vue-别名路径联想提示的配置

在根路径下&#xff0c;新建 jsconfig.json 文件&#xff0c;即可 在输入 自动联想到src目录。 代码如下&#xff1a; // 别名路径联想提示&#xff1a;输入自动联想 {"compilerOptions":{"baseUrl":"./","paths": {"/*":[…

基于github上go版本的LoraWAN Server安装及使用

一、安装环境 该版本的LoraWAN Server基于Ubuntu 20.04.6 LTS x86_x64 版本安装 当然也可以在Windows环境中进行安装使用&#xff0c;此处只针对测试使用的Linux的环境进行简要说明&#xff1b; 二、Git源码下载及安装 2.1 下载地址 Github上的下载地址如下&#xff1a;GitHub…

stable diffusion实践操作-提示词-整体环境

系列文章目录 stable diffusion实践操作-提示词 文章目录 系列文章目录前言一、提示词汇总1.1 整体环境11.2 整体环境1 二 、总结 前言 本文主要收纳总结了提示词-整体环境。 一、提示词汇总 1.1 整体环境1 画质背景场景画风镜头[最高质量][透明背景][山][轮廓加深][正面视…

从jdk8 升级到jdk17的问题总结

目录 1. java.lang.reflect.InaccessibleObjectException: 2. java.lang.UnsatisfiedLinkError in autosys 3. java.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser 4. java.lang.UnsatisfiedLinkError: **…

【AI理论学习】语言模型:从Word Embedding到ELMo

语言模型&#xff1a;从Word Embedding到ELMo ELMo原理Bi-LM总结参考资料 本文主要介绍一种建立在LSTM基础上的ELMo预训练模型。2013年的Word2Vec及2014年的GloVe的工作中&#xff0c;每个词对应一个vector&#xff0c;对于多义词无能为力。ELMo的工作对于此&#xff0c;提出了…

ChartJS使用-环境搭建(vue)

1、介绍 Chartjs简约不简单的JavaScript的图表库。官网https://chart.nodejs.cn/ Chart.js 带有内置的 TypeScript 类型&#xff0c;并与所有流行的 JavaScript 框架 兼容&#xff0c;包括 React 、Vue 、Svelte 和 Angular 。 你可以直接使用 Chart.js 或利用维护良好的封装程…

Ros noetic 机器人坐标记录运动路径和发布 实战教程(B)

前言: 网上记录Path的写入文件看了一下还挺多的,有用yaml作为载体文件,也有用csv文件的路径信息,也有用txt来记录当前生成的路径信息,载体不重要,反正都是记录的方式,本文主要按yaml的方式写入,本文将撰写csv方式的文件写入格式,完成上一篇文章中的留下的存入…

CentOS 7 编译ZooKeeper C客户端

简介 本文主要讲解&#xff1a;Zookeeper C客户端库在Centos 7上的编译&#xff0c;使用的Zookeeper版本为3.4.13。 工具安装 安装ant 和cppunit-devel工具&#xff1a; [rootlocalhost source_code]# yum install -y cppunit-devel 已加载插件&#xff1a;fastestmirror L…

【Java Web】实现帖子点赞功能——基于Redis

点赞 支持对帖子、评论点赞&#xff1b;第一次点赞&#xff0c;第二次点赞取消&#xff1b; 首页显示点赞数量 统计帖子点赞数量&#xff1b; 详情页显示点赞数量 统计点赞数量&#xff1b;显示点赞状态&#xff1b; 1. LikeService定义一些关于点赞的操作 点赞&#xff1a;…

Git上传新项目

第一步&#xff1a;初始化 Git 仓库 首先&#xff0c;打开终端或命令行界面&#xff0c;然后导航到项目目录。运行下面的命令来初始化一个新的 Git 仓库&#xff1a; git init这将创建一个新的 .git 子目录&#xff0c;其中包含了初始化的 Git 仓库。 第二步&#xff1a;添加…

使用Python 创建 AI Voice Cover

这篇文章提供了使用Python文本到语音库和音频处理库逐步创建歌曲的指南。我们一起为机器赋予声音 —— 使用Python制作AI生成的声音。 介绍 您是否曾经想过&#xff0c;如果您最喜欢的歌曲由机器人演唱会是什么样子&#xff1f;随着人工智能和语音合成的最新进展&#xff0c;现…

什么是原生IP?原生IP与住宅IP有何区别?

相信许多做跨境的都会接触到IP代理&#xff0c;比如电商平台、社媒平台、收款平台等等&#xff0c;都会检测IP。那也会经常听到一些词汇&#xff1a;原生IP、住宅IP&#xff0c;这两者之间有什么区别呢&#xff1f;什么业务需要用到呢&#xff1f;接下来带大家具体了解一下。 什…

时序预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测…