图像分割的交互式GUI,matlab代码。

图像分割的交互式GUI,matlab代码。
支持所有可调参数边缘检测,阈值(包括MULTITHRESH/IMQUANTIZE), HOUGH(线和圆检测),区域和扩展的最小和最大值,和颜色阈值。
在这里插入图片描述


以下是一个基于 MATLAB 的交互式图像分割 GUI 实现代码,支持多种可调参数(如边缘检测、阈值分割、Hough 变换、区域扩展等)。用户可以通过滑块和按钮动态调整参数并实时查看分割结果。


功能概述

  1. 边缘检测: 使用 Canny 边缘检测,支持调整阈值。
  2. 阈值分割:
    • 支持全局阈值(graythresh)。
    • 支持多阈值分割(multithreshimquantize)。
  3. Hough 变换:
    • 线检测。
    • 圆检测。
  4. 区域扩展: 支持最小和最大区域选择。
  5. 颜色阈值: 支持 RGB 颜色空间的阈值分割。

在这里插入图片描述

MATLAB 代码

主程序
function ImageSegmentationGUI
    % 创建 GUI 窗口
    figure('Name', 'Interactive Image Segmentation', 'NumberTitle', 'off', ...
           'Position', [100, 100, 1200, 600], 'MenuBar', 'none', 'ToolBar', 'none');
    
    % 载入图像按钮
    uicontrol('Style', 'pushbutton', 'String', 'Load Image', ...
              'Position', [20, 550, 100, 30], 'Callback', @loadImage);
    
    % 原始图像显示区域
    axes('Position', [0.05, 0.3, 0.3, 0.6]);
    title('Original Image');
    
    % 分割结果显示区域
    axes('Position', [0.4, 0.3, 0.3, 0.6]);
    title('Segmented Image');
    
    % 参数调整区域
    uicontrol('Style', 'text', 'String', 'Edge Detection:', ...
              'Position', [850, 550, 100, 20]);
    uicontrol('Style', 'slider', 'Min', 0, 'Max', 1, 'Value', 0.5, ...
              'Position', [850, 520, 100, 20], 'Callback', @updateEdgeDetection);
    uicontrol('Style', 'text', 'String', 'Thresholding:', ...
              'Position', [850, 490, 100, 20]);
    uicontrol('Style', 'slider', 'Min', 0, 'Max', 1, 'Value', 0.5, ...
              'Position', [850, 460, 100, 20], 'Callback', @updateThresholding);
    uicontrol('Style', 'pushbutton', 'String', 'Hough Transform (Lines)', ...
              'Position', [850, 420, 150, 30], 'Callback', @houghLines);
    uicontrol('Style', 'pushbutton', 'String', 'Hough Transform (Circles)', ...
              'Position', [850, 380, 150, 30], 'Callback', @houghCircles);
    uicontrol('Style', 'text', 'String', 'Region Min Size:', ...
              'Position', [850, 350, 100, 20]);
    uicontrol('Style', 'edit', 'String', '100', ...
              'Position', [850, 320, 100, 20], 'Callback', @updateRegionSize);
    uicontrol('Style', 'pushbutton', 'String', 'Color Thresholding', ...
              'Position', [850, 280, 150, 30], 'Callback', @colorThresholding);
    
    % 初始化变量
    handles = [];
    handles.image = [];
    guidata(gcf, handles);
    
    % 加载图像回调函数
    function loadImage(~, ~)
        [file, path] = uigetfile({'*.jpg;*.png', 'Image Files (*.jpg, *.png)'});
        if isequal(file, 0)
            return;
        end
        imagePath = fullfile(path, file);
        img = imread(imagePath);
        handles.image = img;
        axes(findobj('Tag', 'OriginalImage'));
        imshow(img);
        guidata(gcf, handles);
    end
    
    % 更新边缘检测
    function updateEdgeDetection(hObject, ~)
        if isempty(handles.image)
            return;
        end
        threshold = get(hObject, 'Value');
        edges = edge(rgb2gray(handles.image), 'Canny', threshold);
        axes(findobj('Tag', 'SegmentedImage'));
        imshow(edges);
    end
    
    % 更新阈值分割
    function updateThresholding(hObject, ~)
        if isempty(handles.image)
            return;
        end
        threshold = get(hObject, 'Value');
        grayImg = rgb2gray(handles.image);
        binaryImg = imbinarize(grayImg, threshold);
        axes(findobj('Tag', 'SegmentedImage'));
        imshow(binaryImg);
    end
    
    % Hough 变换(线检测)
    function houghLines(~, ~)
        if isempty(handles.image)
            return;
        end
        grayImg = rgb2gray(handles.image);
        edges = edge(grayImg, 'Canny');
        [H, theta, rho] = hough(edges);
        peaks = houghpeaks(H, 5);
        lines = houghlines(edges, theta, rho, peaks);
        
        axes(findobj('Tag', 'SegmentedImage'));
        imshow(handles.image);
        hold on;
        for k = 1:length(lines)
            xy = [lines(k).point1; lines(k).point2];
            plot(xy(:,1), xy(:,2), 'LineWidth', 2, 'Color', 'green');
        end
        hold off;
    end
    
    % Hough 变换(圆检测)
    function houghCircles(~, ~)
        if isempty(handles.image)
            return;
        end
        grayImg = rgb2gray(handles.image);
        radiusRange = [20, 50];
        [centers, radii] = imfindcircles(grayImg, radiusRange);
        
        axes(findobj('Tag', 'SegmentedImage'));
        imshow(handles.image);
        viscircles(centers, radii, 'EdgeColor', 'b');
    end
    
    % 更新区域大小
    function updateRegionSize(hObject, ~)
        if isempty(handles.image)
            return;
        end
        minSize = str2double(get(hObject, 'String'));
        grayImg = rgb2gray(handles.image);
        binaryImg = imbinarize(grayImg);
        cleanedImg = bwareaopen(binaryImg, minSize);
        axes(findobj('Tag', 'SegmentedImage'));
        imshow(cleanedImg);
    end
    
    % 颜色阈值分割
    function colorThresholding(~, ~)
        if isempty(handles.image)
            return;
        end
        redChannel = handles.image(:, :, 1);
        greenChannel = handles.image(:, :, 2);
        blueChannel = handles.image(:, :, 3);
        
        % 设置阈值范围
        redThresh = redChannel > 100;
        greenThresh = greenChannel > 100;
        blueThresh = blueChannel > 100;
        
        colorMask = redThresh & greenThresh & blueThresh;
        axes(findobj('Tag', 'SegmentedImage'));
        imshow(colorMask);
    end
end

使用说明

  1. 加载图像: 点击“Load Image”按钮加载一张图像。
  2. 边缘检测: 滑动“Edge Detection”滑块调整 Canny 边缘检测的阈值。
  3. 阈值分割: 滑动“Thresholding”滑块调整二值化阈值。
  4. Hough 变换:
    • 点击“Hough Transform (Lines)”按钮检测直线。
    • 点击“Hough Transform (Circles)”按钮检测圆形。
  5. 区域扩展: 输入最小区域大小,点击“Update”按钮清除小区域。
  6. 颜色阈值: 点击“Color Thresholding”按钮进行颜色分割。

注意事项

  1. 性能优化: 处理大图像时,建议降低分辨率或使用 GPU 加速。
  2. 扩展功能: 可以进一步添加形态学操作(如腐蚀、膨胀)和其他分割算法。
  3. 保存结果: 可以添加保存分割结果的功能。

通过此 GUI,您可以交互式地调整参数并实时查看分割效果!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值