Applying Threshold to Video Pixels
7 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
This code isn't working for me. I'm trying to limit video pixel values to 235, yet I am still getting pixels in the range 235 - 255 leaking through. Am I applying thresholding correctly?
I get a playable video with this code.
Vptr = VideoReader('Normal.mp4');
img = zeros([Vptr.height,Vptr.width,3]);
writer = VideoWriter('transcoded_xylophone.avi', 'Uncompressed AVI');
writer.FrameRate = reader.FrameRate;
open(writer);
%Read and write each frame.
while hasFrame(Vptr)
img = readFrame(Vptr);
% perform thresholding by logical indexing
img(img>235) = 235;
writeVideo(writer,img);
end
close(writer);
0 commentaires
Réponses (3)
Image Analyst
le 1 Fév 2018
It has nothing to do with double. The first call to set img with the zeros() function is totally ignored. The code works, though I did have to change reader.FrameRate to Vptr.FrameRate since the is no "reader" variable in your code. I ran it with the rhinos.avi demo video and it works fine, clipping the values to 235 as desired. See this code:
Vptr = VideoReader('Rhinos.avi');
writer = VideoWriter('delete_me.avi', 'Uncompressed AVI');
writer.FrameRate = Vptr.FrameRate;
open(writer);
% Read and write each frame.
frameCounter = 1;
while hasFrame(Vptr)
thisFrame = readFrame(Vptr); % This is a uint8 variable.
% perform thresholding by logical indexing
thisFrame(thisFrame>235) = 235;
fprintf('For frame #%d, the max value = %d\n', frameCounter, max(thisFrame(:)))
writeVideo(writer,thisFrame);
frameCounter = frameCounter + 1;
end
close(writer);
9 commentaires
Image Analyst
le 2 Fév 2018
Not sure what luma is. Luminance? Lightness? Anyway, if you want to make sure that the weighted value of RGB doesn't exceed 235 then you need to convert to a color space where luminance is an axes. So you can use rgb2lab() and clip the L value to 235/255, or use rgb2hsv() and clip the v channel, or use rgb2ycbcr() and clip the y channel. Then use the companion function to convert the image back into RGB color space.
Jose Marques
le 1 Fév 2018
Try to transform the image in a double matrix. readFrame gives a uint8 output.
Chris Clementson
le 1 Fév 2018
1 commentaire
Jose Marques
le 1 Fév 2018
That's right... Look: just to be sure, try to add this code on yours:
% perform thresholding by logical indexing
img(img>235) = 235;
max_value = max(max(max(img)))
pause;
Voir également
Catégories
En savoir plus sur Computer Vision with Simulink dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!