图像滤镜 - 卷积

时间:2014-03-23 11:10:42

标签: java image-processing marvin-framework

我正在尝试实现图像过滤器(使用convul​​ution)。我整天都在努力弄清楚发生了什么,我找不到错误。滤镜仅在我用它来模糊图像时才有效。在其他情况下,它无法正常工作:例如,这是原始图片(在过滤之前):

The picture before filtering

这是用这个矩阵过滤后的图片:

enter image description here

picture after embossing filter

我在代码中使用Marvin Image Processing Frameworkjblas library

  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 个答案:

没有答案
相关问题