MATLAB 实现图像边缘检测与轮廓提取(Canny、Sobel、Prewitt 算子对比)

MATLAB 实现图像边缘检测与轮廓提取(Canny、Sobel、Prewitt 算子对比)

  • Canny 算子:采用多阶段处理(高斯平滑、梯度计算、非极大值抑制、双阈值检测),边缘连续性好,抗噪声能力强;
  • Sobel 算子:基于一阶导数计算,对边缘的响应较强,但边缘较粗;
  • Prewitt 算子:与 Sobel 类似,但采用平均滤波,对噪声更敏感。
Matlab 复制代码
% 随机图像生成与边缘检测(纯程序生成,无需外部文件)
% 功能:生成包含几何形状和噪声的随机图像,使用多种算子进行边缘检测并对比

clear; clc; close all;

%% 1. 生成随机图像(512x512像素)
img_size = 512;
I = zeros(img_size);  % 初始化黑色背景

% 随机生成3-5个矩形
num_rect = randi([3,5]);
for i = 1:num_rect
    % 随机位置和大小(避免超出边界)
    x1 = randi([50, img_size-100]);
    y1 = randi([50, img_size-100]);
    w = randi([30, 100]);
    h = randi([30, 100]);
    x2 = x1 + w;
    y2 = y1 + h;
    % 随机灰度值(100-200,区别于背景0)
    gray_val = randi([100, 200]);
    I(y1:y2, x1:x2) = gray_val;
end

% 随机生成2-3个圆形
num_circle = randi([2,3]);
for i = 1:num_circle
    % 随机圆心和半径
    cx = randi([100, img_size-100]);
    cy = randi([100, img_size-100]);
    r = randi([20, 60]);
    % 生成圆形掩码
    [x, y] = meshgrid(1:img_size, 1:img_size);
    circle_mask = (x - cx).^2 + (y - cy).^2 <= r^2;
    % 随机灰度值(与矩形区分)
    gray_val = randi([50, 150]);
    I(circle_mask) = gray_val;
end

% 添加随机噪声(模拟真实图像)
noise_strength = 10;  % 噪声强度
I = I + noise_strength * randn(size(I));
% 替换imclamp:用min和max限制像素值在0-255
I = max(min(I, 255), 0);  
I = uint8(I);  % 转为8位图像

%% 2. 边缘检测(多种算子对比)
% Canny算子(抗噪声能力强)
edge_canny = edge(I, 'canny', [0.1, 0.3]);  % 双阈值设置

% Sobel算子(水平+垂直)
edge_sobel = edge(I, 'sobel');

% Laplacian算子(对噪声敏感,检测细节)
edge_laplacian = edge(I, 'log');  % 高斯-拉普拉斯

%% 3. 结果可视化
figure('Position', [100, 100, 1200, 900]);

% 原始随机图像
subplot(2, 2, 1);
imshow(I);
title('生成的随机图像(含矩形、圆形和噪声)');
set(gca, 'FontName', 'SimHei');

% Canny边缘检测
subplot(2, 2, 2);
imshow(edge_canny);
title('Canny算子边缘检测结果');
set(gca, 'FontName', 'SimHei');

% Sobel边缘检测
subplot(2, 2, 3);
imshow(edge_sobel);
title('Sobel算子边缘检测结果');
set(gca, 'FontName', 'SimHei');

% Laplacian边缘检测
subplot(2, 2, 4);
imshow(edge_laplacian);
title('Laplacian算子边缘检测结果');
set(gca, 'FontName', 'SimHei');

sgtitle('随机图像生成与边缘检测对比');

%% 4. 轮廓提取(在原图上叠加Canny边缘)
figure('Position', [200, 200, 800, 800]);
imshow(I);
hold on;
% 提取边缘轮廓
[B, ~] = bwboundaries(edge_canny, 'noholes');
for k = 1:length(B)
    boundary = B{k};
    plot(boundary(:,2), boundary(:,1), 'r-', 'LineWidth', 1.2);  % 红色轮廓
end
title('原始图像叠加Canny边缘轮廓');
set(gca, 'FontName', 'SimHei');
hold off;

程序结果:

相关推荐
拔剑纵狂歌5 天前
ClickHouse system.query_log 字段详解与排障实践
后端·clickhouse·1024程序员节
比奥利奥还傲.17 天前
哪吒监控面板实战:部署 Dashboard、接入 Agent、钉钉告警,再配置固定公网访问
网络·人工智能·分布式·1024程序员节
默 语19 天前
Java新手入门:从零开始安装JDK并配置环境变量
java·开发语言·python·mysql·group by·1024程序员节·数据去重
学传打活1 个月前
【边打字.边学昆仑正义文化】_进阶篇5 宇宙星系的运转(续3)
微信公众平台·1024程序员节·汉字·昆仑正义文化
学传打活1 个月前
【边打字.边学昆仑正义文化】_进阶篇5 宇宙星系的运转(续1)
微信公众平台·1024程序员节·汉字·昆仑正义文化
fangzhanpeng1682 个月前
快速掌握C#语言基础知识点(1.基础数据类型)
开发语言·c#·1024程序员节
无己心2 个月前
面向多平台 AI 搜索引擎的适配层架构设计
前端·人工智能·搜索引擎·ai·1024程序员节
u0103055272 个月前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u0103055272 个月前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝2 个月前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节