Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Detecting a blob of color in an image

I have an image that is a depth heatmap that I've filtered out anything further away than the first 25% of the image.

It looks something like this: enter image description here

There are two blobs of color in the image, one is my hand (with part of my face behind it), and the other is the desk in the lower left corner. How can I search the image to find these blobs? I would like to be able to draw a rectangle around them if possible.

I can also do this (ignore shades, and filter to black or white): enter image description here

like image 251
Malfist Avatar asked Jan 24 '11 19:01

Malfist


4 Answers

Pick a random pixel as a seed pixel. This becomes area A. Repeatedly expand A until A doesn't get any bigger. That's your area.

The way to expand A is by looking for neighbor pixels to A, such that they have similar color to at least one neighboring pixel in A.

What "similar color" means to you is somewhat variable. If you can make exactly two colors, as you say in another answer, then "similar" is "equal". Otherwise, "similar" would mean colors that have RGB values or whatnot where each component of the two colors is within a small amount of each other (i.e. 255, 128, 128 is similar to 252, 125, 130).

You can also limit the selected pixels so they must be similar to the seed pixel, but that works better when a human is picking the seed. (I believe this is what is done in Photoshop, for example.)

This can be better than edge detection because you can deal with gradients without filtering them out of existence, and you don't need to process the resulting detected edges into a coherent area. It has the disadvantage that a gradient can go all the way from black to white and it'll register as the same area, but that may be what you want. Also, you have to be careful with the implementation or else it will be too slow.

like image 69
jprete Avatar answered Nov 06 '22 12:11

jprete


It might be overkill for what you need, but there's a great wrapper for C# for the OpenCV libraries.

I have successfully used OpenCV in C++ for blob detection, so you might find it useful for what you're trying to do.

http://www.emgu.com/wiki/index.php/Main_Page

and the wiki page on OpenCV:

http://en.wikipedia.org/wiki/OpenCV

Edited to add: Here is a blobs detection library for Emgu in C#. There is even some nice features of ordering the blobs by descending area (useful for filtering out noise).

http://www.emgu.com/forum/viewtopic.php?f=3&t=205

Edit Again:

If Emgu is too heavyweight, Aforge.NET also includes some blob detection methods

http://www.aforgenet.com/framework/

like image 41
mfanto Avatar answered Nov 06 '22 12:11

mfanto


If the image really is only two or more distinct colours (very little blur between colours), it is an easy case for an edge detection algorithm.

like image 42
Femaref Avatar answered Nov 06 '22 11:11

Femaref


You can use something like the code sample from this question : find a color in an image in c#

It will help you find the x/y of specific colors in your image. Then you could use the min x/max x and the min y/max y to draw your rectangles.

like image 34
brendan Avatar answered Nov 06 '22 12:11

brendan