请你给出matlab中实现图像分割的代码
时间: 2024-01-06 10:04:01 浏览: 28
以下是一个基于图像区域增长的简单图像分割的 Matlab 代码示例:
```matlab
clear all;
clc;
% 读取图像
I = imread('image.jpg');
% 显示原图像
subplot(1,2,1);
imshow(I);
title('Original Image');
% 取图像的大小
[row,col,channel] = size(I);
% 将图像转换为灰度图像
if channel == 3
I = rgb2gray(I);
end
% 初始化分割图像
segImg = zeros(row,col);
% 阈值
threshold = 50;
for i = 1:row
for j = 1:col
% 判断当前像素是否已经被分割
if segImg(i,j) == 0
% 如果当前像素未被分割,则以该像素为种子点开始进行区域增长
[segImg, region] = regionGrowing(I,segImg,[i,j],threshold);
end
end
end
% 显示分割结果
subplot(1,2,2);
imshow(uint8(segImg*255));
title('Segmentation Result');
% 区域增长函数
function [segImg, region] = regionGrowing(I,segImg,seed,threshold)
% 初始化种子点所在的区域
region = seed;
% 将种子点标记为已分割
segImg(seed(1),seed(2)) = 1;
% 初始化区域增长队列
queue = seed;
% 区域增长
while(size(queue,1) > 0)
% 取队列首元素
current = queue(1,:);
queue(1,:) = [];
% 获取当前像素的邻域像素
neighbors = getNeighbors(current,I);
% 遍历邻域像素
for i = 1:size(neighbors,1)
% 判断邻域像素是否已经被分割
if segImg(neighbors(i,1),neighbors(i,2)) == 0
% 计算邻域像素与种子点之间的距离
dist = abs(double(I(neighbors(i,1),neighbors(i,2))) - double(I(current(1),current(2))));
% 判断距离是否小于阈值
if dist < threshold
% 如果距离小于阈值,则将邻域像素加入区域中
region = [region; neighbors(i,:)];
% 将邻域像素标记为已分割
segImg(neighbors(i,1),neighbors(i,2)) = 1;
% 将邻域像素加入队列
queue = [queue; neighbors(i,:)];
end
end
end
end
end
% 获取邻域像素函数
function neighbors = getNeighbors(current,I)
[row,col] = size(I);
% 定义 8 连通区域
rows = [-1,-1,-1,0,0,1,1,1];
cols = [-1,0,1,-1,1,-1,0,1];
% 初始化邻域像素
neighbors = [];
% 遍历邻域像素
for i = 1:length(rows)
r = current(1) + rows(i);
c = current(2) + cols(i);
% 判断邻域像素是否越界
if r > 0 && r <= row && c > 0 && c <= col
% 将邻域像素加入邻域像素列表中
neighbors = [neighbors; r,c];
end
end
end
```
以上是一个简单的基于图像区域增长的图像分割的 Matlab 代码示例,可供参考。