Subtract average image from a series of images
3 次查看(过去 30 天)
显示 更早的评论
I'm having some difficulty subtracting an averaged image from a series of images from which the average was obtained. The images have been obtained from a MP4 video file.
This is what i have done:
Ven23 = VideoReader('MyVideo23.MP4'); %Read in the video file
Ven23frame1 = read(Ven23,1); % Read in the first frame of the video
sumImage23 = im2double(Ven23frame1); %Double the accuracy of the frame
for i=2:30
Ven23Frames= read(Ven23,i);
sumImage23 = sumImage23 + im2double(Ven23Frames);
end
avgVen23= imshow(sumImage23/30);
This all seems to work; I get an image which looks like the average. However, whenever I try to subtract this average image from any particular frame from the video I get this error:
Undefined operator '-' for
input arguments of type
'matlab.graphics.primitive.Image'.
Then I tried to save the average image and frames as bmp files, load them back in and subtract them. Doing this just returns a black screen. I also tried doubling the accuracy of the reloaded images to no avail.
I'm obviously doing something wrong and I would be grateful if anyone could point it out to me. Thanks.
3 个评论
采纳的回答
Guillaume
2016-3-2
In view of the error, I would suspect that you're trying to subtract your mean image from a variable called exactly image. Unfortunately, at the point where you're doing the subtraction, the variable image does not exist, so instead matlab calls the function image which returns an object of type 'matlab.graphics.primitive.Image'. Subtraction is not defined for that (a graphics object), hence the error message. At the same time, you probably have an upside down picture of a boy's head popping up in a figure.
In conclusion:
- you have a bug in that you're using a variable you've never defined. Can't help you more, since you didn't show that part of the code.
- do not name your variable image
10 个评论
Guillaume
2016-3-3
I suspect that
class(Ven23frame2)
class(avgVen23)
will return 'uint8' and 'double' respectively, since the min/max in the first case (with double) is not an integer. That means you didn't use
avgVen23 = mean(read(Ven23, [1 30]), 4, 'native')
to generate the mean image but some other way, where at some point you converted the image with im2double.
You need to learn the difference between the classes of arrays, what arithmetic operations are possible with them and the effect it has on display.
An array can be of class uint8. That means pixel values are in the range 0-255. When you imshow such an array (without using [] in the imshow call), matlab assumes that range and display 0 as black and 255 as white. It's not a good idea to perform arithmetic on uint8 arrays as any result below 0 gets clamped to 0 and any result above 255 gets clamped to 255.
If the array is of class double. imshow (and most image processing functions) assume that the intensities are in the range 0-1. 0 and anything below 0 gets displayed as black, 1 and anything higher gets displayed as white.
If you convert a uint8 array to double using double(img), the intensities do not change (they're still in the range 0-255) and if you try to display that, because it is double intensities 1 to 254 will show as white. im2double on the other hand rescale the intensities in the range 0-1.
To avoid all this trouble with display always use imshow with []. It will use whatever range is in the array:
imshow(img , [])
When you do the min/max difference with im2double the difference is 0.1, which is 10% of the intensity range (0-1), so you should see some colour.
If you don't get anywhere, attach save the output of
read(Ven23, [1 30])
in a mat file and post that.
更多回答(0 个)
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!