% 读入原始图像 I = imread('D:\课设图片\1.jpg'); subplot(331),imshow(I),title('原图'); % 对图像进行二值化处理 I1 = im2bw(I, 0.6); subplot(332),imshow(I1),title('二值化'); % 灰度处理 img1 = rgb2gray(I); % RGB图像转灰度图像 subplot(333),imshow(img1),title('灰度图像'); subplot(334),imhist(img1),title('灰度处理后的灰度直方图'); % 对二值化后的图像进行形态学处理 se = strel('disk', 5); I2 = imclose(I1, se); I3 = imopen(I2, se); I4 = imopen(I3, se); subplot(335),imshow(I4),title('形态学处理'); % 边缘提取 img4 = edge(I4, 'roberts', 0.15, 'both'); subplot(336),imshow(img4),title('roberts算子边缘检测'); % 对处理后的图像进行连通域分析 L = bwlabel(I4); STATS = regionprops(L, 'all'); % 筛选面积在1500到4800的连通域 for i = 1:length(STATS) if (STATS(i).Area < 1300 || STATS(i).Area > 3200) L(L == i) = 0; end end % 在原图上显示选取的连通域边缘 BW = edge(L, 'Canny'); RGB = imoverlay(I, BW, [1 0 0]); subplot(337),imshow(RGB),title('结果图');分析
时间: 2024-02-06 08:03:16 浏览: 34
这段代码是一段基于 MATLAB 的图像处理程序,主要功能是对一张图片进行处理,包括二值化、灰度处理、形态学处理、边缘提取和连通域分析等。
首先将原始图像进行二值化处理,将图像处理成只有黑白两种颜色的图像。接着进行灰度处理,将RGB图像转换成灰度图像,并显示灰度处理后的灰度直方图。然后进行形态学处理,通过对二值化后的图像进行闭运算和开运算,去除图像中的噪点和干扰,使图像更加清晰。接着进行边缘提取,使用 Roberts 算子进行边缘检测。最后进行连通域分析,筛选出面积在一定范围内的连通域,并在原图上显示选取的连通域边缘。最终得到的结果图能够更加清晰地显示出图像中物体的轮廓和边缘。
相关问题
将检测到的目标区域提取出来,修改代码:%% 读入原始图像 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.4; % 高阈值 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 %% 显示结果 imshow(I); % 显示原始图像 hold on; visboundaries(I_target, 'Color', 'r'); % 在原始图像上绘制目标区域边界
%% 读入原始图像
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.4; % 高阈值
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); % 显示原始图像
hold on;
visboundaries(I_target, 'Color', 'r'); % 在原始图像上绘制目标区域边界
title('目标区域提取结果');
修改代码,不需要在原始图像上绘制出来,怎样修改%% 读入原始图像 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.4; % 高阈值 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); % 显示原始图像 hold on; visboundaries(I_target, 'Color', 'r'); % 在原始图像上绘制目标区域边界 title('目标区域提取结果');
%% 读入原始图像
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.4; % 高阈值
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('目标区域提取结果');