MATLAB图像处理:图像分割方法

图像分割将图像划分为具有特定意义的子区域,是目标检测、医学影像分析、自动驾驶等领域的核心预处理步骤。本文讲解阈值分割、边缘检测、区域生长、聚类分割、基于图的方法等经典与前沿技术,提供MATLAB代码实现。

目录

1. 图像分割基础

2. 经典分割方法详解

2.1 阈值分割

原理:

MATLAB实现:

2.2 边缘检测分割

原理:

2.3 区域生长与分裂合并

算法步骤:

4. 分割方法对比与选型指南


1. 图像分割基础

  • 定义:根据像素的灰度、纹理、颜色或语义特征,将图像划分为互不重叠的区域。
  • 核心目标
    • 精确分离目标与背景
    • 保留目标的几何与语义完整性

2. 经典分割方法详解

2.1 阈值分割
原理
  • 通过设定灰度阈值划分前景与背景,适用于高对比度场景。
  • OTSU算法:自动计算最大类间方差的阈值。
MATLAB实现
img = imread('coins.png');% 手动阈值分割
thresh = 0.6;                 % 阈值设为0.6(归一化后)
binary_manual = imbinarize(img, thresh);% OTSU自动阈值
thresh_otsu = graythresh(img); 
binary_otsu = imbinarize(img, thresh_otsu);figure;
subplot(131), imshow(img), title('原图');
subplot(132), imshow(binary_manual), title('手动阈值');
subplot(133), imshow(binary_otsu), title('OTSU分割');
2.2 边缘检测分割

原理
  • 基于梯度、二阶导数或零交叉检测目标轮廓(如Canny、Sobel算法)。

% Canny边缘检测
edge_canny = edge(img, 'Canny', [0.1 0.25], 1.5);% 形态学后处理连接断裂边缘
se = strel('disk', 2);
closed_edge = imclose(edge_canny, se);
filled_edge = imfill(closed_edge, 'holes');figure;
subplot(131), imshow(edge_canny), title('Canny边缘');
subplot(132), imshow(closed_edge), title('闭运算连接');
subplot(133), imshow(filled_edge), title('填充孔洞');

2.3 区域生长与分裂合并
算法步骤
  1. 区域生长:从种子点出发,按相似性准则合并相邻像素。
  2. 分裂合并:递归地将图像分裂为子块,合并相似区块。
% 初始化生长区域
segmented = false(size(img));
segmented(seed_point(1), seed_point(2)) = true;
mean_val = img(seed_point(1), seed_point(2));% 迭代生长
for iter = 1:1000neighbor_mask = imdilate(segmented, strel('disk',1)) & ~segmented;neighbors = find(neighbor_mask);if isempty(neighbors), break; endneighbor_vals = img(neighbors);valid = abs(neighbor_vals - mean_val) < threshold;segmented(neighbors(valid)) = true;mean_val = mean(img(segmented));
endfigure; 
imshowpair(img, segmented, 'blend'), title('区域生长结果');

 3. 聚类与图论分割方法

3.1 K-means聚类分割

clc;
clear;
close all;% 读取图像
originalImage = imread('苹果.png'); % 使用MATLAB自带图像
figure; 
imshow(originalImage); 
title('原始图像');%% 预处理
img = im2double(originalImage); % 转换为双精度并归一化
[rows, cols, channels] = size(img);% 转换为像素特征向量(每个像素的RGB值作为特征)
pixelFeatures = reshape(img, rows*cols, channels); % 尺寸变为[M*N, 3]%% K均值聚类
k = 2; % 设置聚类数量
[clusterIdx, centroids] = kmeans(pixelFeatures, k, ...'Distance', 'sqeuclidean', ...   % 平方欧氏距离'Replicates', 5, ...             % 重复聚类5次取最佳'MaxIter', 100);                % 最大迭代次数%% 后处理与可视化
% 将聚类结果重塑回图像尺寸
labelMap = reshape(clusterIdx, rows, cols);% 创建颜色标记的分割图像
segmentedImage = zeros(rows, cols, channels);
for i = 1:k% 为每个聚类区域赋予对应的中心颜色mask = labelMap == i;for ch = 1:channelscolorLayer = img(:,:,ch);segmentedImage(:,:,ch) = segmentedImage(:,:,ch) + ...colorLayer .* mask;end
endfigure;
imshow(segmentedImage);
title('聚类颜色增强分割结果');%% 显示每个聚类区域(二值显示)
figure;
for i = 1:ksubplot(1,k,i);imshow(labelMap == i);title(['聚类区域 ', num2str(i)]);
end%% 高级可视化:叠加边界到原图
boundaries = zeros(rows, cols);
for i = 1:kmask = labelMap == i;boundaries = boundaries + edge(mask, 'canny');
endfigure;
imshow(imoverlay(originalImage, boundaries, [1 0 0])); % 红色显示边界
title('带分割边界的原图');

 3.2 图割(Graph Cut)

