2015-11-02 1 views
1

Lors de la réduction du sous-échantillonnage d'un facteur 2 par rapport à l'image, l'image sous-échantillonnée est grise. Que dois-je faire pour ajouter tous les composants de couleur à l'implémentation de downsampling de sorte qu'il s'agisse d'une image en couleur?Pourquoi le sous-échantillon apparaît-il en tant qu'image grise?

I = imread('lena.gif','gif'); 
    [j k] = size(I) 


    x_new = j./2; 
    y_new = k./2; 


    x_scale = j./x_new; 
    y_scale = k./y_new; 


    M = zeros(x_new,y_new); 


    for count1 = 1:x_new 
    for count2 = 1:y_new 
    M(count1,count2) = I(count1.*x_scale,count2.*y_scale); 
    end 
    end 


    figure,imshow(I); 
    title('Original Image'); 
    M = uint8(M); 
    figure,imshow(M); 
    title('Downsample'); 
+0

'M' a juste une couche et il Il n'y a pas d'informations RVB donc il est logique que le résultat soit gris. Vous devriez travailler avec tous les 3 couches si l'image d'entrée. – NKN

+0

Comment puis-je ajouter des infos RVB à M alors? Je suis nouveau au traitement d'image:/@NKN – Blu

+0

pourquoi ne vous utiliserez-vous pas simplement 'imresize' ?? – bla

Répondre

2

images GIF sont ce que l'on appelle indexés images. Cela signifie que ce que vous lisez avec imread sont des valeurs indices à une carte en couleur. Chaque index génère une couleur unique pour vous, et c'est ainsi que les images GIF sont stockées. Ils choisissent parmi un ensemble prédéfini de couleurs et chaque pixel de l'image GIF provient de l'une des couleurs de la palette de couleurs.

Vous devez d'abord convertir l'image en RVB, et vous le faites avec ind2rgb. Cependant, vous devez d'abord lire dans la carte en couleur avec la version à deux sorties de imread. Vous aurez également à convertir les images à uint8 comme de bonnes pratiques avec im2uint8:

[X,map] = imread('lena.gif'); 
I = im2uint8(ind2rgb(X,map)); 

Ce que vous devez faire est ce que suggère @NKN. Vous devez appliquer l'algorithme à tous les canaux. En tant que tel, faites simplement une matrice de sortie qui a trois canaux, et appliquez l'algorithme à chaque plan indépendamment. Si je peux faire une suggestion, en accédant aux pixels de cette façon après le sous-échantillonnage, assurez-vous de floor ou round les coordonnées de l'image pour ne pas spécifier par inadvertance des emplacements qui ne sont pas définis - des choses comme (13.8, 25.5) par exemple. Les emplacements de pixel d'image sont des nombres entiers, vous devez donc vous assurer que les coordonnées sont également des nombres entiers.


[X,map] = imread('lena.gif'); 
I = im2uint8(ind2rgb(X,map)); 

j = size(I,1); %// Change 
k = size(I,2); 

x_new = j./2; 
y_new = k./2; 


x_scale = j./x_new; 
y_scale = k./y_new; 


M = zeros(x_new,y_new,size(I,3)); %// Change 


for jj = 1 : size(I,3) %// Change 
    for count1 = 1:x_new 
    for count2 = 1:y_new 
     M(count1,count2,jj) = I(floor(count1.*x_scale),floor(count2.*y_scale),jj); %// Change 
    end 
    end 
end 


figure,imshow(I); 
title('Original Image'); 
M = uint8(M); 
figure,imshow(M); 
title('Downsample'); 

Pour tester cela, je suis en utilisant l'ensemble de données mandrill qui fait partie de Matlab. C'est une image indexée avec une carte de couleur associée. Ceux-ci sont stockés dans X par hasard et map respectueusement:

load mandrill; 
I = im2uint8(ind2rgb(X,map)); 

Exécution du code modifié, je reçois ces deux chiffres:

enter image description here

enter image description here

+1

le problème est le code qu'il a ne pas down-sample! – NKN

+0

@NKN vous avez raison! J'ai besoin de corriger cela – rayryeng

+1

@NKN ok, on dirait que je l'ai déjà réparé par inadvertance lol. – rayryeng

1

Quand vous lisez l'image originale contient 3 couches, RGB (comme suggéré par @rayryeng:

[X,map] = imread('lena.gif'); 
I = ind2rgb(X,map); 
size(I) 

ans = 

     768  1024   3 

Vous devez effectuer le processus de sous-échantillonnage sur toutes les couches:

Le code que vous avez fourni ne réduit pas l'échantillonnage.Un exemple simple de sous-échantillonnage est le suivant:

imshow(I(1:2:end,1:2:end,:)) 
+2

Ce n'est pas toute l'histoire. Vous devez également lire la carte en couleur à partir de l'image GIF. Cependant, +1 pour le point majeur d'appliquer l'algorithme à chaque plan. – rayryeng

+0

a obtenu votre point de vue grâce @NKN – Blu

+0

@rayryeng droite! – NKN