形态学操作篇 原理公式代码齐活

news2024/11/5 0:59:33

一、腐蚀

腐蚀操作的核心原理是利用一个结构元素在图像上进行扫描,判断结构元素所覆盖的区域与前景像素的关系。如果结构元素完全被包含在前景像素区域内,那么结构元素中心对应的像素位置在腐蚀后的图像中被标记为前景像素;如果结构元素不完全被包含在前景像素区域内,那么中心像素位置被标记为背景像素。

腐蚀操作的数学表达式为:

E(A,B) = A ⊖ B = {z | (B)z ⊆ A}

其中:A 是被处理的图像,B 是结构元素,(B)z 表示 B 平移到点 z。

腐蚀操作的效果是缩小图像中的明亮区域(前景),扩大暗区域(背景)。

例如,假设有一个简单的二值图像,其中前景像素为白色(值为 1),背景像素为黑色(值为 0)。结构元素是一个 3x3 的矩阵,全为 1。当这个结构元素在图像上移动时,如果它所覆盖的 9 个像素位置全部为白色,那么在腐蚀后的图像中,对应结构元素中心位置的像素也为白色;如果结构元素覆盖的区域内有一个或多个像素为黑色,那么中心位置像素在腐蚀后的图像中被置为黑色。

二、膨胀

膨胀操作的原理是当结构元素与前景像素有交集时,将结构元素中心对应的像素标记为前景像素。

同样以二值图像为例,结构元素在图像上移动,只要结构元素覆盖的区域内有一个像素为白色,那么在膨胀后的图像中,对应结构元素中心位置的像素就被置为白色;只有当结构元素覆盖的区域全部为黑色像素时,中心位置像素在膨胀后的图像中才被置为黑色。

膨胀操作的数学表达式为:

D(A,B) = A ⊕ B = {z | (B̂)z ∩ A ≠ ∅}

其中:A 是被处理的图像,B 是结构元素,B̂ 是 B 的反射,(B̂)z 表示 B̂ 平移到点 z。

三、开运算

开运算先进行腐蚀操作,再进行膨胀操作。腐蚀操作可以去除图像中的小物体和细小的突出部分,使物体的轮廓变得更加平滑。然后进行膨胀操作,能够在一定程度上恢复物体的大小和形状,但不会恢复被腐蚀掉的较大物体。

例如,对于一个有噪声和小突起的图像,开运算首先通过腐蚀去除小突起和噪声点,然后通过膨胀稍微恢复物体的形状,使得图像更加干净、平滑。

开运算是一种先腐蚀后膨胀的运算,可以表示为:
eq?A%20%5Ccirc%20B%20%3D%20%28A%20%5Cominus%20B%29%20%5Coplus%20B
其中:

  • (A) 是输入图像,
  • (B) 是结构元素,
  • (\ominus) 表示腐蚀运算,
  • (\oplus) 表示膨胀运算.

在实际应用中,开运算常用于去除小的噪声

具体来说:

在原图中,你可能会看到一些孤立的亮点噪声,物体的轮廓不够平滑,可能有一些细小的毛刺。

经过开运算后,首先腐蚀操作会去除那些孤立的噪声点和小的突出部分,使物体的轮廓变得更加平滑。然后膨胀操作会在一定程度上恢复物体的大小和形状,但不会恢复那些被腐蚀掉的较大噪声物体。此时,图像中的噪声大大减少,物体的轮廓更加规整,看起来更加清晰和干净。

例如,原图中有一个圆形物体,其边缘有一些小的凸起和一些孤立的噪声点。经过开运算后,圆形物体的边缘变得更加光滑,那些小的凸起被去除,孤立的噪声点也消失了,整个图像更加美观和易于分析。

8574fee0b1bf43c2be20896a2117578c.png9cfbd1622c32437eaa4f24bdb11e909d.png

四、闭运算

闭运算先进行膨胀操作,再进行腐蚀操作。膨胀操作可以填充物体内部的小孔洞和连接邻近的物体,使物体的轮廓更加完整。接着进行腐蚀操作,能够去除因膨胀而产生的一些不必要的连接和突出部分,同时保持物体的基本形状和大小。

比如,对于一个有缝隙的图像,闭运算首先通过膨胀填充缝隙,然后通过腐蚀去除多余的连接部分,使物体更加规整。