rgb_img = imread('苹果.png');
lab_img = rgb2lab(rgb_img);  % 转为Lab色彩空间提升聚类效果
% 使用Image Processing Toolbox的graphcut函数
mask = false(size(rgb_img,1), size(rgb_img,2));
mask(50:end-50, 50:end-50) = true;  % 粗略定义前景区域L = superpixels(rgb_img, 500);       % 生成超像素
BW = lazysnapping(rgb_img, L, mask, ~mask);  % 图割优化figure;
imshowpair(rgb_img, BW, 'blend'), title('图割分割结果');

4. 分割方法对比与选型指南

方法优点缺点适用场景
阈值分割计算快、易于实现依赖对比度,难以处理复杂纹理文档扫描、简单目标提取
边缘检测精准边界定位易受噪声干扰,需后处理工业零件尺寸测量
区域生长适合均匀区域依赖种子点选择,速度慢医学肿瘤分割
K-means聚类无需先验知识色彩空间敏感,可能过分割自然图像颜色分割
图割全局优化,精度高计算资源消耗大交互式图像编辑

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

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

相关文章

海康摄像头IPV6模式,手动,自动,路由公告

海康摄像头DS-2DC7220IW-A 网络设置中的IPv6配置选项。IPv6是互联网协议&#xff08;IP&#xff09;的第六版&#xff0c;用于替代IPv4&#xff0c;提供更多的IP地址和改进的网络功能。图片中的选项允许用户选择如何配置设备的IPv6网络连接&#xff1a; 手动&#xff1a;用户可…

NewMap10.3土地勘测定界自动化系统

“NewMap报件通”适用于建设项目用地土地勘测定界工作&#xff0c;其设计理念是以最大化提高作业效率与最简化作业员操作为原则&#xff0c;后台采用数据库管理技术&#xff0c;以“GIS概念”实现了图形数据与属性数据的双向联动&#xff0c;利用该系统可以方便快捷地绘制数字化…

栈(典型算法思想)—— OJ例题算法解析思路

目录 一、1047. 删除字符串中的所有相邻重复项 - 力扣&#xff08;LeetCode&#xff09; 算法代码&#xff1a; 1. 初始化结果字符串 2. 遍历输入字符串 3. 检查和处理字符 4. 返回结果 总结 二、844. 比较含退格的字符串 - 力扣&#xff08;LeetCode&#xff09; 算…

Qt中基于开源库QRencode生成二维码(附工程源码链接)

目录 1.QRencode简介 2.编译qrencode 3.在Qt中直接使用QRencode源码 3.1.添加源码 3.2.用字符串生成二维码 3.3.用二进制数据生成二维码 3.4.界面设计 3.5.效果展示 4.注意事项 5.源码下载 1.QRencode简介 QRencode是一个开源的库&#xff0c;专门用于生成二维码&…

字符串哈希动态规划_6

一.字符串哈希 字符串哈希概述 字符串哈希是一种将字符串映射到一个数值的技术&#xff0c;常用于处理字符串相关的算法问题&#xff0c;尤其在处理字符串匹配、子串查找等问题时非常高效。它的核心思想是利用一个哈希函数将字符串映射成一个整数&#xff0c;并根据该整数来判…

Kubernetes控制平面组件:Kubernetes如何使用etcd

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…

Mybatis后端数据库查询多对多查询解决方案

问题场景&#xff1a; 我开发的是一个论文选择系统。 后端用一个论文表paper来存储论文信息。 论文信息中&#xff0c;包含前置课程&#xff0c;也就是你需要修过这些课程才能选择这个论文。 而一个论文对应的课程有很多个。 这样就造成了一个数据库存储的问题。一个paper…

BGP配置华为——RR反射器配置

实验拓扑 与之前实验同理将loop0作为routerID使用&#xff0c;且R1和R2上用loop1接口用于模拟用户其他网段 实验要求 1&#xff0c;在AS100内运行OSPF协议 2.配置路由反射器&#xff0c;使得从R1进入的数据能够反射到全局网络 3.在R1和R2上分别宣告自己的loop1口网段用于观…

