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); } }