1

この質問を別の質問から切り離すように勧められました。ここにオリジナルがあります:

黒の背景を白に変更する方法

いくつかの画像処理の後、バイナリ画像を取得しますが、境界が非常に難しいため、ガウス フィルターを適用して柔らかい画像を取得します。結果はグレースケール画像です。この画像を別の画像のマスクとして適用する必要があります。どの画像にもアルファ チャネルがないため、この値を使用せずに色の混合を行う必要があります。私は仕事をするためにMarvin Frameworkを使用していますが、Marvinにはプラグインがありません。

@Override public void process(MarvinImage _imageIn, MarvinImage _imageOut, MarvinAttributes attrOut, MarvinImageMask _mask, boolean previewMode) {
    
    MarvinImage mask = _imageIn;
    MarvinImage image = _imageOut;
    
    for(int y=0; y<mask.getHeight(); y++){
        for(int x=0; x<mask.getWidth(); x++){
            
            //ya que está en grayscale, los 3 valores son los mismos
            int r1 = mask.getIntComponent0(x, y);
            int g1 = mask.getIntComponent1(x, y);
            int b1 = mask.getIntComponent2(x, y);
            
            int r2 = image.getIntComponent0(x, y);
            int g2 = image.getIntComponent1(x, y);
            int b2 = image.getIntComponent2(x, y);
            
            //al color de salida, le asignamos la luminicencia de la imagen mascara
            int r = 0, g = 0, b = 0;
            if(r1 > 0 || r2 > 0){
                r = r1*r2/Math.max(r1, r2);
            }
            
            if(g1 > 0 || g2 > 0){
                g = g1*g2/Math.max(g1, g2);
            }
            
            if(b1 > 0 || b2 > 0){
                b = b1*b2/Math.max(b1, b2);
            }
            
            image.setIntColor(x, y, r, g, b);
        }
    }
}

しかし、このコードには私が解決できなかった小さなバグがあります。RGB 画像に白がある場合、色の結果がうまく結合されず、暗くなりません。私が探しているのは、gimp を使用して達成できるものです。2 レイヤーの画像があり、下の画像は RGB 画像で、上の画像はグレースケール マスクです。このレイヤーでは、関数 color to alpha を使用します。白色を目安に。結果は次のとおりです。

ギンプミックス

アルゴリズムは次のとおりです。

アルゴリズムミックス

違いはかなり明白です。テスト用の 2 つの元の画像を次に示します。

カラー画像
(出典: imgsafe.org )

グレースケール マスク

4

1 に答える 1

0

画像とマスクのアルファ合成を行うだけです。基本的に、出力画像のピクセルは次のとおりです。

output_image(x,y) = input_image(x,y) * PI + mask_image(x,y) * PM

ここで、PI と PM は、それぞれ出力ピクセル内の入力イメージとマスク イメージの割合です。PI + PM = 1 (100%)

例:

マスク内の黒いピクセルの場合:

PM = 1 - (グレースケールピクセル / 255) → 1 - (0 / 255) = 1

白いピクセルの場合:

PM = 1 - (グレースケールピクセル / 255) → 1 - (255 / 255) = 0

灰色のピクセルの場合:

PM = 1 - (グレースケールピクセル / 255) → 1 - (127 / 255) = 0.5

ついに:

PI = 1 - 午後;

出力 1:

ここに画像の説明を入力

ソースコード:

public class GrayScaleMask {

    public GrayScaleMask(){

        MarvinImage image = MarvinImageIO.loadImage("./res/grayscaleMask_input.png");
        MarvinImage mask = MarvinImageIO.loadImage("./res/grayscaleMask_mask.png");
        grayscaleMask(image.clone(), image, mask);
        MarvinImageIO.saveImage(image, "./res/grayscaleMask_output.png");
    }

    private void grayscaleMask(MarvinImage image, MarvinImage imageOut, MarvinImage mask){
        int r1,r2,g1,g2,b1,b2;
        double maskGray, factorMask, factorImage;
        for(int y=0; y<image.getHeight(); y++){
            for(int x=0; x<image.getWidth(); x++){
                r1 = image.getIntComponent0(x, y);
                g1 = image.getIntComponent1(x, y);
                b1 = image.getIntComponent2(x, y);
                r2 = mask.getIntComponent0(x, y);
                g2 = mask.getIntComponent1(x, y);
                b2 = mask.getIntComponent2(x, y);
                maskGray = (r2*0.21)+(g2*0.72)+(b2*0.07);
                factorMask = 1-(maskGray/255);
                factorImage = 1-factorMask;
                imageOut.setIntColor(x, y,  (int)(r1*factorImage+r2*factorMask),
                                            (int)(g1*factorImage+g2*factorMask),
                                            (int)(b1*factorImage+b2*factorMask));

            }
        }
    }

    public static void main(String[] args) {
        new GrayScaleMask(); System.exit(0);
    }
}

出力 2:

組み合わせる直前にマスクを暗くすることができます。

    r2 = (int)(r2*0.3);
    g2 = (int)(g2*0.3);
    b2 = (int)(b2*0.3);
    imageOut.setIntColor(x, y,  (int)((r1*factorImage+r2*factorMask)),
                                (int)((g1*factorImage+g2*factorMask)),
                                (int)((b1*factorImage+b2*factorMask)));

ここに画像の説明を入力

于 2016-05-06T18:28:13.917 に答える