从稳定的视频裁剪黑色文物

时间:2017-06-06 09:21:57

标签: matlab video video-processing artifacts

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

有没有一种有效的方法来获取没有这些工件的最终视频? 我想过将每一帧剪裁到相同的尺寸,但要知道尺寸必须处理整个视频才能知道最大的渗透率#34;那些文物。

我单独检查了一些帧,我注意到这些伪像是纯黑色(即强度等级为0),如果这样可以使它更容易一些。

感谢。

1 个答案:

答案 0 :(得分: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