%Kijavítja a képhibákat, például egy összefirkált képet.%

%{
Paraméterek :
 - data : egy szürkeárnyalatos kép mátrixa
 - gray_level1 : alsó színhatár
 - gray_level2 : felsõ színhatár
 - thick : legfeljebb ilyen vastag vonalakat javítunk
Visszatérési érték :
 - M : javított kép mátrixa

Elõfeltételek : 
- Csak szürkeárnyalatos képek feldolgozására alkalmas.
- A kijavítandó hibáknak, pl.: firkálás, szöveg, kivágás, stb, kitüntetett színünek kell lennie.
  Tehát ha például fehér színnel összefirkálunk egy képet és ezt szeretnénk javítani,
  akkor más fehér színû pixel nem lehet a képen, mivel így azokat is módosítanánk az eljárással.
  A kitüntetett színeket a [gray_level1, gray_level2] intervallum határozza meg.

Példák :
    data=imread('lena_inpaint.bmp');
    M=inpaint(data(:,:,1), 255, 255,15);
    imwrite(M,'reconstructed_lena.bmp');
%}

function M=inpaint(data, gray_level1, gray_level2, thick)
[m,n]=size(data);
M=zeros(m,n);
M=data;

%Sorokra%
for i=1:1:m
    l=0;
    for j=1:1:n
        if ~l && gray_level2>=data(i,j) && gray_level1<=data(i,j)
            first=j;
            l=1;
        elseif l && ~(gray_level2>=data(i,j) && gray_level1<=data(i,j))
            last=j-1;
            l=0;
            
            %last-first+1 pixel helyettesítési értéke kell a x0=data(i,first-1) és x1=data(i,last+1) alappontokra illesztett(lineáris) interpolációból.%
            brd=2;
            x0=first-brd;
            x1=last+brd;
            y0=data(i,first-brd);
            y1=data(i,last+brd);
            if (last-first+1)<thick
                M(i,first-brd:last+brd)=uint8(newton_alak([x0,x1],[y0,y1],1));            
            end
        end
    end
end

%Oszlopokra%
for j=1:1:n
    l=0;
    for i=1:1:m
        if ~l && gray_level2>=M(i,j) && gray_level1<=M(i,j)
            first=i;
            l=1;
        elseif l && ~(gray_level2>=M(i,j) && gray_level1<=M(i,j))
            last=i-1;
            l=0;
            
            %last-first+1 pixel helyettesítési értéke kell a x0=data(i,first-1) és x1=data(i,last+1) alappontokra illesztett(lineáris) interpolációból.%
            brd=2;
            x0=first-brd;
            x1=last+brd;
            y0=M(first-brd,j);
            y1=M(last+brd,j);            
            if (last-first+1)<thick
                M(first-brd:last+brd,j)=uint8(newton_alak([x0,x1],[y0,y1],1));          
            end
        end
    end
end
%Medián szûrõ alkalmazása az esetleges fehér pontok eltüntetésére.%
M=medfilt2(M);