传统图像分割算法matlab代码
时间: 2023-08-04 22:05:41 浏览: 89
以下是几种常见的传统图像分割算法的 MATLAB 代码示例:
1. 基于阈值的分割算法:
```matlab
I = imread('image.png'); % 读取图像
[height, width] = size(I); % 获取图像的高度和宽度
T = 100; % 设定阈值
for i = 1:height
for j = 1:width
if I(i,j) > T
I(i,j) = 255; % 白色
else
I(i,j) = 0; % 黑色
end
end
end
imshow(I); % 显示分割后的图像
```
2. 基于边缘检测的分割算法:
```matlab
I = imread('image.png'); % 读取图像
I = rgb2gray(I); % 转换为灰度图像
BW = edge(I, 'canny', 0.2); % 边缘检测
imshow(BW); % 显示分割后的图像
```
3. 基于区域生长的分割算法:
```matlab
I = imread('image.png'); % 读取图像
I = im2double(I); % 转换为 double 类型
[height, width] = size(I); % 获取图像的高度和宽度
T = 0.1; % 设定生长阈值
visited = zeros(height, width); % 初始化访问矩阵
for i = 1:height
for j = 1:width
if visited(i,j) == 0 % 如果当前像素未被访问
visited(i,j) = 1; % 标记为已访问
region = grow_region(I, i, j, T, visited); % 区域生长
I(region) = 1; % 标记区域内的像素
end
end
end
imshow(I); % 显示分割后的图像
function region = grow_region(I, i, j, T, visited)
region = [i, j]; % 初始化区域
neighbors = get_neighbors(i, j, visited); % 获取相邻像素
for k = 1:size(neighbors,1)
ni = neighbors(k,1);
nj = neighbors(k,2);
if abs(I(ni,nj) - I(i,j)) < T % 如果相邻像素与当前像素相似
visited(ni,nj) = 1; % 标记为已访问
region = [region; ni, nj]; % 加入区域
region = [region; grow_region(I, ni, nj, T, visited)]; % 递归生长
end
end
end
function neighbors = get_neighbors(i, j, visited)
neighbors = [];
if i > 1 && visited(i-1,j) == 0
neighbors = [neighbors; i-1, j];
end
if j > 1 && visited(i,j-1) == 0
neighbors = [neighbors; i, j-1];
end
if i < size(visited,1) && visited(i+1,j) == 0
neighbors = [neighbors; i+1, j];
end
if j < size(visited,2) && visited(i,j+1) == 0
neighbors = [neighbors; i, j+1];
end
end
```
4. 基于聚类的分割算法:
```matlab
I = imread('image.png'); % 读取图像
I = im2double(I); % 转换为 double 类型
X = reshape(I, [], 1); % 转换为列向量
K = 2; % 聚类数
[idx, centers] = kmeans(X, K); % k-means 聚类
for i = 1:numel(idx)
I(i) = centers(idx(i)); % 标记像素
end
imshow(I); % 显示分割后的图像
```
以上是四种常见的传统图像分割算法的 MATLAB 代码示例,需要根据具体情况进行调整和优化。