Фильтр изображения - свертка

Я пытаюсь реализовать фильтр изображений (используя конвульсию). Я провел весь день, пытаясь выяснить, что происходит, и я не могу найти ошибку. Фильтр работает только тогда, когда я использую его для размытия изображения. В других случаях это не работает должным образом: например, это оригинальное изображение (до фильтрации):

Картинка перед фильтрацией

И это картина после фильтрации по этой матрице:

картина после тиснения фильтра

Я использую Marvin Image Processing Framework и библиотеку jblas в своем коде:

  public class FiltrySploty extends MarvinAbstractImagePlugin {
@Override
public void load() {
}

@Override
public MarvinAttributesPanel getAttributesPanel() {
    return null;
}

@Override
public void process(
        MarvinImage imageIn,
        MarvinImage imageOut,
        MarvinAttributes attributesOut,
        MarvinImageMask mask,
        boolean previewMode) {

    double norm=0;

    DoubleMatrix filter = (DoubleMatrix)getAttribute("filter");

    for ( int i = 0; i < filter.getRows();i++)
    {
        for ( int j = 0; j < filter.getColumns();j++)
        {
            norm=norm+filter.get(i, j); 

        }
    }

    int marginx = ((filter.getRows()-1)/2);
    int marginy = ((filter.getColumns()-1)/2);


    for (int x = marginx; x < imageIn.getWidth()-marginx; x++) {
        for (int y = marginy; y < imageIn.getHeight()-marginy; y++) {                
            double SumRed=0;
            double SumGreen=0;
            double SumBlue=0;
            for ( int i = x-marginx,k=0 ; k < filter.getRows();i++,k++)
            {
                for ( int j = y-marginy, l=0 ; l <filter.getColumns();j++,l++)
                {
                    SumRed= SumRed+(filter.get(k, l)*imageIn.getIntComponent0(i, j)); 
                    SumGreen= SumGreen+(filter.get(k, l)*imageIn.getIntComponent1(i, j));
                    SumBlue= SumBlue+(filter.get(k, l)*imageIn.getIntComponent2(i, j));  
                }
            }
            SumRed = SumRed/norm;
            SumGreen = SumGreen/norm;
            SumBlue = SumBlue/norm; // normalization

            if(SumRed>255.0) SumRed=255.0;
            else if(SumRed<0.0) SumRed=0.0;
            if(SumGreen>255.0) SumGreen=255.0;
            else if(SumGreen<0.0) SumGreen=0.0;
            if(SumBlue>255.0) SumBlue=255.0;
            else if(SumBlue<0.0) SumBlue=0.0;

            imageOut.setIntColor(x, y, (int)(SumRed), (int)(SumGreen), (int)(SumBlue));


        }
    }
}

}

Видя эффект фильтрации, я предполагаю, что SumRed, SumGreen и SumBlue находятся вне диапазона, и они устанавливают 255 или 0 значений. Но я понятия не имею, почему.

0 ответов

Другие вопросы по тегам