1

我正在尝试实现图像过滤器(使用抽搐)。我花了一整天的时间试图弄清楚发生了什么,但我找不到错误。该滤镜仅在我使用它来模糊图像时才起作用。在其他情况下它不能正常工作:例如这是原始图片(过滤前):

过滤前的图片

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

在此处输入图像描述

压花滤镜后的图片

我在代码中使用了Marvin 图像处理框架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 值。但我不知道为什么。

4

0 回答 0