一、主要步骤
1.设定超像素的数量,利用MATLAB的超像素分割算法获得超像素的标签和数量。
2.通过绘制原图像并用边界标记超像素,直观地了解超像素的分布。
3.计算每个超像素的均值颜色,并根据像素计数得到最终的均值颜色。
4.通过颜色相似性阈值,建立超像素之间的连接关系,并使用连通分量算法获得新的超像素标签。
二、代码实现
clear
clc
% 读取图像
inputImage = imread('1.jpg');
% 将图像转换到LAB色彩空间
labImage = rgb2lab(inputImage);
% 设置超像素的数量
numSuperpixels = 2000;
% 使用超像素分割算法获取超像素的标签和数量
[L, N] = superpixels(labImage, numSuperpixels);
% 显示原图像,并用边界标记超像素
figure;
BW = boundarymask(L);
imshow(imoverlay(inputImage, BW, 'cyan'), 'InitialMagnification', 67);
% 初始化存储均值颜色和像素计数的数组
meanColors = zeros(N, 3, 'double');
pixelCount = zeros(N, 1);
% 计算每个超像素的均值颜色和像素计数
for row = 1:size(labImage, 1)
for col = 1:size(labImage, 2)
label = L(row, col);
pixel = squeeze(double(labImage(row, col, :)))';
meanColors(label, :) = meanColors(label, :) + pixel;
pixelCount(label) = pixelCount(label) + 1;
end
end
% 计算每个超像素的最终均值颜色
for i = 1:N
if pixelCount(i) ~= 0
meanColors(i, :) = meanColors(i, :) / pixelCount(i);
end
end
% 设置颜色相似性阈值
colorSimilarityThreshold = 4;
% 创建一个空的图表示超像素之间的连接关系
G = graph;
% 构建图,连接颜色相似的超像素
for i = 1:N-1
for j = i+1:N
colorDifference = norm(meanColors(i, :) - meanColors(j, :));
if colorDifference < colorSimilarityThreshold
G = addedge(G, i, j);
end
end
end
% 使用连通分量算法获得新的超像素标签
bins = conncomp(G);
% 将原始超像素标签映射到新的超像素标签
newLabels = zeros(size(L));
for row = 1:size(labImage, 1)
for col = 1:size(labImage, 2)
label = L(row, col);
newLabels(row, col) = bins(label);
end
end
% 显示结果,包括带有新超像素边界的图像和填充后的二值图像
figure;
subplot(1, 2, 1);
BW = boundarymask(newLabels);
imshow(imoverlay(inputImage, BW, 'cyan'), 'InitialMagnification', 67);
subplot(1, 2, 2);
BW_filled = imfill(BW, 'holes');
imshow(BW_filled);
三、参数设置的影响
1.超像素数量(numSuperpixels)
影响分割粒度:参数值越大,生成的超像素数量越多,分割的粒度越细致。反之,值越小,生成的超像素数量越少,分割的粒度越粗糙。
计算复杂度:越大的值会导致算法需要处理更多的像素,因此可能增加计算的复杂性。选择合适的值既能保留图像细节,又能控制计算开销。
对噪声和纹理的敏感性:过大或过小的值可能会导致对噪声或图像纹理过度敏感,影响最终结果的质量。
2.颜色相似性阈值(colorSimilarityThreshold)
影响连接超像素的条件:阈值越小,颜色相似性要求越高,连接的超像素之间颜色差异越小。反之,阈值越大,颜色相似性要求越低,连接的超像素之间颜色差异可以更大。
影响分割的松紧度:较小的阈值可能导致过度分割,生成大量细小的超像素。较大的阈值则可能导致过度合并,使得相似但不完全相同的区域被连接成一个超像素。
影响分割结果的视觉效果:适当的颜色相似性阈值可以使得分割结果更符合人眼的感知,同时保留图像中的结构和纹理。
为了找到最佳的参数组合,通常需要通过试验和调整,观察分割结果并选择最适合特定应用场景的参数。实际应用中,可能需要根据具体问题的要求来调整这两个参数,以达到最佳的图像分割效果。
最后
如果你想要进一步了解更多的相关知识,可以关注下面公众号联系~会不定期发布相关设计内容包括但不限于如下内容:信号处理、通信仿真、算法设计、matlab appdesigner,gui设计、simulink仿真…希望能帮到你!