function out = bayer2rgb(in)

%The first pixel can be either r,b,Gr or Gb. Vary off1 and off2 from
%0 to 1 to try all possibilities
off1 = 0;
off2 = 0;
inD = double(in);
out = inD;

for i=2+off1:2:size(inD,1)-2
    for j=2+off2:2:size(inD,2)-2
        %         RED
        out(i,  j,  1) = (inD(i-1,j,1) + inD(i+1,j,1))/2;
        out(i,  j+1,1) = (inD(i-1,j,1) + inD(i-1,j+2,1) + inD(i+1,j,1) + inD(i+1,j+2,1))/4;
        out(i+1,j,  1) = inD(i+1,j,1);
        out(i+1,j+1,1) = (inD(i+1,j) + inD(i+1,j+2))/2;

        %         GREEN
        out(i,  j,  2) = inD(i,j,1);
        if abs(inD(i-1,j+1,1)-inD(i+1,j+1,1)) < abs(inD(i,j,1)-inD(i,j+2,1))
            out(i,  j+1,2) = (inD(i-1,j+1,1)+inD(i+1,j+1,1))/2;
        else
            out(i,  j+1,2) = (inD(i,j,1)+inD(i,j+2,1))/2;
        end
        if abs(inD(i,j,1)-inD(i+2,j,1)) < abs(inD(i+1,j-1,1)-inD(i+1,j+1,1))
            out(i+1,  j,2) = (inD(i,j,1)+inD(i+2,j,1))/2;
        else
            out(i+1,  j,2) = (inD(i+1,j-1,1)+inD(i+1,j+1,1))/2;
        end
        out(i+1,j+1,2) = inD(i+1,j+1,1);

        %         BLUE
        out(i,  j,  3) = (inD(i,j-1,1) + inD(i,j+1,1))/2;
        out(i,  j+1,3) = inD(i,j+1,1);
        out(i+1,j,  3) = (inD(i,j-1,1) + inD(i,j+1,1) + inD(i+2,j-1,1) + inD(i+2,j+1,1))/4;
        out(i+1,j+1,3) = (inD(i,j+1,1) + inD(i+2,j+1,1))/2;
    end
end