【图像阈值分割、区域分割、边缘分割】

devtools/2025/3/6 16:14:13/

图像阈值分割、区域分割、边缘分割

目录

  • 图像阈值分割、区域分割、边缘分割
    • 目标
    • 知识点
      • 1. 图像分割概述
      • 2. 阈值分割(Thresholding)
      • 3. 基于区域的分割(Region-based Segmentation)
      • 4. 基于边缘的分割(Edge-based Segmentation)
    • 练习
      • 1. 阈值分割
    • 总结

目标

学习图像分割的基本方法,包括阈值分割、基于区域的分割和基于边缘的分割。

知识点

1. 图像分割概述

• 定义 :图像分割是将图像划分为若干个互不重叠的区域,每个区域具有相似的特性。
• 应用 :广泛应用于目标识别、图像理解、医学图像分析等领域。
• 常见方法 :○ 阈值分割。○ 基于区域的分割。○ 基于边缘的分割。

2. 阈值分割(Thresholding)

• 定义 :通过设置一个或多个阈值,将图像划分为前景和背景。
• 原理 :○ 根据图像的灰度分布,选择合适的阈值。○ 将灰度值高于阈值的像素分为前景,低于阈值的像素分为背景。
• 特点 :○ 简单高效,适用于对比度较高的图像。○ 需要选择合适的阈值。
• 使用技巧 :○ 根据图像的直方图选择阈值。○ 使用自动阈值选择方法(如Otsu方法)。

示例代码 :
matlab

% 读取图像
img = imread('peppers.png');
% 转换为灰度图像
grayImg = rgb2gray(img);
% 计算直方图
histogram = imhist(grayImg);
% 使用Otsu方法选择阈值
threshold = graythresh(grayImg);
% 应用阈值分割
binaryImg = imbinarize(grayImg, threshold);
% 显示结果
figure;
subplot(1, 3, 1);
imshow(grayImg);
title('Grayscale Image');
subplot(1, 3, 2);
plot(histogram);
title('Histogram');
subplot(1, 3, 3);
imshow(binaryImg);
title('Thresholded Image');

代码解释 :
• rgb2gray 函数用于将彩色图像转换为灰度图像。
• imhist 函数用于计算并显示图像的直方图。
• graythresh 函数用于使用Otsu方法选择阈值。
• imbinarize 函数用于应用阈值分割,生成二值图像。

运行结果:

在这里插入图片描述

3. 基于区域的分割(Region-based Segmentation)

• 定义 :通过区域生长、合并或分裂等方法,将相似的像素区域合并。
• 常见方法 :○ 区域生长法(Region Growing) :§ 从种子点开始,逐步合并相邻的像素。§ 相似性准则可以是灰度值、颜色等。○ 分水岭算法(Watershed Algorithm) :§ 基于图像的梯度信息,将图像划分为不同的区域。§ 类似于水的流域分割。
• 特点 :○ 适用于具有明显区域特征的图像。○ 分水岭算法可能会导致过分割,需要结合其他方法优化。

示例代码(区域生长法) :
matlab

% 读取图像
img = imread('peppers.png');
% 转换为灰度图像
grayImg = rgb2gray(img);
% 定义种子点
seed = [100, 150]; % 坐标为 [,],即 (100, 150)
% 应用区域生长
threshold = 20; % 灰度差阈值
segmentedImg = regiongrowing(grayImg, seed, threshold);
% 显示结果
figure;
subplot(1, 2, 1);
imshow(grayImg);
title('Grayscale Image');
subplot(1, 2, 2);
imshow(segmentedImg);
title('Segmented Image');
% 定义区域生长函数
function segmentedImg = regiongrowing(img, seed, threshold)% 获取图像尺寸[rows, cols] = size(img);% 初始化输出图像segmentedImg = false(rows, cols);% 设置种子点segmentedImg(seed(1), seed(2)) = true;% 初始化队列queue = [seed(1), seed(2)];% 区域生长主循环while ~isempty(queue)% 取出当前点current = queue(1, :);queue(1, :) = []; % 从队列中移除% 检查8邻域for i = -1:1for j = -1:1ni = current(1) + i;nj = current(2) + j;% 确保邻域点在图像范围内if ni >= 1 && ni <= rows && nj >= 1 && nj <= cols% 如果该点未被分割且灰度差小于阈值,则加入区域if ~segmentedImg(ni, nj) && abs(double(img(ni, nj)) - double(img(seed(1), seed(2)))) < thresholdsegmentedImg(ni, nj) = true;queue = [queue; ni, nj]; % 将新点加入队列endendendendend
end

代码解释 :
• imregionalmax 函数用于找到区域的最大值点,作为种子点。
• imdilate 函数用于对种子点进行膨胀处理,扩大种子区域。
• imroberts 函数用于进行边缘检测,作为区域生长的辅助。
• watershed 函数用于进行分水岭分割。

运行结果:
在这里插入图片描述

4. 基于边缘的分割(Edge-based Segmentation)

• 定义 :通过检测图像中的边缘,将图像划分为不同的区域。
• 常见方法 :○ 使用边缘检测算法(如Canny)检测图像中的边缘。○ 根据边缘信息,分割出不同的区域。
• 特点 :○ 依赖于边缘检测的准确性。○ 可能会因为噪声或弱边缘导致分割不准确。

示例代码 :
matlab

