当前位置: 首页 > article >正文

霍夫圆型硬币检测Matlab程序

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('检测到的圆及其中心坐标');


http://www.kler.cn/news/356388.html

相关文章:

  • GitHub与GitCode
  • vuefor循环动态展示图片不显示
  • ARM指令集和汇编语言的关联学习
  • 设计模式——代理模式(6)
  • 408算法题leetcode--第33天
  • 【概率论】泊松分布
  • Gorm操作数据库,有和没有WithContext的区别
  • 【设计模式】深入理解 Python 单例模式:从原理到实现
  • 第8篇:网络安全基础
  • Docker 安装sql server 登陆失败
  • .NET Sqlite加密
  • Golang | Leetcode Golang题解之第475题供暖器
  • 飞控开发软件有哪些?技术详解
  • HCIP--1实验DNS,VLAN,静态路由,浮动静态,动态路由协议,Telnet
  • Scala大数据开发
  • Java—类和对象习题讲解
  • UNI VFX Missiles Explosions for Visual Effect Graph
  • SpringBoot Data JPA基本使用
  • 《CS:GO》的标志性实验地图在 RTX GPU 神经网络中运行
  • Linux_进程概念详解(续)_命令行参数_环境变量_进程地址空间