Color quantizing an image using K-means clustering (using RGB functions)

Is clustering possible for RGB + spatial functions of images using Matlab?

NOTE. I want to use kmeans

for clustering.

Actually, basically, I want to do one thing, I want to get this image

enter image description here

from this

enter image description here

+3


source to share


1 answer


I think you are looking for color quantization.

[imgQ,map]= rgb2ind(img,4,'nodither'); %change this 4 to the number of desired colors
                                       %in quantized image
imshow(imgQ,map);

      

Result:

Quantized image

Usage kmeans

:

%img is the original image

imgVec=[reshape(img(:,:,1),[],1) reshape(img(:,:,2),[],1) reshape(img(:,:,3),[],1)];
[imgVecQ,imgVecC]=kmeans(double(imgVec),4); %4 colors
imgVecQK=pdist2(imgVec,imgVecC); %choosing the closest centroid to each pixel, 
[~,indMin]=min(imgVecQK,[],2);   %avoiding double for loop

imgVecNewQ=imgVecC(indMin,:);  %quantizing
imgNewQ=img;
imgNewQ(:,:,1)=reshape(imgVecNewQ(:,1),size(img(:,:,1))); %arranging back into image
imgNewQ(:,:,2)=reshape(imgVecNewQ(:,2),size(img(:,:,1)));
imgNewQ(:,:,3)=reshape(imgVecNewQ(:,3),size(img(:,:,1)));

imshow(img)
figure,imshow(imgNewQ,[]);

      



Result kmeans

:

Quantized image by <code> kmeans </code>
      <br>
        <script async src=
" data-src="/img/37e4c4e9736b8df64cf9b4d24c2e1301.jpg" class=" lazyloaded" src="https://fooobar.com//img/37e4c4e9736b8df64cf9b4d24c2e1301.jpg">

If you want to add a distance limit to kmeans

, the code will be slightly different. Basically, you also need to concatenate the pixel coordinates of the corresponding pixels. But remember that when assigning the nearest centroid, assign only a color to each pixel, i.e. The first 3 dimensions, not the last 2. This clearly doesn't make sense. The code is very similar to the previous one, pay attention to the changes and understand them.

[col,row]=meshgrid(1:size(img,2),1:size(img,1));
imgVec=[reshape(img(:,:,1),[],1) reshape(img(:,:,2),[],1) reshape(img(:,:,3),[],1) row(:)   col(:)];
[imgVecQ,imgVecC]=kmeans(double(imgVec),4); %4 colors
imgVecQK=pdist2(imgVec(:,1:3),imgVecC(:,1:3));

[~,indMin]=min(imgVecQK,[],2);
imgVecNewQ=imgVecC(indMin,1:3);  %quantizing
imgNewQ=img;
imgNewQ(:,:,1)=reshape(imgVecNewQ(:,1),size(img(:,:,1))); %arranging back into image
imgNewQ(:,:,2)=reshape(imgVecNewQ(:,2),size(img(:,:,1)));
imgNewQ(:,:,3)=reshape(imgVecNewQ(:,3),size(img(:,:,1)));

imshow(img)
figure,imshow(imgNewQ,[]);

      

kmeans

Distance limited result :

enter image description here

+6


source







All Articles