2D Image error correction algorithm(solved)

Started by
3 comments, last by romobomo 11 years, 4 months ago
So I'm having a brainfart at the moment... but here's the synopsis.

In the image below, you'll notice I've circled (in purple) some bits of small color. This image is created using layered perlin noise. This is not done in real-time, and so is not heavily performance reliant... Accuracy is more important. I'm happy with the outcome with the exception of the small bits that I've circled. So I now need an algorithm to either; 1.) Process the image to see if these "errors" exist, and if so produce a new image. or 2.) Process the image and blend the small errors with their larger counterpart (eg. a tiny spec of brown in a big orange section will blend to orange).

Thoughts, Suggestions?

Thanks!

I should add, they're errors because the region of color is too small. So the algorithm's primary function would be to detect the size of the colored region.

EDIT: Solutions can be in any common language (C, C++, C#, JAVA, or even psuedocode), I can work it from there.

[attachment=12862:Untitled.jpg]
Advertisement
Think of a graph whose nodes are the pixels, where two nodes are connected by an edge if they are contiguous and they have the same color. Now identify the connected components of the graph and count their sizes (this can be done with union-find). It shouldn't be too hard to program this, and union-find is fun if you've never seen it before.
Connected Component Labelling is what you want. It is often the basis for many kinds of image analysis. In your case each pixel will be labelled, and you can just measure the area as you label it. For instance, you may keep a vector or map with each label as the index, and increment the area count as you go. Or maybe you could just detect it after the fact - whatever is easiest for you since performance isn't super-critical.

At work we use a super optimized blob detection algorithm. I'm working on something on my own time that, when importing textures, automatically detects where the various textures are on a single image. It uses a customizable flood fill algorithm. The wikipedia article on connected component labelling also has Union-find in it's see-also section, as alvaro mentioned.

You can simply determine the area as you label, whichever method you choose, and if it is too small, I dunno, refill that area with the data from one of the other perlin noise layers bordering it? Not sure how you are getting the image exactly but you'll know the area you need to "fix".
Ah, perfect. That's exactly what I needed. Was just drawing a blank on this one, but I've got it now. Thank you both!
Based on this image, I'm pretty sure you can guess why this was useful.

Thanks again guys.

[attachment=12869:Untitled-1.jpg]

This topic is closed to new replies.

Advertisement