2010-03-15 24 views
4

Je veux faire la moyenne de certaines images .jpg qui sont corrompues par le bruit additif gaussien zéro-moyenne. Après avoir cherché autour, j'ai pensé à ajouter les matrices d'image et diviser la somme par le nombre de matrices. Cependant, l'image résultante est totalement noire. Normalement, lorsque le nombre d'images augmente, l'image résultante s'améliore. Mais quand j'utilise plus d'images, ça devient plus sombre. J'utilise des images .jpg en noir et blanc 800 x 600. Voici le script je:Problème avec la moyenne des images corrompues pour éliminer le bruit dans MATLAB

image1 = imread ('PIC1.jpg'); 
image2 = imread ('PIC2.jpg'); 
image3 = imread ('PIC3.jpg'); 
image4 = imread ('PIC4.jpg'); 

sum = image1 + image2 + image3 + image4; 
av = sum/4; 
imshow(av); 

Répondre

10

Le problème est probablement que les données d'image est tout de type uint8, afin de les ajouter tout provoque une saturation à la valeur de 255 pour les valeurs de pixels, vous donnant un la plupart du temps image blanche qui finit alors par regarder surtout noir lorsque vous divisez ensuite par le nombre d'images. Vous devez convertir vos images à un autre type de données, comme double, puis effectuez votre moyenne, puis reconvertir uint8:

% Load your images: 
image1 = imread('PIC1.jpg'); 
image2 = imread('PIC2.jpg'); 
image3 = imread('PIC3.jpg'); 
image4 = imread('PIC4.jpg'); 

% Convert the images to type double and sum them: 
imageSum = double(image1) + double(image2) + double(image3) + double(image4); 

% Divide by the number of images and convert back to type uint8: 
averageImage = uint8(imageSum./4); 

% Display the averaged image: 
imshow(averageImage); 

SIDE NOTE: Vous devez éviter de donner vos variables les mêmes noms que toutes les fonctions existantes , car cela pourrait causer des problèmes/confusion. C'est pourquoi j'ai changé la variable sum à imageSum (il y a une fonction intégrée sum).

+0

Merci beaucoup! Je devinais quelque chose sur le type des images et en fait je les ai converties en double mais je n'ai pas converti le résultat en UNIT8. Merci encore. – amertkara

7

Une solution de rechange à l'aide IMLINCOMB de la boîte à outils de traitement d'image:

I = imlincomb(0.25,I1, 0.25,I2, 0.25,I3, 0.25,I4); 
+4

La solution imlincomb est sympa car elle ne fait pas de copies d'images à double précision. Et l'image de sortie est du même type que les images d'entrée (uint8), donc vous n'avez pas à vous soucier de la mise à l'échelle. –

+0

+1: Imlincomb() était une nouvelle fonction pour moi. –

2

Vous pouvez également utiliser imagesc (averageImage); Cette fonction avec l'échelle automatique de l'image et ne semblera pas être noir

+0

l'équivalent pour IMSHOW est: 'imshow (averageImage, [])' (attention au problème de saturation lors de la sommation) – Amro