views:

140

answers:

2

I want to average some .jpg images which are corrupted by zero-mean Gaussian additive noise. After searching around, I figured out to add the image matrices and divide the sum by the number of matrices. However, the resultant image is totally black. Normally when the number of image increases then the resultant image gets better. But when I use more images it gets darker.

I am using 800x600 black and white .jpg images. Here is the script I used:

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);
+7  A: 

The problem is probably that the image data is all of type UINT8, so adding them all up causes a saturation at the value of 255 for the pixel values, giving you a mostly white image which then ends up looking mostly black when you then divide by the number of images. You should convert your images to another data type, like DOUBLE, then perform your averaging, and then convert back to 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: You should avoid giving your variables the same names as any existing functions, since this could cause problems/confusion. This is why I changed the variable sum to imageSum (there is a built-in function SUM).

gnovice
Thank you so much mate! I was guessing something about the type of the images and actually i converted them to the double but I didnt convert the result back to UNIT8. Thanks again.
Mertie Pertie
+5  A: 

An alternative solution using IMLINCOMB from the image processing toolbox:

I = imlincomb(0.25,I1, 0.25,I2, 0.25,I3, 0.25,I4);
Amro
The imlincomb solution is nice because it doesn't make any double-precision image copies. And the output image is the same type as the input images (uint8), so you don't have to worry about the scaling.
Steve Eddins
+1: imlincomb() was a new function for me.
kigurai