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:
'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
Comment puis-je ajouter des infos RVB à M alors? Je suis nouveau au traitement d'image:/@NKN – Blu
pourquoi ne vous utiliserez-vous pas simplement 'imresize' ?? – bla