闭运算是一种先膨胀后腐蚀的运算,可以表示为:
eq?A%20%5Cbullet%20B%20%3D%20%28A%20%5Coplus%20B%29%20%5Cominus%20B
其中的符号与上面类似。

在实际应用中,闭运算则用于填充小孔或连接近邻的对象

38a85d26b5074ad5bd431a10bdb6ef22.pngc133e7c7406f41b1bbceb2f5bae94766.png

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main() {
    // 读取图像
    Mat image = imread("your_image.jpg", IMREAD_GRAYSCALE);

    if (image.empty()) {
        cout << "无法读取图像" << endl;
        return -1;
    }

    // 创建结构元素(这里使用 5x5 的矩形结构元素)
    Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));

    // 开运算
    Mat openImage;
    morphologyEx(image, openImage, MORPH_OPEN, kernel);

    // 闭运算
    Mat closeImage;
    morphologyEx(image, closeImage, MORPH_CLOSE, kernel);

    // 显示原图、开运算结果和闭运算结果
    imshow("原图", image);
    imshow("开运算结果", openImage);
    imshow("闭运算结果", closeImage);

    waitKey(0);
    return 0;
}

五、形态学梯度

形态学梯度是通过膨胀后的图像减去腐蚀后的图像得到的。膨胀操作会使物体的边界向外扩张,腐蚀操作会使物体的边界向内收缩。两者相减后,得到的结果突出了物体的边缘部分,即物体的轮廓信息。

例如,对于一个具有明显边界的物体图像,形态学梯度操作可以清晰地显示出物体的边缘,增强图像中物体与背景的对比度。

一、顶帽运算和底帽运算的原理

(一)顶帽运算

  1. 定义
    • 顶帽运算(Top-hat transform)又称为礼帽变换,是原图像与开运算结果图像的差值。它能够提取出图像中的明亮细节和孤立的亮点,突出图像中的局部明亮区域。
  2. 数学表达式
    • 设原始图像为I,结构元素为B,则顶帽运算T可表示为:T = I - opening(I, B),其中opening(I, B)表示对图像I进行以B为结构元素的开运算。
  3. 原理分析
    • 开运算具有去除图像中较小明亮区域和孤立亮点、平滑物体轮廓的作用。当用原始图像减去开运算的结果时,就得到了那些被开运算去除的部分,也就是图像中的明亮细节和孤立的亮点。
    • 例如,对于一个含有明亮噪声点的图像,开运算会去除这些噪声点。而顶帽运算则能够将这些被去除的噪声点提取出来,作为顶帽运算的结果。
    • 39509331045e406abdaafedd41da2dcb.png56f79b8790e54b8eafd50238c9850aee.png

(二)底帽运算

  1. 定义
    • 底帽运算(Bottom-hat transform)又称为黑帽变换,是闭运算结果图像与原图像的差值。它能够提取出图像中的黑暗细节和孤立的暗点,突出图像中的局部黑暗区域。
  2. 数学表达式
    • 设原始图像为I,结构元素为B,则底帽运算B可表示为:B = closing(I, B) - I,其中closing(I, B)表示对图像I进行以B为结构元素的闭运算。
  3. 原理分析
    • 闭运算具有填充图像中较小黑暗区域和连接邻近物体、平滑物体轮廓的作用。当用闭运算的结果减去原始图像时,就得到了那些被闭运算填充或改变的部分,也就是图像中的黑暗细节和孤立的暗点。
    • 例如,对于一个含有黑暗噪声点的图像,闭运算会填充这些噪声点。而底帽运算则能够将这些被填充的噪声点提取出来,作为底帽运算的结果。

953c4bcf0fa14b939798686bf6aad73f.png

二、顶帽运算和底帽运算的应用场景

(一)医学图像处理

  1. 细胞检测
    • 在医学显微镜图像中,细胞通常呈现出不同的亮度和形态。顶帽运算可以用于突出图像中的明亮细胞,帮助医生或研究人员更准确地检测和分析细胞的数量、形状和分布。
    • 例如,在血液细胞图像中,红细胞通常比较暗淡,而白细胞则相对较亮。通过顶帽运算,可以突出白细胞的区域,方便后续的细胞分类和计数。
  2. 病变检测
    • 对于医学影像中的病变区域,如肿瘤、炎症等,往往会表现出与周围组织不同的亮度或对比度。底帽运算可以用于突出图像中的黑暗病变区域,辅助医生进行病变的检测和诊断。
    • 例如,在脑部磁共振图像中,肿瘤区域可能会呈现出较低的亮度。通过底帽运算,可以将这些黑暗区域提取出来,帮助医生更准确地定位和评估肿瘤的大小和位置。

