Search code examples
matlabimage-processingmatlab-cvst

Frames of type double must be in the range of 0 to 1: MATLAB


I have a video and I have made a Sobel mask for it on MATLAB. Now I have to apply that Sobel mask on each frame of the video by reading each frame through for loop. The process is something like:

  • Step 1: Reading frame.
  • step 2: Converting it to grayscale using rgb2gray.
  • Step 3: Converting it to double.

Here, after applying the mask when I try to write the frame on the resultant video.avi file, I get the following error:

"Frames of type double must be in the range of 0 to 1"

What is wrong with my code? The code I wrote is shown below:

vid = VideoReader('me.mp4');
frames = read(vid);
total = get(vid, 'NumberOfFrames');
write = VideoWriter('me.avi');
open(write);
mask1 = [-1 -2 -1; 0 0 0; 1 2 1]; % Horizontal mask
mask2 = [-1 0 1; -2 0 2; -1 0 1]; %Vertical Mask
for k = 1 : 125
    image = frames(:,:,:,k);
    obj = image;
    obj1 = rgb2gray(obj);
    obj2=double(obj1);
    for row = 2 : size(obj2, 1) - 1
        for col = 2 : size(obj2, 2) - 1
            c1 = obj2(row - 1, col - 1) * mask1(1 ,1);
            c2 = obj2(row - 1, col) * mask1(1 ,2);
            c3 = obj2(row - 1, col + 1) * mask1(1 ,3);
            c4 = obj2(row, col - 1)*mask1(2, 1);
            c5 = obj2(row, col)*mask1(2, 2);
            c6 = obj2(row, col + 1)*mask1(2, 3);
            c7 = obj2(row + 1, col - 1)*mask1(3,1);
            c8 = obj2(row + 1, col)*mask1(3,2);
            c9 = obj2(row + 1, col + 1)*mask1(3,3);
            c11 = obj2(row - 1, col - 1)*mask2(1 , 1);
            c22 = obj2(row, col - 1)*mask2(2, 1);
            c33 = obj2(row + 1, col - 1)*mask2(3, 1);
            c44 = obj2(row -1, col)*mask2(1, 2);
            c55 = obj2(row, col)*mask2(2 , 2);
            c66 = obj2(row +1, col)*mask2(2 , 3);
            c77 = obj2(row - 1, col + 1)*mask2(1 , 3);
            c88 = obj2(row, col +1)*mask2(2 , 3);
            c99 = obj2(row + 1, col + 1)*mask2(3 , 3);
            result = c1 + c2 + c3 +c4 +c5+ c6+ c7+ c8 +c9;
            result2 = c11 + c22 + c33 + c44 + c55 + c66 + c77 + c88 + c99;
            %result = double(result);
            %result2 = double(result2);
            rim1(row, col) = ((result^2+result2^2) *1/2);
            rim2(row, col) = atan(result/result2);
        end
    end
    writeVideo(write, rim2); %This line has the problem with rim2 as rim2 is the frame i'm trying to write on the video file.
end
close(write);

Solution

  • rim2 has range [-pi/2, pi/2] at the end, which is not compatible with the write function which expects [0,1] range. Convert it to [0,1] range using the mat2gray function, i.e.

    writeVideo(write, mat2gray(rim2));
    

    Your code will then work as expected (confirmed on my machine).

    By the way, this doesn't affect your code, but presumably you meant to do im2double(A) rather than double(A). The former produces a "proper" grayscale image in the range [0,1], whereas the latter simply converts your uint8 image in the range [0,255] to double format (i.e. [0.0, 255.0]).