【问题标题】:Crop black artifacts from stabilized video [closed]从稳定的视频中裁剪黑色伪影[关闭]
【发布时间】:2017-06-06 09:21:57
【问题描述】:

我有一个需要用 matlab 稳定的视频。 我设法得到了一个稳定的视频,但它的帧边缘有一些黑色伪影(可以看到一个例子here - 这不是我的视频,但有同样的问题)。

有没有一种有效的方法来获得没有这些伪影的最终视频? 我曾考虑将每一帧裁剪为相同的大小,但要知道该大小,必须处理整个视频才能知道这些伪影的最大“穿透”。

我单独检查了一些帧,我注意到伪影是纯黑色的(即强度级别为 0),如果这样更容易一些的话。

谢谢。

【问题讨论】:

  • 裁剪对我来说似乎是个好主意。如果您想知道确切的最大穿透力,您确实应该首先处理整个视频。作为替代方案,您可以根据您对正在处理的电影的先验知识使用固定渗透。我建议你试一试。
  • 是的,要知道大小,你需要看到整个视频,它周围没有。

标签: matlab video video-processing artifacts


【解决方案1】:

以防万一有人在某个时候发现它有用 - 我想出了这个实现(解决方案主要基于 this 答案(最后一部分),它回答了关于单个图像的类似问题......) :

function [] = stabilizeVideo(fileName)

    % open video reader and writer
    InputVid = vision.VideoFileReader(fileName);
    StabilizedVid = vision.VideoFileWriter('StabilizedVidWithArtifacts.avi');


    leftPent = 0;
    upPent = 0;
    [downPent, rightPent] = size(imgB);

    % any initialization you might need...

    while ~isDone(InputVid)
        % Stabilize frame... the warped frame is called 'imgBp'
        % write the warped frame to the video
        step(StabilizedVid,imgBp);

        % now the magic happens:    
        [up, down, left, right] = FindMaxArtifactPenetration(imgBp);
        leftPent = max(left, leftPent);
        rightPent = min(right, rightPent);
        upPent = max(up, upPent);
        downPent = min(down, downPent);        

    end
    release(InputVid);
    release(StabilizedVid);
    cropArtifacts(upPent, downPent, leftPent, rightPent);
    display(num2str(toc));
end

我写了那些辅助函数:

function [up, down, left, right] = FindMaxArtifactPenetration(I)
    % allow RGB or grayscale image
    if size(I,3)==3
        I1 = rgb2gray(I);
    else
        I1 = I;
    end

    nonZeroCols = find(any(I1)); % find non-zero cols
    left = min(nonZeroCols); 
    right = max(nonZeroCols); 
    I2 = I1(:, left : right, :);
    nonZeroRows = find(any(I2, 2)); % find non-zero rows
    up = min(nonZeroRows); 
    down = max(nonZeroRows);
end

function [] = cropArtifacts(minRow, maxRow, minCol, maxCol)

    % reload video with artifacts, crop every frame and save it in the 
    % new video
    InputVid = vision.VideoFileReader('StabilizedVidWithArtifacts.avi');
    StabilizedVid = vision.VideoFileWriter('StabilizedVid.avi');
    while ~isDone(InputVid)
        frame = step(InputVid);
        step(StabilizedVid, frame(minRow:maxRow, minCol:maxCol, :));
    end
    release(InputVid);
    release(StabilizedVid);

end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2017-04-29
    • 1970-01-01
    • 2020-03-20
    • 2020-08-06
    相关资源
    最近更新 更多