使用阈值处理的对象检测

N4L*_*4LN 3 matlab image-processing threshold

我正在使用matlab编写一个程序来检测一系列图像中的对象.我试图探测到一个红球的对象.

在此输入图像描述

首先,我尝试使用阈值来分割图像中的球,但我不能这样做.我无法摆脱球下的影子.任何想法如何摆脱球下的小部分?

在此输入图像描述

我的第二个问题是,我想确保我正在寻找的物体是一个红球.我的代码将检测到任何红色对象,我想确保它是一个圆圈.

我的代码:

I1 = imread('images/B1.jpg'); % read image            

ID1 = im2double(I1);  % convert to double 
IDG1 = rgb2gray(ID1); % conver to gray scale

t = 112; % set a thresholding value

IT = im2bw(IDG1, t/255); % apply the threshold

I2 = ~IT; % get a nigative image

I3 = bwareaopen(I2,40); % get rid of small unwanted pixels 

I4 = imclearborder(I3); % clear pixels of the borders

I5 = bwareaopen(I4,60); % get rid of small unwanted pixels

I6 = imfill(I5,'holes'); % fill the gap on the ball top part

I7 = imclearborder(I6); % get rid of small unwanted pixels
Run Code Online (Sandbox Code Playgroud)

Raf*_*iro 8

也许将图像从RGB转换为HSV可能是一个好主意.

img = im2double(imread('http://i.stack.imgur.com/D3Zm7.jpg'));
imgHSV = rgb2hsv(img);
Run Code Online (Sandbox Code Playgroud)

让我们显示H仅包含颜色信息的部分:

imshow(imgHSV(:,:,1))
colormap('hsv')
colorbar;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

请注意,红色部分分布在光谱的极端.让我们尝试使用经验值对其进行阈值处理(通过查看条形图,我们可以首先猜测一些"好"值):

BW = imgHSV(:,:,1) < 0.05 | imgHSV(:,:,1) > .15;
Run Code Online (Sandbox Code Playgroud)

并显示结果:

imshow(BW);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

没有更多的阴影!:)

  • 你可以简单地使用`edge`然后循环Hough变换http://www.mathworks.com/help/images/ref/imfindcircles.html (2认同)