当前位置: 首页 > news >正文

拿到一张声纳图,第一件事当然是把它读进来。MATLAB的imread函数闭着眼都能写出来

MATLAB环境下基于熵的声纳图像分割算法 算法程序运行环境为MATLAB R2018a,执行基于熵方法的声纳图像分割,步骤如下。 1. Read the Original Shipwrecked Sonar Image 2. Gray the Image 3. Denoise the Image: DCT (Discrete Cosine Transform) Denoise 4. Edge Detection (Roberts Operator) 5. Removing Shadow Boundaries 6. Image Localization (Threshold) 7. Remove Ship Boundaries 8. Image Dilate White Pixel (Morphology Dilation) 9. Merge Denoise & Dilation Images 10. 2-D Entropy Segamentation 11. Postprocessing

sonar_img = imread('shipwreck.png');

不过原图大概率是彩色的,得先脱色处理。rgb2gray一上,世界清净了:

gray_img = rgb2gray(sonar_img);

这时候图片八成带着海底噪声,就像老电视雪花点。DCT去噪这招挺有意思——把图像分块做余弦变换,砍掉高频分量。代码里8x8分块是经验值,别问我为啥不是7x9,问就是玄学:

dct_img = blockproc(gray_img,[8 8],@(x) idct2(threshold(dct2(x.data),20)));

threshold函数自己写个阈值处理,把高频系数干掉。这操作相当于给声纳图开了个美颜,但别磨皮过度,边缘信息还得留着检测呢。

MATLAB环境下基于熵的声纳图像分割算法 算法程序运行环境为MATLAB R2018a,执行基于熵方法的声纳图像分割,步骤如下。 1. Read the Original Shipwrecked Sonar Image 2. Gray the Image 3. Denoise the Image: DCT (Discrete Cosine Transform) Denoise 4. Edge Detection (Roberts Operator) 5. Removing Shadow Boundaries 6. Image Localization (Threshold) 7. Remove Ship Boundaries 8. Image Dilate White Pixel (Morphology Dilation) 9. Merge Denoise & Dilation Images 10. 2-D Entropy Segamentation 11. Postprocessing

边缘检测环节,Roberts算子这种老古董居然还在用。不过对弱边缘敏感倒是真的:

edge_img = edge(dct_img,'roberts',0.05);

阈值0.05得微调,太小会捕捉到噪声,太大会漏真边缘。这时候阴影边界开始捣乱,得用区域生长法把它们灭了。重点在于种子点选择,往声波反射强的区域撒点:

shadow_mask = regiongrowing(edge_img, seed_points, 10); clean_edge = edge_img .* ~shadow_mask;

处理完的边界还是支离破碎,得用形态学膨胀把白像素连起来。结构元素选圆盘还是矩形有讲究,这里用3x3菱形:

se = strel('diamond',3); dilated_img = imdilate(clean_edge, se);

重头戏在二维熵分割。传统一维直方图熵扛不住纹理变化,得搞二维联合熵。代码实现有个坑——灰度共生矩阵的计算量会指数爆炸,记得用滑动窗口:

entropy_img = entropyfilt(merged_img, ones(7)); threshold = graythresh(entropy_img); binary_mask = imbinarize(entropy_img, threshold*0.8);

最后的后处理要玩点花活。小区域直接填平,孔洞用形态学闭运算补上,边缘拿中值滤波磨一磨。整个过程像拼乐高,每个模块都要严丝合缝。跑完流程看着分割出来的沉船轮廓,只能说——这波熵的操作,稳!

http://www.jsqmd.com/news/518638/

相关文章:

  • 无刷直流电机PI控制:Matlab/Simulink仿真搭建及其相关内容
  • Python基础入门:变量、数据类型与运算符完全指南
  • 5分钟搞定前后端无感刷新:accessToken与refreshToken实战指南(含axios拦截器配置)
  • LLM之Agent(四十)|AI Agents(九):从单体到多体——构建可协作的智能体网络
  • 探索大数据领域Kafka的消息传输奥秘
  • C#ADO编程与事务思维导图
  • 保姆级避坑指南:在Ubuntu 22.04上对NVMe SSD执行PCIe FLR功能级复位
  • 创建对象
  • 新手必看!Qt中误用close()导致的3大内存问题(附正确姿势)
  • FLAC3D模拟下的不规则形状切片云图解析与应用研究
  • 用Python+OpenCV实现多视角3D重建:从照片到模型的完整流程
  • 揭秘!AI应用架构师如何搭建高效AI伦理治理框架,实现负责任AI
  • Ubuntu上安装、使用Redis的详细教程
  • 电动汽车再生制动系统Simulink联合Carsim仿真模型:模拟不同工况下的车辆参数
  • STM32F030 永磁同步电机非线性磁链观测器的奇妙之旅
  • COMSOL多槽结构石墨烯宽谱吸收仿真分析
  • 四旋翼无人机Simulink轨迹跟踪:应用MPC的稳定控制研究
  • 高效团队协作实践:基于Wiki.js与cpolar的跨地域知识管理方案
  • Visual Studio 2022实战:5分钟搞定.NET MAUI跨平台应用开发(附常见问题解决)
  • 5分钟搞定:用天地图API v4.0 + GeoJSON快速绘制中国行政区划地图(附完整源码)
  • CSS常用动态样式详解:让网页“活”起来的秘密武器
  • Matlab电力系统仿真实例:单相接地、两相间短路和三相短路故障波形模拟
  • 从网格划分到结果后处理:手把手带你用Fluent完成一次完整的LES大涡模拟(含SGS模型设置避坑)
  • PubChemPy避坑指南:解决化合物数据获取中的5个常见错误
  • BigDecimal转字符串踩坑实录:为什么你的123.00变成了1.23E+2?
  • HPE磁盘阵列管理04——MSA事件诊断与实战处理指南
  • 双向全桥CLLC拓扑变频控制仿真模型:实现软开关与谐振状态观察,默认2018b版本分析
  • MPC模型预测控制在Matlab Simulink联合仿真中的探索
  • 逆向工程实战:手把手教你破解药监局网站的动态数据加载机制(Python+Chrome开发者工具)
  • Cesium地图开发实战:如何用原生Canvas打造可交互的指北针组件