(二)工业检测

  1. 表面缺陷检测
    • 在工业生产中,产品表面的缺陷可能会表现为明亮的划痕、污点或黑暗的凹坑、裂缝等。顶帽运算和底帽运算可以分别用于检测图像中的明亮缺陷和黑暗缺陷。
    • 例如,对于金属表面的划痕检测,可以使用顶帽运算突出明亮的划痕区域。对于塑料零件表面的凹坑检测,可以使用底帽运算突出黑暗的凹坑区域。
  2. 印刷电路板检测
    • 在印刷电路板(PCB)的制造过程中,需要对电路板上的焊点、线路等进行检测,以确保产品质量。顶帽运算和底帽运算可以用于检测 PCB 图像中的缺陷,如短路、断路、焊锡过多或过少等。
    • 例如,对于短路检测,可以使用顶帽运算突出由于焊锡过多而导致的明亮连接区域。对于断路检测,可以使用底帽运算突出由于线路断开而导致的黑暗区域。

(三)文档图像处理

  1. 文字增强
    • 在扫描或拍照得到的文档图像中,文字可能会受到光照不均匀、背景噪声等因素的影响,导致文字的清晰度和对比度下降。顶帽运算可以用于增强图像中的明亮文字区域,提高文字的可读性。
    • 例如,对于一份手写文档图像,由于纸张的颜色和纹理不同,文字可能会显得比较暗淡。通过顶帽运算,可以突出文字的明亮部分,使文字更加清晰可辨。
  2. 背景去除
    • 在文档图像处理中,有时需要去除背景图案或水印,以便更好地提取文字信息。底帽运算可以用于去除图像中的黑暗背景区域,使文字更加突出。
    • 例如,对于一份带有水印的文档图像,水印通常会呈现出较低的亮度。通过底帽运算,可以将水印区域提取出来,然后通过图像减法去除水印,得到干净的文字图像。

(四)天文学图像处理

  1. 恒星检测
    • 在天文学图像中,恒星通常表现为明亮的点源。顶帽运算可以用于突出图像中的恒星区域,帮助天文学家更准确地检测和分析恒星的位置、亮度和分布。
    • 例如,在星空图像中,恒星的亮度可能会受到大气湍流、背景噪声等因素的影响。通过顶帽运算,可以去除背景噪声,突出恒星的明亮区域,方便后续的恒星识别和分类。
  2. 星系结构分析
    • 对于星系图像,底帽运算可以用于突出图像中的黑暗尘埃带和星际介质区域,帮助天文学家更好地了解星系的结构和演化。
    • 例如,在星系图像中,尘埃带通常会呈现出较低的亮度。通过底帽运算,可以将这些黑暗区域提取出来,与星系的明亮区域进行对比,从而更好地分析星系的形态和结构。

(五)安全监控领域

  1. 异常行为检测
    • 在安全监控视频中,异常行为通常会表现为突然出现的明亮或黑暗区域。顶帽运算和底帽运算可以用于检测图像中的这些异常区域,帮助监控人员及时发现潜在的安全隐患。
    • 例如,在一个商场的监控视频中,如果有人突然扔出一个明亮的物体,顶帽运算可以快速检测到这个明亮区域的变化,从而触发报警系统。同样,如果有人在黑暗的角落里进行可疑活动,底帽运算可以突出这个黑暗区域,引起监控人员的注意。
  2. 人脸识别
    • 在人脸识别系统中,顶帽运算和底帽运算可以用于增强人脸图像的对比度和细节,提高人脸识别的准确率。
    • 例如,对于一个低对比度的人脸图像,顶帽运算可以突出人脸的明亮部分,如眼睛、嘴巴等,底帽运算可以突出人脸的黑暗部分,如眉毛、鼻孔等。通过对这些区域的增强,可以使人脸的特征更加明显,有利于人脸识别算法的准确识别。

