# How can I properly detect a ball moving in a film capture?

I have problem in detecting a ball moving in a flume (image below).

since converting the frames into grayscale format didn't work I converted it into rgb and make it more saturated. problems are: 1- in the first frames which ball is in the right position, light disturbed the ball detection (image subtraction didn't work well) So I did it without subtraction.

this is my problem in detecting the ball in the first frames. in the rest frames the problem is its shadow and the white dots on the ball. I can't see the exact ball to find it's exact position in each frame (its shadow lead to some uncertainties)

anyway, I'm using matlab. I shared the code below (subtraction is not working well because of light, note that ball moves since water make it move in the flume).

Any Ideas about how can I detect the ball more precisely? handle the light in the first frames? handle the ball's shadow?

% the code starts

I=lensdistort(I,-0.3);
I2=imcrop(I, [263.5 85.5 1468 940]);
I2=imrotate(I2,-1,'bilinear','crop');
I2=rgb2hsv(I2);
I2(:,:,2)=I2(:,:,2)*1.9;
I3=I2(:,:,1)>0.57 & I2(:,:,1)<0.75;
I4=bwareaopen(I3,200);
I4=medfilt2(I4);
I4=imfill(I4,'holes');
str=strel('disk',1);
I5=imdilate(I4,str);
I5=I5-I4;
e = edge(I5, 'canny');
h = circle_hough(e, radii, 'same', 'normalise');
[~,maxIndex] = max(h(:)); %find the global maximum of your accumulator array
[i,j,k] = ind2sub(size(h), maxIndex);
center.x = j;
center.y = i;
N = 200;
theta=linspace(0,2*pi,N);
[X,Y] = pol2cart(theta,rho);
cent(1,:)=[j,i]; % centroid of the ball in each frame

% code finished

If you have any idea for a better ball detection in my situation I will be grateful.

P.S. I removed the images since I didn't have the reputation needed to post more than 2 images

• Are the backgrounds always composed of such textures with repetitive structures? Commented Jan 18, 2017 at 11:09
• the background is without the exposed ball. but when water moves, light will disturb the exact subtraction. Commented Jan 18, 2017 at 11:23
• can you post the video? Commented Jan 14, 2018 at 12:33
• Your second picture, with the ball under a reflection, is going to be difficult no matter what. Even for human eyes, and vision systems with 500 million years of evolutionary pressure, it's difficult. So if you can -- change the lighting (maybe a screen over the tank?) and film some more. Commented Nov 29, 2020 at 19:54
• I think a good rules-based approach would be to convert to HSV, segment the image based on the ball's hue, and then reject any object that doesn't have enough connected pixels in a small enough space (in case there's blue stones in there). You should end up with a circle with holes in it (because of the white dots), and maybe some excrescences if there's blue stones in there that look like ball. Then do a best fit for a circle of about the right size to get the actual position of the ball. Commented Nov 29, 2020 at 19:58