フィルターのクリア

Applying Threshold to Video Pixels

8 ビュー (過去 30 日間)
Chris Clementson
Chris Clementson 2018 年 2 月 1 日
コメント済み: Chris Clementson 2018 年 2 月 2 日
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);

回答 (3 件)

Image Analyst
Image Analyst 2018 年 2 月 1 日
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 件のコメント
Image Analyst
Image Analyst 2018 年 2 月 2 日
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 2018 年 2 月 2 日
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.

サインインしてコメントする。


Jose Marques
Jose Marques 2018 年 2 月 1 日
Try to transform the image in a double matrix. readFrame gives a uint8 output.
  1 件のコメント
Jose Marques
Jose Marques 2018 年 2 月 2 日
Bad answer! = )

サインインしてコメントする。


Chris Clementson
Chris Clementson 2018 年 2 月 1 日
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 件のコメント
Jose Marques
Jose Marques 2018 年 2 月 1 日
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;

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeConvert Image Type についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by