在我看来,顶帽运算和底帽运算作为形态学图像处理的重要工具,在医学、工业、文档处理、天文学和安全监控等领域都有着广泛的应用。通过突出图像中的明亮或黑暗细节,它们可以帮助我们更好地分析和处理图像,提高图像的质量和可读性,为各种实际应用提供有力的支持。

 

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main() {
    // 读取图像
    Mat image = imread("your_image.jpg", IMREAD_GRAYSCALE);

    if (image.empty()) {
        cout << "无法读取图像" << endl;
        return -1;
    }

    // 创建结构元素(这里使用 5x5 的矩形结构元素)
    Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));

    // 开运算
    Mat openImage;
    morphologyEx(image, openImage, MORPH_OPEN, kernel);

    // 闭运算
    Mat closeImage;
    morphologyEx(image, closeImage, MORPH_CLOSE, kernel);

    // 顶帽运算
    Mat topHatImage;
    subtract(image, openImage, topHatImage);

    // 底帽运算
    Mat bottomHatImage;
    subtract(closeImage, image, bottomHatImage);

    // 显示原图、顶帽运算结果和底帽运算结果
    imshow("原图", image);
    imshow("顶帽运算结果", topHatImage);
    imshow("底帽运算结果", bottomHatImage);

    waitKey(0);
    return 0;
}

代码都能直接复制使用,创作不易,希望大家点个关注不迷路~每天都会有算法内容更新哦。

 

 

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

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

相关文章

小北的字节跳动青训营与 LangChain 实战课:探索 AI 技术的新边界(持续更新中~~~)

前言 最近&#xff0c;字节跳动的青训营再次扬帆起航&#xff0c;作为第二次参与其中的小北&#xff0c;深感荣幸能借此机会为那些尚未了解青训营的友友们带来一些详细介绍。青训营不仅是一个技术学习与成长的摇篮&#xff0c;更是一个连接未来与梦想的桥梁~ 小北的青训营 X M…

【SSM详细教程】-15-Spring Restful风格【无敌详细】

精品专题&#xff1a; 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12789841.html?spm1001.20…

使用Python爬取某发地网市场蔬菜价格数据

前言 随着互联网技术的发展&#xff0c;数据抓取成为了获取大量公开数据的重要手段。本文将介绍如何利用 Python 编程语言结合 DrissionPage 和自定义的 DataRecorder 模块&#xff0c;实现对新发地市场蔬菜价格数据的自动化抓取&#xff0c;并将抓取到的数据保存至 CSV 文件中…

免费好用又好看且多端自动同步第三方终端工具Termius你值得拥有

使用目的&#xff1a; 本地终端功能一样&#xff0c;都是为了登录服务器查看日志等操作。 本地终端 优点&#xff1a;方便简单&#xff0c;无需额外下载安装、免费。 缺点&#xff1a;每次都需要重新登陆输入命令&#xff0c;步骤繁琐无法简化&#xff1b;不能跨端同步。 第…

Postman:高效的API测试工具

在现代软件开发中&#xff0c;前后端分离的架构越来越普遍。前端开发者与后端开发者之间的协作需要一种高效的方式来测试和验证API接口。在这个背景下&#xff0c;Postman作为一款强大的API测试工具&#xff0c;受到了广泛的关注和使用。 今天将介绍什么是Postman、为什么要使用…

计算机网络-以太网小结

前导码与帧开始分界符有什么区别? 前导码--解决帧同步/时钟同步问题 帧开始分界符-解决帧对界问题 集线器 集线器通过双绞线连接终端, 学校机房的里面就有集线器 这种方式仍然属于共享式以太网, 传播方式依然是广播 网桥: 工作特点: 1.如果转发表中存在数据接收方的端口信息…

基于Retinex算法的图像去雾matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频&#xff09…

Nature Medicine病理AI汇总|TORCH:预测未知原发部位癌症的肿瘤起源|顶刊精析·24-11-01

小罗碎碎念 今天分析Nature Medicine病理AI系列的第三篇文章——《Prediction of tumor origin in cancers of unknown primary origin with cytology-based deep learning》 这篇文章报道了一种基于细胞学图像的深度学习方法TORCH&#xff0c;用于预测未知原发部位癌症的肿瘤…

Ubuntu 安装CUDA, cuDNN, TensorRT(草稿)

