修改代码,目标区域与原图显示在一个窗口中%% 读入原始图像 I = imread('瑕疵图像2.png'); %% 灰度化处理 I_gray = rgb2gray(I); %% 边缘检测 % 首先对图像进行高斯滤波,以去除噪声 sigma = 1; % 高斯核标准差 kernel_size = 3; % 高斯核大小 I_blurred = imgaussfilt(I_gray, sigma, 'FilterSize', kernel_size); % 然后使用Canny算法进行边缘检测 threshold_low = 0.1; % 低阈值 threshold_high = 0.8; % 高阈值 I_edges = edge(I_blurred, 'Canny', [threshold_low, threshold_high]); %% 目标提取 % 根据边缘信息提取目标区域 % 这里采用连通域分析方法,将相邻的边缘点划分到同一连通域内 % 然后根据连通域面积大小筛选出目标区域 connectivity = 8; % 连通域个数 CC = bwconncomp(I_edges, connectivity); % 连通域分析 numPixels = cellfun(@numel, CC.PixelIdxList); % 计算每个连通域的像素数 [~, idx] = max(numPixels); % 找到像素数最多的连通域 I_target = false(size(I_edges)); % 初始化目标区域 I_target(CC.PixelIdxList{idx}) = true; % 将目标连通域标记为true %% 显示结果 figure; subplot(1,2,1);imshow(I);title('原始图像'); subplot(1,2,2);imshow(I_edges);title('边缘检测结果'); % 不在原始图像上绘制目标区域边界,直接显示目标区域二值图像 figure; imshow(I_target); title('目标区域提取结果');
时间: 2023-07-15 20:12:54 浏览: 68
读入原始图像 I = imread('瑕疵图像2.png');
%% 灰度化处理
I_gray = rgb2gray(I);
%% 边缘检测
% 首先对图像进行高斯滤波,以去除噪声
sigma = 1; % 高斯核标准差
kernel_size = 3; % 高斯核大小
I_blurred = imgaussfilt(I_gray, sigma, 'FilterSize', kernel_size);
% 然后使用Canny算法进行边缘检测
threshold_low = 0.1; % 低阈值
threshold_high = 0.8; % 高阈值
I_edges = edge(I_blurred, 'Canny', [threshold_low, threshold_high]);
%% 目标提取
% 根据边缘信息提取目标区域
% 这里采用连通域分析方法,将相邻的边缘点划分到同一连通域内
% 然后根据连通域面积大小筛选出目标区域
connectivity = 8; % 连通域个数
CC = bwconncomp(I_edges, connectivity); % 连通域分析
numPixels = cellfun(@numel, CC.PixelIdxList); % 计算每个连通域的像素数
[~, idx] = max(numPixels); % 找到像素数最多的连通域
I_target = false(size(I_edges)); % 初始化目标区域
I_target(CC.PixelIdxList{idx}) = true; % 将目标连通域标记为true
%% 显示结果
figure;
subplot(1,2,1);
imshow(I);title('原始图像');
hold on
B = bwboundaries(I_target);
visboundaries(B,'Color','r')
hold off
subplot(1,2,2);
imshow(I_edges);title('边缘检测结果');
hold on
B = bwboundaries(I_target);
visboundaries(B,'Color','r')
hold off
% 在原始图像上绘制目标区域边界
figure;
imshow(I);
hold on
B = bwboundaries(I_target);
visboundaries(B,'Color','r')
hold off
title('目标区域提取结果');
阅读全文