Archive for December 2010
Approach to count dominant colors in a image
This will be a small post that give some brief idea about how to calculate dominant colors in a image. Before going in further details I wanted to explain some background of my problem. The project I currently working on needs to count colors in a image. The count should not take all the different colors in the image, that means it should merge similar colors and count it as one. For e.g if there is a Red and light red then the count should be one, i.e Red. Just like human eye counts colors.
To solve the issue I tried different approach including Histogram quantization and several other approach. But nothing worked well. Then thought of applying some algorithm I come across when I was doing some research in collective intelligence, Euclidean distance algorithm and KMeans clustering algorithm.
This is how I solved the issue.
Step 1: Scan through the image and get all the pixels. Group similar pixels and also increase the count. I use a hash table for grouping. After the scanning I will get a hash table with all the colors and the count of each colors.
Step 2: Find out the dominant colors using the pixel count and remove the nearest pixels. To find the nearest color in the same domain I use Euclidean distance algorithm. I meant by dominant color is the color that has more pixel count. While removing the color, we should not remove the dominant color.
Step 3: The above step still will not give accurate results, this step 2 result will just a give a starting point for color count. I use the result from Step 2 as the cluster for applying KMeans clustering algorithm. For clusters take only the top n higher pixel counted colors from Step 2. Apply the clustering on the pixel data we got from Step 1.
Step 4: Apply the Euclidean distance on the result we got from Step 3. The result will be closer to the count of colors in the image. You can tweak to get closer result by increasing or decreasing the distance cutoff value.
I tested this method with images with less size, it may have worst performance in big images. There may be different more accurate method might be their. I cant do much with my limited knowledge on Image processing.
I will be more happy if any one can provide me a better approach. You can add it to the comment section.
Using await in real world asynchronous programming–Part 2
This is the continuation to my previous post related to new async ctp. In the previous post I explained the use of await using a webclient. This post I am going to explain how can we use await in real life scenario. In real life you may not only deal with webclient, you may wanted to do a time consuming database call or you wanted to do some time consuming process or whatever in asynchronous manner, at the same time our UI should be responsive.
I did a lot of search to find a scenario to deal expensive process other than calling a webclient but no use. So I thought it will be good to post some real life scenario as most of the blogs explain the async ctp with webclient or in some complex way that person like me cant understand.
Async CTP simplify the way we write asynchronous methods, with async ctp no BeginXXX and no EndXXX. So let’s go through the scenario with a small intro.
Currently am in the process of rewriting one of my app called iTraveller. My prime focus is a very responsive UI with less app loading time. The app requires to load categories and lot of thumbnails at startup. I am doing lot of these process at startup and if we do it synchronously it will affect the application startup speed. When async CTP launched, I jumped into to it, because I know that it’s very useful for me.
Below is a piece of code we normally write to load some data from a database.
public List<LocalCategory> GetAllCategories() { IRepository repository = GenericRepository.GetRepositoryInstance(); return repository.GetAll<LocalCategory>().ToList<LocalCategory>(); }
Here I used the Generic repository model I explained earlier in my blog. The above method is a synchronous call and the caller should wait till the db calls complete. Am going to rewrite the above method in async mode.
public async Task<List<LocalCategory>> GetAllCategoriesAsync() { IRepository repository = GenericRepository.GetRepositoryInstance(); return await TaskEx.Run(() => { //write the time consuming process here return repository.GetAll<LocalCategory>().ToList<LocalCategory>(); }, System.Threading.CancellationToken.None); }
Here I converted a synchronous method to an asynchronous one, It’s as simple as that. Let’s see how can we call the above method.
private async void LoadExistingCategory() { CategoryService categoryService = new CategoryService(); var categoriesTask=await categoryService.GetAllCategoriesAsync(); this.ExistingCategories = categoriesTask.ToList<LocalCategory>(); }
You can call the async method in button event handler or where ever you want to call. But the caller should marked as async, the above method I added async just after the private.
LocalCategory is one of my entity class in the application.
I wrote a very expensive Euclidean distance algorithm using async mode and it worked very well. The same without async will keep the UI busy for two seconds and the user will be blocked from doing any action.