文章目录 写在前面一、CUDA, cuDNN, TensorRT 三个库的版本的确定二、解决方法参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04, 本文安装的版本&#xff1a; cuda_11.1.0&#xff1b;cuDNN-8.2.1&#xff1b;TensorRT-8.2.4.2 一、CUDA, cuDNN, TensorRT 三个库…

豆包,攻克数字是个什么工具?《GKData-挖掘数据的无限可能》(数据爬虫采集工具)

豆包&#xff0c;攻克数字是个什么工具&#xff1f; “攻克数字” 指的是 “攻克数字&#xff08;GKData&#xff09;” 这样一款工具。是一款针对网页、APP中数据自动解析转表存入数据库的软件&#xff0c;为数据工作者而生。它是一个不会编程也能用的可视化数据解析为标准二…

rust编写的系统监测器

系统监测器 技术栈 rusttaurivue3vue-echartsrsbuild 软件介绍 用于查看电脑的硬件信息&#xff0c;实时监测cpu&#xff0c;内存&#xff0c;硬盘&#xff0c;网络&#xff0c;进程等系统资源 图形化&#xff0c;动态化展示&#xff0c;美观实用 软件截图 下载 https:/…

实体类中为什么要实现serializable接口

最近见到好多项目中写的代码&#xff0c;在实体类中实现了Serializable接口。说实话&#xff1a;这个在以前学习的时候&#xff0c;貌似学过&#xff0c;但是一直没有用过&#xff0c;所以看着一脸懵逼&#xff0c;但是别人总不可能随便写的吧.....所以就去查了一下这个接口。 …

github打不开网络问题

当打开github出现超时或者网络不能访问的情况时&#xff0c;我们进行如下方法解决&#xff1a; 1&#xff0c;ping gitbub.com查看域名分析的DNS IP C:\Users\86156>ping github.com 正在 Ping github.com [20.205.243.166] 具有 32 字节的数据: 来自 20.205.243.166 的回复…

基于NVIDIA NIM平台实现盲人过马路的demo(一)

前言:利用NVIDIA NIM平台提供的大模型进行编辑,通过llama-3.2-90b-vision-instruct模型进行初步的图片检测 step1: 部署大模型到本地,引用所需要的库 import os import requests import base64 import cv2 import time from datetime import datetimestep2: 观看官方使用文…

Java日志脱敏(二)——fastjson Filter + 注解 + 工具类实现

背景简介 日志脱敏 是常见的安全需求&#xff0c;最近公司也需要将这一块内容进行推进。看了一圈网上的案例&#xff0c;很少有既轻量又好用的轮子可以让我直接使用。我一直是反对过度设计的&#xff0c;而同样我认为轮子就应该是可以让人拿去直接用的。所以我准备分享两篇博客…

上海亚商投顾:沪指缩量调整 华为概念股午后爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 市场全天震荡调整&#xff0c;沪指、深成指午后跌超1%&#xff0c;创业板指一度跌逾2%&#xff0c;尾盘跌幅有…

从0开始学PHP面向对象内容之(类,对象,构造/析构函数)

上期我们讲了面向对象的一些基本信息&#xff0c;这期让我们详细的了解一下 一、面向对象—类 1、PHP类的定义语法&#xff1a; <?php class className {var $var1;var $var2 "constant string";function classfunc ($arg1, $arg2) {[..]}[..] } ?>2、解…

利用Docker Compose构建微服务架构

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 利用Docker Compose构建微服务架构 引言 Docker Compose 简介 安装 Docker Compose 创建项目结构 编写 Dockerfile 前端 Dockerf…

CPU用户时间百分比

在计算机系统中&#xff0c;"CPU用户时间百分比&#xff08;CPU User Time&#xff09;"是一个性能监控指标&#xff0c;它描述了CPU在用户模式下执行的累积时间与总的CPU时间的比例。这个指标可以帮助我们了解系统在执行用户态程序时的负载情况。下面是一些关于CPU用…

TEC半导体致冷工作原理:【图文详讲】

目录 1&#xff1a;什么是TEC 2&#xff1a;TEC工作原理 3&#xff1a;TEC结构 4&#xff1a;TEC技术参数 5&#xff1a;TEC选型 6&#xff1a;实物TEC 7&#xff1a;手机散热器 1&#xff1a;什么是TEC TEC半导体致冷器&#xff08;Thermo Electric Cooler&#xff09…