psPaintPlugin - [[psPaint]] 現在のフィルタプラグイン一覧
目次
- はじめに
- borderFill
- colorRotation
- dotRemoveW
- paintPreProcess
- pickup_Color
- punchOutRed
- punchOutWhite
- scanLineNormalize
- thinXXX
- trace_Xxx
- traceAll 一括トレース抽出
- traceK
psPaint 現在のフィルタプラグイン一覧
はじめに
psPaintプロジェクトの「超絶転用効かないプラグイン」の説明とソースです。プロジェクトが一段落付くまでは、変更や修正の足が早いようにFilterFactry?で開発してます。 そのうちSDKに手を出すかも知れませんが…出さないか?
以下のソースはそのままFF(FilterFactory or FilterFoundry)で利用可能(なはず)です。
ツッコミ歓迎
SDKをおもちの方で、今回のプロジェクトに協力して同じ機能のプラグインを提供してくださる方、大歓迎
borderFill
[0/0/0](予約色)の黒い境界線を周辺色で置換するフィルタ。
概要
当該ピクセルの輝度が0の時、周辺ピクセルを参照して、最初に発見した輝度0と255以外のピクセルと値を交換します。要するに「彩色レイヤ」の境界を周辺色で塗りつぶしてしまうわけです。
使い方
彩色レイヤまたは彩色レイヤのコピーに対して実行します。
調整項目はありません。
あらかじめ彩色レイヤの細線化が終了している場合は、1度実行するとすべての境界線が消えるはずですが、細線化が不十分な場合は黒いピクセルが残ります。
必要に応じて複数回処理してください。
ソース
r: i==0? ((src(x-1,y,0)+src(x-1,y,1)+src(x-1,y,2))%765!=0?put(3,0): ((src(x+1,y,0)+src(x+1,y,1)+src(x+1,y,2))%765!=0?put(5,0): ((src(x-1,y-1,0)+src(x-1,y-1,1)+src(x-1,y-1,2))%765!=0?put(0,0): ((src(x+1,y+1,0)+src(x+1,y+1,1)+src(x+1,y+1,2))%765!=0?put(8,0): ((src(x,y-1,0)+src(x,y-1,1)+src(x,y-1,2))%765!=0?put(1,0): ((src(x,y+1,0)+src(x,y+1,1)+src(x,y+1,2))%765!=0?put(7,0): ((src(x+1,y-1,0)+src(x+1,y-1,1)+src(x+1,y-1,2))%765!=0?put(2,0): ((src(x-1,y+1,0)+src(x-1,y+1,1)+src(x-1,y+1,2))%765!=0?put(6,0): put(4,0) )))))))):put(4,0), src(x-1+(get(0)%3),y-1+(get(0)/3),z) g: src(x-1+(get(0)%3),y-1+(get(0)/3),z) b: src(x-1+(get(0)%3),y-1+(get(0)/3),z) a: a
技術情報
ピクセルのが黒または白でない判定を以下の式で行っている。
r + g + b % 765 != 0この判定はFFの言語事情による物なので他言語に移植時は要注意。特に8ビット以外の環境に対応を行う時
colorRotation
画像の色味を変更するフィルタ概要
輝度を維持して色相をシフトします。 同様の処理はphotoshopの色相・彩度フィルタでも可能ですが、この変換は(R-Y)/(B-Y)色空間で行われます。 色トレス抽出の判定空間と同じなので色トレスの微調整に使用できます。
使い方
ctl(0)に元の色相角 / ctl(1)に変換先の色相角 を設定してください。 差分だけ色相を回転します。destination ,ctl(0) ,変換元の色相角を255分法で target ,ctl(1) ,変換先の色相角を255分法で
特定の色トレース部分を他の色に変換する時に使用できます。 画面の色の色情報は、スクリプトgetColorInfo.jsxで取得してください。
ソース
r: put((76*r+150*g+29*b)/255,0), put(b-get(0),1), put(r-get(0),2), put(c2d(get(1),get(2))+512,3), put(c2m(get(1),get(2)),4), put(r2x(get(3)+(ctl(0)-ctl(1))*4,get(4)),5), put(r2y(get(3)+(ctl(0)-ctl(1))*4,get(4)),6), put(get(0)+get(5),7), put(get(0)+get(6),8), put((255*get(0)-29*get(7)-76*get(8))/150,9), get(8) g: get(9) b: get(7) a
技術情報
内部的には色相角は1024分法です。
色相 0から1023までの値を指定するのですが、コントロールが255までの値なので 指定は4倍して適用されます。
dotRemoveW
単独白ピクセル除去概要
周辺ピクセルを参照して流し込み彩色の困難な弧立ピクセルおよび先端ピクセルを除去する。 ペイント作業がラクになるので、組み込みの方が良さそう。
使い方
調整項目はありません。2値化済レイヤに対して彩色前に適用してください。
高速化の為 Rチャンネルのみの値で判断しているので、色が変わるため彩色後には使用できません。
彩色途中に使用するなら少し反応は悪いが全チャンネル判定の版もあります。
ソース
R判定
r: (c==255)&&(cnv(1,5,1,5,0,5,1,5,1,1)<=1024)?put(0,0):put(c,0), get(0) g: get(0) b: get(0) a
全チャンネル判定
r: (c==255)&&(cnv(1,5,1,5,0,5,1,5,1,1)<=1024)?0:c g: (c==255)&&(cnv(1,5,1,5,0,5,1,5,1,1)<=1024)?0:c b: (c==255)&&(cnv(1,5,1,5,0,5,1,5,1,1)<=1024)?0:c a
技術情報
3x3のコンボルブ関数を利用して上下左右に5倍のピクセルの重みづけを行なって市松配置4ピクセル までのピクセルを検索している。
他の言語に移植の際は、もう少し大きな領域まで判定した方が作業性が上がると思われる。 5x5程度までのマトリスクを考慮のこと。
paintPreProcess
彩色レイヤを作る。概要
画像を黒白2値化して 彩色レイヤを作成します。 単純なしきい値ではなく薄い色のトレス線もはっきりと出るように加工します。使い方
- ctl(1)は、[baseClip] 主に描線の芯の太さの調整(default 0)
- ctl(0)は、[bgClip] 線の調子の硬軟および背景ノイズの除去(default 255)
- ctl(2)は、[threshold] 描線の途切れ具合の調整(default 127) として使用する。
ソース
r: put(scl(min(min(r,g),b),ctl(1),ctl(0),0,255)<ctl(2)? 0:255,0), get(0) g: get(0) b: get(0) a: a
技術情報
RGB各チャンネルの最小値を取得して一次データとして、 一次データをctl(1)-ctl(0)範囲でクリップ、 さらに0-255にマッピングした後、 ctl(2)を域値にして二値化しています。
アルファチャンネル操作は行っていませんので、 必要にしたがってあとから別にアルファを処理してください。
pickup_Color
色トレース抽出フィルタ概要
特定の色域・彩度の部分を残して、他のエリアを抜き去ります。 主にアニメーションのセル画彩色の為に「色鉛筆の線」の部分をレイヤから抽出する ために作成されています。
使い方
対象のレイヤを直接書き換えますので、必要にしたがって画像の複製にたいして適用してください。スライダの機能は以下の通り。Windows版ではなぜかスライダに名前をつけられないので、ナンバーでご確認ください
color | ctl(0) | 色値指定スライダ |
range | ctl(1) | 抽出色相範囲 |
threshold | ctl(2) | 彩度域値 |
bg | ctl(2) | 背景域値 |
line | ctl(3) | ラインパラメータ |
色値指定スライダは、抽出する中心色をある指定します。 判定は全1024色相ですが、スライダの値が0-255なので4倍して使用しています。 ひとつのフィルタですべての色に対応しています。
抽出色相範囲は通常は 0で判定範囲が狭く/255で最大になります。 スキャナ画像から色鉛筆の線を抽出する場合は、デフォルトの127(中央)程度で適正です。 余分な色(線)が出る場合はこれを狭くして不要な線を排除します。
彩度域値は、一定以下の彩度のピクセルを除去するためのしきい値です。 安価なスキャナやデジカメでは、黒い線の周辺にそのような色ノイズがかなり多量にのります。 これは最近の製品の特色で言ってみれば「しょうがない」のでうまく調整してください。 グラフィックソフトで直書きした画像や事前処理が済んでいる場合などでは不要なケースもあります。
背景・ラインのパラメータは線の調子を整えます。 グラフィックソフト等で直書きした場合や、事前フィルタで調整済の線に対しては デフォルトの背景=255/ライン=0 の初期値でご使用ください。(これが線の調子を最も保存します)
抽出は以下のパラメータを目安にしください。単色フィルタの設定値の1/4です。
鉛筆の色 | 中心色相(/255) |
ピンク | 37 |
赤 | 76 |
黄色 | 121 |
黄緑 | 138 |
緑 | 169 |
水色 | 216 |
青 | 229 |
同じレイヤに対してフィルタを二回以上かけると全面ベタになります。これは仕様です。
ソース
r: put(c2d(b-i,r-i)+512,0), put(c2m(b-i,r-i),1), put(0,2), put(150,3), put(r2x(get(2)+(ctl(0)*4),get(3)),4), put(r2y(get(2)+(ctl(0)*4),get(3)),5), put((get(4)+76),6), put((get(5)+76),7), put((256*76-29*get(4)-76*get(5))/150,8), min(get(6),get(8))>get(7)?0:scl(get(7),min(get(6),get(8)),max(max(get(7),get(8)),get(6)),0,255) g: min(get(6),get(7))>get(8)?0:scl(get(8),min(get(6),get(7)),max(max(get(7),get(8)),get(6)),0,255) b: min(get(8),get(7))>get(6)?0:scl(get(6),min(get(7),get(8)),max(max(get(7),get(8)),get(6)),0,255) a: get(0)>(ctl(0)*4-ctl(1)) && (get(0)<(ctl(0)*4+ctl(1))) && get(1)*10>ctl(2)?255-scl(min(min(r,g),b),ctl(4),ctl(4)+((255-ctl(4))*ctl(3))/255,0,255):0
技術情報
ターゲットの色相値は、付属のgetColorInfo.jsxスクリプトを使って調べる事ができます。
置き替え用のダミーカラーは色相から似た色を自動生成していますが、原色に再加工している関係から指定の色相値ぴったりにはなりません。 指定中心色からちょっぴりズレていますのでご了承ください。
punchOutRed
細線化専用補助フィルタ概要
スクリプト・アクション内部で使用するフィルタです。使い方
細線化操作の際に最後に使用するフィルタです。一般の使用はしないでください。
ソース
r:r g:r b:r a:a
技術情報
細線化を高速にする為の補助フィルタ 細線化処理をRチャンネルだけに行なっているので、最後にまとめてRチャンネルを他のチャンネルに複製してモノクロにしている。他の言語に移植する際は不要かも
punchOutWhite
白[255/255/255]部分のアルファを抜く概要
抜き部分の白[255/255/255](予約色)を検出してアルファチャンネルを抜くフィルタ。ほぼアニメ専用ですな
使い方
調整項目はありません。抜きたいレイヤに対して適用してください。
ソース
r:r g:g b:b a:r+g+b==765?0:c
技術情報
r+g+b==765? は FFでは多分最も高速な判定と思われる。…が、8bit以外の環境へ移植の際は注意
scanLineNormalize
スキャン画像の予備調整を行う概要
スキャンまたはデジカメでキャプチャした線画を、「セル画風」に事前調整します。使い方
調整したいレイヤに対して適用してください。以下の動作を行います。
- 黒い鉛筆線の、RGBデータを無彩色に揃える
- 用紙の下地を[255/255/255]に揃える
- 線の調子を整える 以上の処理を1パスで行います。
以下の三つの調整のスライダがあります。
saturation | ctl(0) | 彩度域値 |
bg | ctl(1) | 背景域値 |
line | ctl(2) | ラインパラメータ |
彩度域値は、一定以下の彩度のピクセルを無彩色にします。 廉価なスキャナやデジカメは、構造上無彩色の周囲に色のついたノイズが沢山でます。 これで、グレーの部分をあらかじめ無彩色に統一する事で色トレスの分離性能を高めます。
背景域値は、背景として認識する領域の明るさです。 この値を境にして背景は[255/255/255]に、それ以外の部分はコントラストの調整をします。
ラインパラメータは、数値をあげてゆくとどんどん硬調になります。 あまり値を上げると線がジャギジャギになりますのでご注意ください。
ソース
r: (sqr((b-i)*(b-i)+(r-i)*(r-i))*5)>ctl(0)?put(1,0):put(0,0), get(0)?put(r,1):put(i,1), get(0)?put(g,2):put(i,2), get(0)?put(b,3):put(i,3), get(1)<ctl(1)?put(scl(255-get(1),0,255,ctl(1),255),4):put(get(1),4),scl(255-abs(get(1)-get(4)),(ctl(1)*ctl(2))/255,255,0,255) g: get(2)<ctl(1)?put(scl(255-get(2),0,255,ctl(1),255),4):put(get(2),4),scl(255-abs(get(2)-get(4)),(ctl(1)*ctl(2))/255,255,0,255) b: get(3)<ctl(1)?put(scl(255-get(3),0,255,ctl(1),255),4):put(get(3),4),scl(255-abs(get(3)-get(4)),(ctl(1)*ctl(2))/255,255,0,255) a: a
技術情報
内部的には以下の処理を行っています。
- ピクセルの彩度を指定値と比較してフラグを立てる
- フラグにしたがって各ピクセルを、そのまままたはグレースケール化した値をいったんバッファに格納する
- 背景域値以上のピクセルをそのまま、域値以下のピクセルを反転した上で域値から白へスケーリング
- スケーリングしたピクセルと元のピクセルの差分をとって再反転して背景の除去とコントラストの調整を同時に行う
- 再反転時に黒部分のクリップをかけて線の強調を行う
thinXXX
細線化フィルタの機能ブロックフィルタ概要
スクリプト・アクション内部で使用するフィルタです。使い方
細線化操作の際に使用するフィルタです。一般の使用はしないでください。
ソース
//000 r: i==0 && ( cnv(1,1,1, 0,0,0, 4,4,4, 1)==3060 ||cnv(1,1,0, 1,0,4, 0,4,4, 1)==3060 ||cnv(1,0,4, 1,0,4, 1,0,4, 1)==3060)? put(255,0) : put(c,0),get(0) //001 r: i==0 && ( cnv(4,4,4, 0,0,0, 1,1,1, 1)==3060 ||cnv(4,4,0, 4,0,1, 0,1,1, 1)==3060 ||cnv(4,0,1, 4,0,1, 4,0,1, 1)==3060)? put(255,0) : put(c,0),get(0)//from RightBottom //002 r: i==0 && ( cnv(4,0,1, 4,0,1, 4,0,1, 1)==3060 ||cnv(0,1,1, 4,0,1, 4,4,0, 1)==3060 ||cnv(1,1,1, 0,0,0, 4,4,4, 1)==3060)? put(255,0) : put(c,0),get(0)//from RightBottom //003 r: i==0 && ( cnv(1,0,4, 1,0,4, 1,0,4, 1)==3060 ||cnv(0,4,4, 1,0,4, 1,1,0, 1)==3060 ||cnv(4,4,4, 0,0,0, 1,1,1, 1)==3060)? put(255,0) : put(c,0),get(0)//from RightBottom g:g b:b a:a
技術情報
XXXの部分は番号で置換される。それぞれが細線化工程の機能ブロックになっている。対象画像はRGBモード(8bit/チャンネル)で、あらかじめ黒白二値化されていることが使用条件。
全てのフィルタを順次実行することで、黒ラインの周囲を赤で置換してゆく。 どのフィルタもラストの1ピクセルは削らないので、最低でも1ピクセル太さの線が残る。
黒白の線画にする為には、最後に赤を白に置換する必要が有ります。
通常の細線化処理は、終了条件を与えてループ処理するが、FilterFactoryでは、以下の仕様の為やや特殊な構成になっている。
- ループ処理ができない
- 加工後のピクセル値の参照ができない
アクションまたはスクリプトで各フィルタを連続実行する必要が有る。
- thin000 右下ピクセルを削る
- thin001 左上ピクセルを削る
- thin002 右ピクセルを削る
- thin003 左ピクセルを削る
trace_Xxx
色トレース抽出フィルタ概要
特定の色域・彩度の部分を残して、他のエリアを抜き去ります。 主にアニメーションのセル画彩色の為に「色鉛筆の線」の部分をレイヤから抽出する ために作成されています。Xxx の部分には色の略号が入ります。
使い方
対象のレイヤを直接書き換えますので、必要にしたがって画像の複製にたいして適用してください。スライダの機能は以下の通り。Windows版ではなぜかスライダに名前をつけられないので、ナンバーでご確認ください
color | ctl(0) | 色値オフセット |
range | ctl(1) | 抽出色相範囲 |
threshold | ctl(2) | 彩度域値 |
bg | ctl(2) | 背景域値 |
line | ctl(3) | ラインパラメータ |
色値オフセットは、フィルタにセットされた中心色をある程度の範囲で移動させます。
ひとつのフィルタは色鉛筆1色分に対応させています。制作時にサンプリングされた色鉛筆の色値をもとに
作成されていますが、スキャナや鉛筆、紙その他の条件の為調整が必要な場合にスライダを調整して中心色を変更してください。
抽出色相範囲は通常は 0で判定範囲が狭く/255で最大になります。
スキャナ画像から色鉛筆の線を抽出する場合は、デフォルトの127(中央)程度で適正です。
彩度域値は、一定以下の彩度のピクセルを除去するためのしきい値です。
安価なスキャナやデジカメでは、黒い線の周辺にそのような色ノイズがかなり多量にのります。 これは最近の製品の特色で言ってみれば「しょうがない」のでうまく調整してください。
グラフィックソフトで直書きした画像や事前処理が済んでいる場合などでは不要なケースもあります。
背景・ラインのパラメータは線の調子を整えます。
グラフィックソフト等で直書きした場合や、事前フィルタで調整済の線に対しては
デフォルトの背景=255/ライン=0 の初期値でご使用ください。(これが線の調子を最も保存します)
現在以下のフィルタがあります。
鉛筆の色 | 略号 中心色相(/1023) | |
ピンク | P | 149 |
赤 | R | 307 |
黄色 | Y | 487 |
黄緑 | GY | 557 |
緑 | G | 680 |
水色 | C | 870 |
青 | B | 921 |
一枚の画面に多色の色鉛筆を混用すると部分的に混色で分離不能になりやすいので、手作業の修正が増えます。 また、隣接した色を分離しようとして判定範囲をあまり狭くするとシャギーがたちやすくなります。 ご注意ください。
同じレイヤに対してフィルタを二回以上かけると2値化された線なります。これは仕様です。
ソース
r: put(908,0),//ここに中心色相をセット put(c2d(b-i,r-i)+512,1), put(c2m(b-i,r-i),2), put(0,3),//置き替え色(r) put(0,4),//置き替え色(g) put(255,5),//置き替え色(b) get(1)>(ctl(0)+get(0)-127)-ctl(1) && get(1)<(ctl(0)+get(0)-127)+ctl(1) && get(2)*10>ctl(2)?put(255-scl(min(min(r,g),b),ctl(4),ctl(3)+((255-ctl(3))*ctl(4))/255,0,255),6):put(0,6), get(6)==0?255:get(3) g: get(6)==0?255:get(4) b: get(6)==0?255:get(5) a: get(6)
技術情報
各フィルタは基本的に同じ物で、ソース冒頭に書き込んである中心色相とレイヤ置き替え用の代用色が違うだけです。 特定の色鉛筆に対してカスタマイズする際は、以下のソースを参考に値を書き換えてください。ターゲットの色相値は、付属のgetColorInfo.jsxスクリプトを使って調べる事ができます。
traceAll 一括トレース抽出
白部分を透明化してトレスレイヤを作る。概要
白(下地)以外のトレス線を一括してひとつのレイヤに抽出します。 有名な"Eliminate White"と同じです。"Eliminate White"+"白フリンジ削除"を行った場合とほぼ同じ結果になります。
処理を二回かけるのが面倒なかたにどうぞ。
セル画的には、あとのトレス線の処理に時間がかかるかも知れませんが、元のトレスをそのまま残す場合はレイヤがむやみに増えなくてシアワセかも知れません。
使い方
調整項目はありません。アルファのあるレイヤに対して適用してください。 背景レイヤに対して適用するとチョトすごい事になります。ソース
r<min(g,b)?0:scl(r,min(g,b),255,0,255) g<min(r,b)?0:scl(g,min(r,b),255,0,255) b<min(r,g)?0:scl(b,min(r,g),255,0,255) 255-(min(r,min(g,b)))
技術情報
アルファの生成に関しては"Eliminate White"とまるで同じです。 ピクセルから白成分を同時に除去しているので、白部分は黒に変換されます。traceK
主線の抽出をします概要
黒いトレース部分を残してほかを透明にします。使い方
対象のレイヤを直接書き換えますので、必要にしたがって画像の複製にたいして適用してください。有名な"Eliminate White"に似ていますが、あちらは、画像の色を保持して背景の白部分を抜く動作をします。
このフィルは黒い部分のみを残して、ほかを抜くので色トレスが残りません。 動作が違うのでご注意ください。(色トレスが残りません)
スライダの機能は以下の通り。Windows版ではなぜかスライダに名前をつけられないので、ナンバーでご確認ください
saturation | ctl(0) | 彩度域値 |
bg | ctl(1) | 背景域値 |
line | ctl(2) | ラインパラメータ |
彩度域値は通常はデフォルトの 127 (スライダ中央固定)でほぼ適正です。
暗色・薄い色・補色等の掛け合わせてで彩度の低い領域がノイズになる場合に調整してください。
背景・ラインのパラメータは線の調子を整えます。
グラフィックソフト等で直書きした場合や、事前フィルタで調整済の線に対しては デフォルトの背景=255/ライン=0 の初期値でご使用ください。(これが線の調子を最も保存します)
同じレイヤに2回以上適用すると、2値化されたラインになります。これは仕様です。
r: sqr((b-i)*(b-i)+(r-i)*(r-i))*5<ctl(0)? put(scl(255-max(max(r,g),b),ctl(1)*ctl(2)/255,ctl(1),0,255),0):put(0,0), get(0)==0?255:0 g: get(0)==0?255:0 b: get(0)==0?255:0 a: get(0)
技術情報
特になしPowered by YukiWiki 2.1.2a / Modified by Nekomataya.