# Which way the whale is moving

I am trying to find out which way the whale is moving. So I have an image of the whale swimming in the water and I want to find out where is it located and which direction does it swim (with respect to X/Y coordinates of the image).

For example here the angle is approximately 30 degrees in respect to X coordinate.

So my idea was to use canny edge detection to extract edges, construct a matrix from the points of the edges, calculate SVD and use the U matrix from SVD as a rotation matrix to get the angle.

So I have done something like this in python:

Where the first image is the starting image, the second one is the edges, and the third one is the scatterplot with points from the edges and the red arrow is a direction of the angle I got from the SVD. The angles I got

Angle 146.73
Angle 135.08


are not even close to real angles (which are approximately 30 and 85 degrees).

I have tested that I get a correct angle when I SVD the gaussian matrix, which I rotated by some degree.

This is my first post, so if you need some clarifications (code that I used, explanation why I think this approach will work or anything else), please let me know.

So am I on the right track to find where the whale is going (and just made some silly mistake) or should I use another idea?

• Hi. You mentioned using color separation (red channel) to try to improve the contrast. Did you look at HSV or CMYK? I had a quick look, and both the saturation from HSV or the Cyan-K from CMYK give really high contrast on the whale. Both turn the whale black and the water light colored. Might be of some help in getting better edge detection. – JRE Sep 8 '15 at 7:41
• @JRE Actually I just took R component from RGB matrix of the image. Can you please share the implementation you used? – Salvador Dali Sep 8 '15 at 7:45
• All I did was use GIMP to separate the colors to see what kind of contrast I could get. It looks like you are using Matlab. There are various functions in the Image Processing Toolbox for doing colorspace changes. See manual here: mathworks.com/help/images/color.html?nocookie=true – JRE Sep 8 '15 at 7:56
• @JRE thanks will try to investigate this approach – Salvador Dali Sep 8 '15 at 8:00

I wouldn't rely on edges as they are not connected and foam/waves also generate them.

I would rely on the contrast between the colors of skin, water and foam, to get a solid blob.

Possibly a two step process: discard the more saturated pixels (the sea), then among the achromatic keep the dark ones. After experimenting I saw that erosion can be useful to get rid of unwanted residues.

In the end you should get a big blob, and determine its dominant orientation (equivalent ellipse of inertia, Feret diameter, most distant points...)

Unsaturated pixels:

Dark pixels:

Combination:

Eroded:

Blobs and ellipse of inertia:

As there is a risk of blob fragmentation, you can consider merging the largest blobs.

My approach:

1. Preprocess your image to maximize contrast: for a start, this might really just be the red channel for example, but my gut feeling is that you can transform the image to a different color model and e.g. use luminance instead, and get higher contrast. Low pass to suppress fotographic noise.
2. Edge detection is a good approach, but I'd just go for the high-pass version of the image. Threshold if appropriate. Cut down if appropriate.
3. Use Principal Component Analysis to find the main direction of that, i.e. the vector which points in the direction where the highest variance in values is.
• My first approach also was about red channel, but I found that it is not really different even from blue channel (which was surprising for me be because I guessed that blue is all over the place and irrelevant). – Salvador Dali Sep 8 '15 at 7:30
• In my opinion, working on the luminance is the worst choice. It makes the whale almost invisible. Red is a little better. – Yves Daoust Oct 8 '15 at 9:16
• @YvesDaoust well, in the case, since most sensible color models try to find orthogonal bases in color space , linear algebra says that if the information in the luminance is minimal, the information contained in the other channels is maximized :) – Marcus Müller Oct 9 '15 at 8:15