基于MATLAB的聚类算法彩色图像分割系统带GUI界面,支持fcm算法,k-means算法,聚类中心数可以自己设置

打开MATLAB的GUI开发环境GUIDE,随手拖拽几个按钮和滑动条,一个图像分割系统的雏形就出来了。搞图像分割的都知道,聚类算法是把颜色相似的像素归类的好方法,咱们今天要折腾的正是把这事儿可视化。

系统界面中间留了个大大的坐标轴区域,这是给待分割图片准备的。右侧竖着排列的按钮组里,"FCM"和"K-means"两个选项特别显眼——这俩算法可是聚类界的哼哈二将。底下那个滑动条控制着聚类数目,从2到10档位自由调节,调参党应该会喜欢这个设计。

先看核心的回调函数代码片段:

function clusterButton_Callback(hObject, eventdata, handles)
    img = handles.originalImage;
    k = round(get(handles.clusterSlider, 'Value'));
    method = get(handles.algorithmGroup, 'SelectedObject').Tag;
    
    [height, width, ~] = size(img);
    lab_img = rgb2lab(img);  % 转LAB颜色空间更符合人眼感知
    pixel_features = [reshape(lab_img, [], 3) ones(height*width,1)*10*(1:k)]; % 添加空间信息
    
    switch method
        case 'fcmRadio'
            [centers, U] = fcm(pixel_features, k, [2 100 1e-5 0]);
            [~, labels] = max(U);
        case 'kmeansRadio'
            labels = kmeans(pixel_features, k, 'MaxIter', 100);
    end
    
    segmented_img = reshape(labels, height, width);
    axes(handles.resultAxis);
    imshow(label2rgb(segmented_img), 'Border', 'tight');
end

这段代码里有个骚操作:在颜色特征后面拼接了空间坐标乘以不同系数。比如当k=3时,会给每个像素添加[10,20,30]的坐标权重,这样既考虑颜色相似性,又照顾空间连续性,分割结果就不会出现雪花状的噪点了。

基于MATLAB的聚类算法彩色图像分割系统带GUI界面,支持fcm算法,k-means算法,聚类中心数可以自己设置

FCM算法的模糊矩阵U处理起来要小心,max函数取隶属度最大的类别时,注意矩阵维度是否正确。而k-means这里直接用了MATLAB自带的kmeans函数,那个MaxIter参数实测调到100次迭代足够收敛,再高也没啥明显改进。

再看颜色空间转换,为什么用LAB不用HSV?试过就知道,LAB在绿色系和肤色区域的表现更稳定。rgb2lab转换后的L通道明度信息单独拎出来可以做亮度补偿,不过咱们这次没用到这个特性。

滑动条回调里藏着个小技巧:

function clusterSlider_Callback(hObject, ~, handles)
    val = round(get(hObject,'Value'));
    set(hObject,'Value',val);
    set(handles.clusterText,'String',['聚类数: ',num2str(val)]);
    if isfield(handles,'originalImage')
        clusterButton_Callback(hObject, [], handles) % 即时更新分割结果
    end
end

这个即时反馈的设计让调整参数时不需要重复点击执行按钮,拖动滑块就能实时看到分割效果变化。不过要注意图像较大时可能会卡,所以里面加了个条件判断,确保首次运行后才激活实时更新功能。

最后出来的效果挺有意思:用k=2分割风景照,能把天空和地面分开;调到k=5时,树叶的层次感就出来了。FCM在边缘过渡区域比k-means自然,但速度明显慢一截——毕竟要计算隶属度矩阵。下次可以考虑加个进度条,或者试试把图像下采样再处理。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