图像分割的交互式GUI,matlab代码。
支持所有可调参数边缘检测,阈值(包括MULTITHRESH/IMQUANTIZE), HOUGH(线和圆检测),区域和扩展的最小和最大值,和颜色阈值。
以下是一个基于 MATLAB 的交互式图像分割 GUI 实现代码,支持多种可调参数(如边缘检测、阈值分割、Hough 变换、区域扩展等)。用户可以通过滑块和按钮动态调整参数并实时查看分割结果。
功能概述
- 边缘检测: 使用 Canny 边缘检测,支持调整阈值。
- 阈值分割:
- 支持全局阈值(
graythresh
)。 - 支持多阈值分割(
multithresh
和imquantize
)。
- 支持全局阈值(
- Hough 变换:
- 线检测。
- 圆检测。
- 区域扩展: 支持最小和最大区域选择。
- 颜色阈值: 支持 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
使用说明
- 加载图像: 点击“Load Image”按钮加载一张图像。
- 边缘检测: 滑动“Edge Detection”滑块调整 Canny 边缘检测的阈值。
- 阈值分割: 滑动“Thresholding”滑块调整二值化阈值。
- Hough 变换:
- 点击“Hough Transform (Lines)”按钮检测直线。
- 点击“Hough Transform (Circles)”按钮检测圆形。
- 区域扩展: 输入最小区域大小,点击“Update”按钮清除小区域。
- 颜色阈值: 点击“Color Thresholding”按钮进行颜色分割。
注意事项
- 性能优化: 处理大图像时,建议降低分辨率或使用 GPU 加速。
- 扩展功能: 可以进一步添加形态学操作(如腐蚀、膨胀)和其他分割算法。
- 保存结果: 可以添加保存分割结果的功能。
通过此 GUI,您可以交互式地调整参数并实时查看分割效果!