1. 图像读取和预处理
使用MATLAB的uigetfile
函数读取图像,可以从文件系统中选择图像文件。读取的图像随后经过灰度化处理,将彩色图像转换为灰度图像,以降低计算复杂度并去除不必要的颜色信息。
2. 中值滤波
在图像预处理过程中,使用中值滤波来去除噪声。中值滤波是一种非线性滤波方法,可以有效去除椒盐噪声,同时保留图像中的边缘信息,使得后续的边缘检测更加准确。
3. 图像二值化和形态学操作
为了进一步增强图像的特征,采用自适应阈值方法对图像进行二值化处理,将灰度图像转换为二值图像,从而将目标物体与背景分离开来。接着,使用形态学的开操作来去除小型噪声点,并通过闭操作连接断裂的边缘,以增强目标区域的连通性。
4. 边缘检测
边缘检测是图像处理中的关键步骤之一。在本研究中,使用Sobel算子进行边缘检测,以提取图像中目标物体的边缘信息。Sobel算子是一种一阶微分算子,通过计算图像中灰度的梯度变化来检测边缘。
5. 圆形检测
通过霍夫变换来检测图像中的圆形物体。霍夫变换是一种参数空间中的累加方法,用于检测具有特定几何形状的物体。在本程序中,使用imfindcircles
函数来检测圆的圆心和半径,并将检测结果可视化。
通过这些步骤,实现了对图像中圆形物体的检测和标注,最终输出了检测到的圆的数量及其中心坐标。
6.结果
clear; clc; close all;
% 读取图像
[file, path] = uigetfile({'*.bmp;*.jpg;*.png;*.jpeg', ...'图像文件 (*.bmp, *.jpg, *.png)'; '*.*', '所有文件 (*.*)'}, '选择图像文件');
if isequal(file, 0)disp('用户取消了文件选择');return;
end
% 读取并转换图像为灰度
img = imread(fullfile(path, file));
img = rgb2gray(img);
figure;
imshow(img);
title('原始图像');
% 应用中值滤波
Img = medfilt2(img, [3 3]);
figure;
imshow(Img);
title('中值滤波后的图像');
threshold = graythresh(Img );
Img = imbinarize(Img , threshold );
% 应用形态学操作去噪
Img = imopen(Img, strel('disk', 1));
figure;
imshow(Img);
title('形态学操作后的图像');
% 添加闭操作合并连通域
Img = imclose(Img, strel('disk', 3));
figure;
imshow(Img);
title('闭操作后的图像');% 使用边缘检测来检测硬币
edges = edge(Img, 'sobel', 0.1);
figure;
imshow(edges);
title('边缘检测后的图像');
% 使用霍夫变换来检测圆
[centers, radii] = imfindcircles(edges, [15 1000]); % 根据图像调整最小和最大半径
% 显示原始图像并绘制检测到的圆
figure;
imshow(img);
hold on;
% 使用viscircles显示圆形
viscircles(centers, radii, 'EdgeColor', 'b');
% 使用plot标注圆心
% plot(centers(:,1), centers(:,2), 'yo', 'MarkerSize', 10, 'LineWidth', 2);
% 在圆的中心显示直径
for i = 1:length(radii)text(centers(i,1)-16, centers(i,2), sprintf('%.1f', radii(i)*2), ...'Color', 'r', 'FontSize', 12, 'FontWeight', 'bold');
end
% 输出检测到的圆的数量
disp(['检测到的圆的数量: ', num2str(length(centers))]);
% 输出每个圆的中心坐标
disp('圆的中心坐标:');
disp(centers);
hold off;
title('检测到的圆及其中心坐标');