% 读取图像
img = imread('peppers.png');
% 转换为灰度图像
grayImg = rgb2gray(img);
% 应用高斯滤波平滑图像(可选,减少噪声)
filteredImg = imgaussfilt(grayImg, 3); % 标准差为3
% 计算梯度图像
gradImg = imgradient(filteredImg);
% 应用分水岭变换
segmentedImg = watershed(gradImg);
% 显示结果
figure;
subplot(1, 2, 1);
imshow(grayImg);
title('Grayscale Image');
subplot(1, 2, 2);
imshow(label2rgb(segmentedImg)); % 将标签矩阵转换为RGB图像显示
title('Segmented Image');

代码解释 :
• edge 函数用于进行Canny边缘检测。
• watershed 函数用于根据边缘信息进行分割。

运行结果:

在这里插入图片描述

练习

1. 阈值分割

• 读取一张灰度图像,计算其直方图,选择合适的阈值进行分割。
matlab

% 读取图像
img = imread('peppers.png');
% 转换为灰度图像
grayImg = rgb2gray(img);
% 计算直方图
histogram = imhist(grayImg);
% 选择阈值
threshold = 128; % 手动选择阈值
% 应用阈值分割
binaryImg = grayImg > threshold;
% 显示结果
figure;
subplot(1, 3, 1);
imshow(grayImg);
title('Grayscale Image');
subplot(1, 3, 2);
plot(histogram);
title('Histogram');
subplot(1, 3, 3);
imshow(binaryImg);
title('Thresholded Image');

运行结果:

在这里插入图片描述

总结

通过今天的学,你已经掌握了图像分割的基本方法,包括阈值分割、基于区域的分割和基于边缘的分割。这些方法在图像处理计算机视觉中具有广泛的应用,能够帮助你将图像划分为有意义的区域,以便于后续的分析和处理。通过实际练习,你可以进一步理解不同方法的特点和适用场景,并熟练掌握它们在MATLAB中的实现方法。


http://www.ppmy.cn/devtools/165030.html

相关文章

C++知识整理day11——二叉搜索树(二叉搜索树的插入、查找、删除及完整代码实现)

文章目录 1.二叉搜索树的概念2.二叉搜索树的性能分析3.二叉搜索树的接口设计3.1 二叉搜索树的插入3.2 二叉搜索树的查找3.3 二叉搜索树的删除3.4 代码实现 1.二叉搜索树的概念 二叉搜索树又称为二叉排序树&#xff0c;为什么这么说呢&#xff0c;我们学过就知道&#xff0c;对二…

Expo:快速验证跨平台应用的工程化方案

对于资源受限的中小团队和独立开发者&#xff0c;跨平台开发常面临双端环境配置、原生API调用等高门槛。Expo通过**托管工作流&#xff08;Managed Workflow&#xff09;**提供开箱即用的解决方案&#xff1a;预置React Native运行时、统一构建工具链&#xff08;expo-cli&…

迷你世界脚本世界接口:World

世界接口&#xff1a;World 彼得兔 更新时间: 2024-06-04 09:40:40 具体函数名及描述如下: 序号 函数名 函数描述 1 isDaytime(...) 是否为白天 2 isCustomGame(...) 是否为自定义游戏 3 isCreativeMode(...) 是否为创造模式 4 isGodMode(...) …

【Elasticsearch】节点设置(Node Settings)是用于定义和管理集群中每个节点的行为和角色的关键配置

在 Elasticsearch 中&#xff0c;节点设置&#xff08;Node Settings&#xff09;是用于定义和管理集群中每个节点的行为和角色的关键配置。节点设置决定了节点的功能、资源分配以及与其他节点的交互方式。以下是关于 Elasticsearch 节点设置的详细说明&#xff0c;结合了之前提…

在.net中,async/await的理解

一、什么是同步&#xff1f;什么是异步&#xff1f; 在.net中&#xff0c;async 和 await 是两个关键字&#xff0c;async 关键字用于声明一个方法是异步方法&#xff0c;该方法可以包含一个或多个 await 表达式。await 关键字是用于在异步方法中等待一个任务&#xff08;Task…

C++并发以及多线程的秘密

1.基础概念 并发&#xff08;Concurrency&#xff09; 并发是指在同一时间段内&#xff0c;多个任务看起来像是同时执行的。并发并不一定意味着真正的同时执行&#xff0c;它可以是通过时间片轮转等方式在多个任务之间快速切换&#xff0c;让用户感觉多个任务在同时进行。并发…

如何用AI完成多源异构数据集成

未来是AI的时代&#xff0c;我们用什么来和AI竞争呢&#xff0c;软考证书&#xff1f;哈哈&#xff0c;以前没考过&#xff0c;最近考几个备着&#xff0c;说不定管用。但我想说的是&#xff0c;IT思维最重要&#xff0c;而不管是系分还是架构&#xff0c;都是在培养IT思维。 …

【Liunx专栏_3】Liunx进程概念知识点

文章目录 前言1、冯诺依曼体系结构2、操作系统2.1、系统调用 3、进程3.1、进程概念3.2、进程描述—PCB3.3、查看进程信息3.4、通过系统调用获取进程标识符3.5、通过系统调用创建子进程—fork() 4、进程状态5、僵尸进程6、孤儿进程7、进程优先级7.1、PRI和NI是什么&#xff1f;7…