Hough圆变换解决苹果检测问题

这篇博文围绕如下问题展开

问题:

利用梯度 Hough 圆变换识别图三(a),(b)中的苹果数目,并分析结果,对于误识别的问题,是否能通过对算法进行优化以提高识别的准确率,如果有想法,请详细写出你的改进算法,并对改进前后的结果进行对比。(识别后的示例图如(c)所示)

      

   (a)                                                   (b)       

(c)

首先将苹果图片转成灰度图片,然后直接对灰度图片进行Hough变换,将得到的曲线,也就是圆,在原图中换出来,Hough变换会返回圆的圆心和半径,然后将Hough变换返回的一系列圆画出来即可。但是识别效果并不好。

    并不能识别到苹果。可以显示苹果图片rgb三通道的图片,看哪个通道能将苹果和背景很好的区分开,三通道图片如下:

  

    其中g通道的苹果和背景能很好的区分开,因此选择g通道图片作为Hough变换的源图片,识别效果如下:

    从识别结果来看,识别精度有所改进,相比直接使用灰度图像进行Hough变换,使用g通道图片进行Hough变换效果会好很多。苹果识别精度提高,误识别的数量减少。

    但是这个仍然不是最好的,因为当苹果的分布比较密集的时候,其识别效果就会变得很差,如下图所示:

    因此,还需要寻找比较鲁棒的算法。

    考虑到rgb三个分量之间的联系比较紧密,因此,可以将rgb格式转换为YCbCr格式,分别显示Y、Cb、Cr三个分量的图片,看哪个分量的图片中苹果和背景的区别比较大。其中,Cr分量具备这样的条件。如下图所示,从左至右分别是Y分量、Cb分量、Cr分量。

  

   从结果来看,只有Cr分量可以将苹果和背景很好的区分开,因此选择Cr分量作为Hough变换的源图片,但是考虑到Cr分量的背景是灰色的,而且为了更好的苹果和背景,可以对Cr分量去噪之后做一个分割,具体选择Otsu作为分割的方法。去噪处理和分割之后的图片如下:

 

    之后将分割之后的图片做一个Hough变换,可以得到比较好的效果。其中,Hough变换采用Hough圆变换,对于一个圆来说,经过点(x0,y0)的圆可以表示为:

    这就意味着每一组(a,b,r)代表一个通过点(x0,y0)的圆。

1)对于一个给定点(x0,y0),我们可以在三维直角坐标系中,绘出所有通过它的圆。最终我们将得到一条三维的曲线。

2)我们可以对图像中所有的点进行上述操作.。如果两个不同点进行上述操作后得到的曲线在空间 a - b - r 相交, 即它们有一组公共的(a,b,r),这就意味着它们在同一个圆上。

3)越多曲线交于一点,也就意味着这个交点表示的圆由更多的点组成。我们可以设置一个阈值,来决定多少条曲线交于一点我们才认为检测到了一个圆。

4)这就是霍夫圆变换要做的.。它追踪图像中每个点对应曲线间的交点.。如果交于一点的曲线的数量超过了阈值, 那么可以认为这个交点所代表的参数(a,b,r)在原图像中为一个圆。

apple1.jpg、apple2.jpg识别苹果数量分别为7和25,而理想情况下,苹果数量应该为7、27,识别效果如下:

如果没有看懂,可以去看这篇论文

 matlab代码

% 读取图像
originalImage = imread('D:\课程\数字图像处理\课程设计\image\apple2.jpg');

% 转换为YCbCr颜色空间
ycbcrImage = rgb2ycbcr(originalImage);

% 选择Cr分量
crComponent = ycbcrImage(:,:,3);
%%Y分量
% figure;
% imshow(ycbcrImage(:,:,1));title('Y分量');
%%Cb分量
% figure;
% imshow(ycbcrImage(:,:,2));title('Cb分量');
%%Cr分量
% figure;
% imshow(crComponent);title('Cr分量');

% 对Cr分量进行去噪处理
denoisedImage = medfilt2(crComponent, [3, 3]);
figure;
imshow(denoisedImage);title('去噪处理');

% 对Cr分量进行Otsu分割
threshold = graythresh(denoisedImage);
binaryImage = imbinarize(denoisedImage, threshold);
figure;
imshow(binaryImage);title('Otsu分割');

% 对处理后的Cr分量进行梯度Hough圆变换
[centers, radii, ~] = imfindcircles(binaryImage, [15,23], 'Sensitivity', 0.95);
%apple1  33 50
%apple2 15 23

% 显示原始图像和检测结果
figure;
subplot(1,2,1);imshow(originalImage);title('原始图像');

subplot(1,2,2);imshow(originalImage);
hold on;
viscircles(centers, radii, 'EdgeColor', 'b');
title(['检测到的苹果数目:', num2str(length(radii))]);

  • 20
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值