Applying Threshold to Video Pixels

7 Ansichten (letzte 30 Tage)
Chris Clementson
Chris Clementson am 1 Feb. 2018
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);

Antworten (3)

Image Analyst
Image Analyst am 1 Feb. 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 Kommentare
Image Analyst
Image Analyst am 2 Feb. 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.
Chris Clementson
Chris Clementson am 2 Feb. 2018
Luma = luminance, the "Y" in YUV.
As I posted previously, if none of the R, G or B components exceeds 235, the luminance will not exceed 235 after the coefficients are applied. It is a simple calculation.
I suspect these artifacts may be caused by the x264 encoder, not by matlab.

Melden Sie sich an, um zu kommentieren.


Jose Marques
Jose Marques am 1 Feb. 2018
Try to transform the image in a double matrix. readFrame gives a uint8 output.

Chris Clementson
Chris Clementson am 1 Feb. 2018
Do you mean an array of doubles?
Video data is commonly uint8, i.e. 8-bit integers for RGB or YUV. There is no need to use doubles. All of the values are in the range 0 - 255.
  1 Kommentar
Jose Marques
Jose Marques am 1 Feb. 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;

Melden Sie sich an, um zu kommentieren.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by