Photoshopの情報集

2023年よりAdobe Community Expertに参加しています。

PixelBenderによるHSB色空間での色領域取得のプラグインの公開

PixelBenderを使ったHSB色空間での色領域の取り方

前々からPixelBenderを薦めてきましたが、実際に触らないと
その良さがわかっていただけないと思います。

ですので作成したHSB色空間での任意の色領域を取得する
PixelBenderのスクリプトを公開します。


ダウンロードはこちらからできます。
getRangeHSB_alfa.pbk 直

ソース全体

これをこのままコピペしてもらえれば動くと思います。

<languageVersion : 1.0;>

kernel getRangeHSB_alfa
<   namespace : "PhotoshopperJP";
    vendor : "PhotoshopperJP";
    version : 1;
    description : "Select a range of HSB values!";
>
{
    input image4 src;
    output pixel4 dst;
    
    parameter int Ch1_HueMax
    <
        minValue:int(0);
        maxValue:int(360);
        defaultValue:int(360);
    >;
    parameter int Ch1_HueMin
    <
        minValue:int(0);
        maxValue:int(360);
        defaultValue:int(0);
    >;
    parameter int Ch1_HR
    <
        minValue:int(0);
        maxValue:int(360);
        defaultValue:int(0);
    >;
      parameter int Ch2_SatulationMax
    <
        minValue:int(0);
        maxValue:int(255);
        defaultValue:int(255);
    >;
    parameter int Ch2_SatulationMin
    <
        minValue:int(0);
        maxValue:int(255);
        defaultValue:int(0);
    >;
    parameter int Ch2_SR
    <
        minValue:int(0);
        maxValue:int(255);
        defaultValue:int(0);
    >;
    parameter int Ch3_BrightnessMax
    <
        minValue:int(0);
        maxValue:int(255);
        defaultValue:int(255);
    >;
    parameter int Ch3_BrightnessMin
    <
        minValue:int(0);
        maxValue:int(255);
        defaultValue:int(0);
    >;
    parameter int Ch3_BR
    <
        minValue:int(0);
        maxValue:int(255);
        defaultValue:int(0);
    >;
   parameter bool alfa_image
    <
        defaultValue:false;
        description: "Enable for alfa images .";
    >;


    void
    evaluatePixel()
    {
        float4 inputColor = sampleNearest(src,outCoord());
        //-------------------
        //        
        //RGB2HSB start
        //
        //-------------------
        int   dH = int(0);          //Hue
        float dS = float(0.0);      //Satulation
        float dB = float(0.0);      //Brightness
        float dDiff = float(0.0);
        float minC = float(1.0);
        float maxC = float(0.0);

       //create mix
        if(inputColor.r <= inputColor.g && inputColor.r <= inputColor.b){
            minC = inputColor.r;
        }else if(inputColor.g <= inputColor.r && inputColor.g <= inputColor.b){
            minC = inputColor.g;
        }else{
            minC = inputColor.b;
        }
        //create max
        if(inputColor.r >= inputColor.g && inputColor.r >= inputColor.b){
            maxC = inputColor.r;
        }else if(inputColor.g >= inputColor.r && inputColor.g >= inputColor.b){
            maxC = inputColor.g;
        }else{
            maxC = inputColor.b;
        }
        
        //RGB2HSB
        if(maxC == float(0) ){
            dS = float(0.0);
            dB = float(0.0);
        }
        
        dDiff = maxC - minC;
        dB = maxC;
        dS = dDiff/maxC;
        
        if(inputColor.r == maxC){
            dH = int(float(60) * (inputColor.g-inputColor.b)/dDiff);
        }else if(inputColor.g == maxC){
            dH = int(float(60) * (inputColor.b-inputColor.r)/dDiff + float(120));
        }else{
            dH = int(float(60) * (inputColor.r-inputColor.g)/dDiff + float(240));
        }

        if(dH < int(0)){
            dH = dH + int(360);
        }
        //-------------------
        //        
        //RGB2HSB finish
        //
        //-------------------
        
        
        float minH = float(Ch1_HueMin);
        float minS = float(Ch2_SatulationMin);
        float minB = float(Ch3_BrightnessMin);
        float maxH = float(Ch1_HueMax);
        float maxS = float(Ch2_SatulationMax);
        float maxB = float(Ch3_BrightnessMax);
        float4 alfa = float4(1);
        float mask = float(1);
        
        float HR   = float(Ch1_HR);
        float SR   = float(Ch2_SR);
        float BR   = float(Ch3_BR);

        dS = float(255) * dS;
        dB = float(255) * dB;
       
        //--------------------------------
        //H (0-360) S(0.0-255.0) B(0.0-255.0)
        //judge HSB
        //--------------------------------
        if(dH >= int(minH) - int(HR) && dH <= int(maxH) + int(HR) && 
           dS >= minS - SR      && dS <= maxS + SR      && 
           dB >= minB - BR      && dB <= maxB + BR        ){
            //
            if(dH >= int(minH) && dH <= int(maxH) && 
               dS >= minS      && dS <= maxS      && 
               dB >= minB      && dB <= maxB        ){

                if(alfa_image){
                    dst = float4(1);
                }
                else{
                    dst = inputColor; 
                }
            }else{
                if(HR != float(0)){
                    if(float(dH) < minH){
                        alfa.r = float(float(1) - (float(minH) - float(dH)) /HR);
                    }else if(float(dH) > maxH){
                        alfa.r = float(float(1) - (float(dH) - float(maxH)) /HR);
                    }
                }
                if(SR != float(0)){
                    if(float(dS) < minS){
                        alfa.g = float(float(1) - (float(minS) - float(dS)) /SR);
                    }else if(float(dS) > maxS){
                        alfa.g = float(float(1) - (float(dS) - float(maxS)) /SR);
                    }
                }
                if(BR != float(0)){
                    if(float(dB) < minB){
                        alfa.b = float(float(1) - (float(minB) - float(dB)) /BR);
                    }else if(float(dB) > maxB){
                        alfa.b = float(float(1) - (float(dB) - float(maxB)) /BR);
                    }
                }
                mask = alfa.r * alfa.g * alfa.b;
                if(alfa_image){
                    dst = float4(mask,mask,mask,1); 
                }else{
                    dst = inputColor * float4(mask);
                    dst.a = float(1);
                }
            } 
       }else{
            if(alfa_image){
                dst = float4(0,0,0,1);
            }else{
                dst = float4(0,0,0,1); 
            }
       }
   }
}

