图像阈值分割、区域分割、边缘分割
目录
- 图像阈值分割、区域分割、边缘分割
- 目标
- 知识点
- 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中的实现方法。