CentOS7 离线安装 Postgresql 指南

一、背景 服务器通常都是离线内网环境&#xff0c;想要通过联网方式一键下载安装 Postgresql 不太现实&#xff0c;本文将介绍如何在 CentOS7 离线安装 Postgresql&#xff0c;以及遇到困难如何解决。 二、安装包下载 先在本地下载好 rpm 包&#xff0c;再通过 ftp 上传到服…

vue3项目实践心得-寻找未被使用的最小编号

&#x1f9e1;&#x1f9e1;遇到的问题&#x1f9e1;&#x1f9e1; 在用vue3ts编写编译原理项目中”绘制状态转换图“时&#xff0c;有一个添加状态的功能按钮&#xff0c;用户点击按钮即可添加一个新的状态&#xff0c;至于新的状态的编号值&#xff0c;想着以”最小未被使用…

FPGA简介|结构、组成和应用

Field Programmable Gate Arrays&#xff08;FPGA&#xff0c;现场可编程逻辑门阵列&#xff09;&#xff0c;是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物&#xff0c; 是作为专用集成电路&#xff08;ASIC&#xff09;领域中的一种半定制电路而出现的&#xff0c…

C# 入门简介

关于C# ​ C# &#xff08;读作C Sharp&#xff09;是由微软公司开发的一种面向对象、类型安全、高效且简单的编程语言&#xff0c;最初于 2000 年发布&#xff0c;并随后成为 .NET 框架的一部分。所以学习C#语言的同时&#xff0c;也是需要同步学习.NET框架的&#xff0c;不过…

处理使用 mapstruct 导致分页总数丢失问题

问题 PageHelper 分页总数不对&#xff0c;返回的总数老是等于当前页数目 分析 问题出现在 domain 转 VO 这个步骤&#xff0c;当我把数据库实体类型的 list 转为 vo 类型的 list&#xff0c;然后放进 PageInfo 则会丢失分页信息&#xff1b; 解决方式 从数据库查询出来后…

LabVIEW中的icon.llb 库

icon.llb 库位于 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform 目录下&#xff0c;是 LabVIEW 系统中的一个重要库。它的主要功能是与图标相关的操作&#xff0c;提供了一些实用的 VI 用于处理 LabVIEW 图标的显示、修改和设置。通过该库&#x…

【ProtoBuf】文件编写及序列化

ProtoBuf文件编写及序列化 文章目录 ProtoBuf文件编写及序列化快速上手ProtoBuf创建.proto 文件指定Proto3语法Package声明符定义消息(message)定义消息字段编译命令 序列化与反序列化的使用小结 快速上手ProtoBuf 为了快速上手以及完整的使用ProtoBuf&#xff0c;我们将编写一…

Java高频面试之SE-22

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天又来了&#xff01;哈哈哈哈哈嗝&#x1f436; Java中的Optional了解多少&#xff1f; 在 Java 中&#xff0c;Optional 是 Java 8 引入的一个容器类&#xff0c;用于显式处理可能为 null 的…

250217-数据结构

1. 定义 数据结构是数据的存储结构&#xff0c;即数据是按某些结构来存储的&#xff0c;比如线性结构&#xff0c;比如树状结构等。 2. 学习意义 数据结构是服务于算法的&#xff0c;为了实现算法的高效计算&#xff0c;所以将数据按特定结构存储。比如使用快速插入或删除的…

PyCharm2024使用Python3.12在Debug时,F8步进时如同死机状态

在使用时PyCharm2024&#xff0b;Python3.12&#xff0c;在程序进行调试时&#xff0c;按F8步进时如同死机状态。 1、相同的程序在PyCharm2023&#xff0b;Python3.9时是没有问题的&#xff0c;因此决定重装PyCharm2023&#xff0b;Python3.9&#xff0c;进行调试——调试OK。 …

C/C++ | 每日一练 (2)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 C/C | 每日一练 (2)题目参考答案封装继承多态虚函数底…

DeepSeek应用-一秒对书本要点分析并创建思维脑图

2025年开始啦&#xff0c;从DeepSeek的火爆程度来看&#xff0c;今年必须紧盯DS的发展&#xff0c;AI不会淘汰人&#xff0c;AI只会淘汰不会使用的人。从文心一言、豆包、Kimi到DS,基本上从功能上大致相同&#xff0c;但是DeepSeek的开源着实在眼界和格局上更胜一筹&#xff0c…