ソース解説

パラメータの書き方
    parameter int Ch1_HueMax
    <
        minValue:int(0);
        maxValue:int(360);
        defaultValue:int(360);
    >;
入力データの色空間変換
        //-------------------
        //        
        //RGB2HSB start
        //
        //-------------------
        int   dH = int(0);          //Hue
        float dS = float(0.0);      //Satulation
        float dB = float(0.0);      //Brightness
        float dDiff = float(0.0);
        float minC = float(1.0);
        float maxC = float(0.0);

       //create mix
        if(inputColor.r <= inputColor.g && inputColor.r <= inputColor.b){
            minC = inputColor.r;
        }else if(inputColor.g <= inputColor.r && inputColor.g <= inputColor.b){
            minC = inputColor.g;
        }else{
            minC = inputColor.b;
        }
        //create max
        if(inputColor.r >= inputColor.g && inputColor.r >= inputColor.b){
            maxC = inputColor.r;
        }else if(inputColor.g >= inputColor.r && inputColor.g >= inputColor.b){
            maxC = inputColor.g;
        }else{
            maxC = inputColor.b;
        }
        
        //RGB2HSB
        if(maxC == float(0) ){
            dS = float(0.0);
            dB = float(0.0);
        }
        
        dDiff = maxC - minC;
        dB = maxC;
        dS = dDiff/maxC;
        
        if(inputColor.r == maxC){
            dH = int(float(60) * (inputColor.g-inputColor.b)/dDiff);
        }else if(inputColor.g == maxC){
            dH = int(float(60) * (inputColor.b-inputColor.r)/dDiff + float(120));
        }else{
            dH = int(float(60) * (inputColor.r-inputColor.g)/dDiff + float(240));
        }

        if(dH < int(0)){
            dH = dH + int(360);
        }
        //-------------------
        //        
        //RGB2HSB finish
        //
        //-------------------
        
        
        float minH = float(Ch1_HueMin);
        float minS = float(Ch2_SatulationMin);
        float minB = float(Ch3_BrightnessMin);
        float maxH = float(Ch1_HueMax);
        float maxS = float(Ch2_SatulationMax);
        float maxB = float(Ch3_BrightnessMax);
        float4 alfa = float4(1);
        float mask = float(1);
        
        float HR   = float(Ch1_HR);
        float SR   = float(Ch2_SR);
        float BR   = float(Ch3_BR);

        dS = float(255) * dS;
        dB = float(255) * dB;
任意の領域をマスクとして取得する
        //--------------------------------
        //H (0-360) S(0.0-255.0) B(0.0-255.0)
        //judge HSB
        //--------------------------------
        if(dH >= int(minH) - int(HR) && dH <= int(maxH) + int(HR) && 
           dS >= minS - SR      && dS <= maxS + SR      && 
           dB >= minB - BR      && dB <= maxB + BR        ){
            //
            if(dH >= int(minH) && dH <= int(maxH) && 
               dS >= minS      && dS <= maxS      && 
               dB >= minB      && dB <= maxB        ){

                if(alfa_image){
                    dst = float4(1);
                }
                else{
                    dst = inputColor; 
                }
            }else{
                if(HR != float(0)){
                    if(float(dH) < minH){
                        alfa.r = float(float(1) - (float(minH) - float(dH)) /HR);
                    }else if(float(dH) > maxH){
                        alfa.r = float(float(1) - (float(dH) - float(maxH)) /HR);
                    }
                }
                if(SR != float(0)){
                    if(float(dS) < minS){
                        alfa.g = float(float(1) - (float(minS) - float(dS)) /SR);
                    }else if(float(dS) > maxS){
                        alfa.g = float(float(1) - (float(dS) - float(maxS)) /SR);
                    }
                }
                if(BR != float(0)){
                    if(float(dB) < minB){
                        alfa.b = float(float(1) - (float(minB) - float(dB)) /BR);
                    }else if(float(dB) > maxB){
                        alfa.b = float(float(1) - (float(dB) - float(maxB)) /BR);
                    }
                }
                mask = alfa.r * alfa.g * alfa.b;
                if(alfa_image){
                    dst = float4(mask,mask,mask,1); 
                }else{
                    dst = inputColor * float4(mask);
                    dst.a = float(1);
                }
            } 
       }else{
            if(alfa_image){
                dst = float4(0,0,0,1);
            }else{
                dst = float4(0,0,0,1); 
            }
       }

スポンサーリンク