psPaint - Photoshopでセル塗りしてみる実験中
目次
- 前置き
- 概要
- メモ
- お試しキットのダウンロードとインストール
- 作業手順詳細
- 作業アクション
- 作業補助アクション
- フィルタ機能一覧
- borderFill
- colorRotation
- dotRemoveK
- dotRemoveW
- paintPreProcess
- trace_Xxx
- pickup_Color
- traceK
- punchOutWhite
- punchOutRed
- scanLineNormalize
- thinXXX
- この辺りのプロジェクトに興味のある方へお願い
- 最後に
Photoshopでセル塗りしてみる実験中
前置き
さて、何だか各所それなりの理由によりちょっとだけ話題になった「セル塗り」の実験をしてみるでございます。使う道具は、業務関連ではすっかりおなじみのAdobe Photoshopです。(以下"Ps"と略 プレイステーションじゃナイヨ)
Photoshopは、セル塗りの作業のためのアプリケーションではありません。が、もちろん塗れないわけではない。 ただし「セル塗り」作業にはそれなりの「コツ」とテクニックが必要です。
このテクニックとコツを出来るかぎり自動化してセル塗り環境を作ってみようと思います。
また今回の実験では、現状の「セル塗りには 二値化+スムージング」という現状の「ほぼ標準処理」に対してそれ以外のメソッドを作成してみようという試みでもあります。
実験状態なので処理効率等まだまだチューニングされていませんが、その辺はご勘弁
ついでに実験参加者を募るであります。
気が向いた方は、実験セットをダウンロードしてご意見など下さると私が喜びます。
参加希望の方は、以下のリンクからこの記事で使用しているツールをダウンロードして遊んでみてください。特に参加申し込みなどは不要です。
何か気付いたことや面白い提案・機能に対するのご要望などありましたら、BBSに書き込んでみたりレポートをこのwikiに書いてもらっても良いかと思います。
シアワセが多そうなご提案はわりと積極的に実装されるでしょう。
さてそれでは、ボチボチ行ってみよう!
目標
今回かかげた処理目標はコレ!
- Photoshop内で処理を完結させる。
- スキャンデータの階調を捨てない。(後でスムージングしない。)
- フィルタ、アクション、スクリプト を使ってなるたけラクする。
また以下の作業条件を想定しています。
- 入力は基本的に、手書きの動画をスキャナまたはカメラで取り込む。
- 解像度は150〜200dpi以上で取り込む
Photoshop内で処理を完結させる。
他のツールを併用しても良いが、Pshotoshopだけで、SCANから最終書き出しまで 全ての作業が行なえるようにする。一括スキャンなどはやっぱり他のツールが強い…よねぇ
スキャンデータの階調を捨てない。
スキャンした直後の多階調データを、二値化処理して彩色のハンドリングを良くするのは良いけれど…「別に捨てなくても良いだろう。」って感じで構成してみます。
むろん「ディスク容量は食います。」が、そんなに嫌うほどの事は無いんじゃナイの?って気持ちでとりあえず実験
フィルタ、アクション、スクリプト等々を使ってなるたけラクする。
セル塗り手順を作ってその手順を支援する機能を作ってみます。作業環境を支援する道具が揃えば使い慣れたツールから外に出ないで作業できてシアワセなのでちょっとやってみる。
今のところは、新作のフィルタは速度に目をつぶって「FilterFactory」で実験中
必要な環境
(必須)Adobe Photoshop 通常判 CS以降
Psファミリの中ではやはりスクリプトの処理能力が高いので通常版CS以降を対象にします。…一応エレメントも視野に入れておりますが、当方ほとんどエレメントを使っていないので… エレメントを日頃使っている方で互換性の検証やバグレポートに協力して下さる人歓迎中
(必須)Scaner または デジカメ(100万画素以上+取り込みスタンド必須)
紙に書いた手書きの線画を主な対象とします。線画の取り込みの為の用具はスキャナまたはデジカメを対象にします。SDビデオカメラは彩色データを作成するには情報密度が低過ぎるのでパス! HDビデオカメラならば、きっと大丈夫。
デジカメを対象にするのは、「うちに取り込み環境がある」という「超」個人的な理由です。
ただしこれを実践するにはカメラスタンドの扱いとか、平面(複写)撮影の基本スキルなどが必要です。 トライしてみたい方が居られるならリクエストして下さい。やり方の紹介などします。 需要が無ければそちらは保留…今やスキャナ全盛ですしね。
取り込み機器は、手間を考えてTWAINまたは同等機能対応とします。
要するにPhotoshopから[ファイル]>[読み込み]で読み込める機器です。
それ以外の画像ソースの方は、たぶん「とりこんだ線画を事前処理する」必要がないと思いますので、初期作業を省いて途中から利用してもらえば良いかと思います。
概要
- 取り込み
- スキャナ等の機器から取り込むかまたはファイルから読み込む。タブレット等の直接入力でも良い。
- 線画前処理
- 入力した画像を調整して最終の線画を作る。(調整済みの線画を入力とする場合はこのステップは省略)
- トレス線分解
- 調整済み線画を処理してトレス線を分離する。
- 彩色レイヤ作成
- 調整済みの線画を加工して彩色に適した二値化画像(彩色レイヤ)を作る。
- 領域彩色・色トレス線着彩
- 彩色レイヤに色を塗る(バケットペイント)・分離したトレス線に指定の色付けをする
- 彩色済みレイヤの後処理
- 彩色レイヤの境界線を周囲の色と置換して境界線を見えなくする。
- 書き出し
- 彩色レイヤの上にトレス線をのせて必要なファイル形式で書き出す。
現在考えている手順は、こんな感じです。
作業手順の可能性をみる為に単独画像(版権)のペイントを対象に作業を組んでみて 画質的・作業効率的に満足がいくようならば、多数画像のハンドリングやセル管理を組むという段取りで
まずは静止画で実験だ おー!
メモ
- トレス線は画像処理で分離する。
- 彩色レイヤをトレス線と別に扱うので階調データを捨てずにバケットペイント可能
- 彩色レイヤは、継ぎ目がバレないように後で境界線を消す。
似ているソフト
現在利用可能なアニメ彩色ソフトでこの手順に最も考え方の近いのはこちらAniLaPaint?
http://www.anime-soft.com/~onogin/soft/anilapaint/
シェアウェアとして作成されたソフトですが試験期間中の為無償で使用可能です。 作者の方の都合でアップデートは止まっていますが、充分安定して使用できるようです。
データハンドリング
Photoshopでのハンドリングとデータの再利用を考慮して中間ファイル形式はPSDのみとします。最終的な書き出しは、PSDファイルのまま扱うか、アクションで書き出しを半自動化して作業支援する。
対応フォーマットは、Photoshopから扱えるもの全てとなる。
連番画像を扱う場合は、スクリプトを利用した管理構造を作る(現在保留)
お試しキットのダウンロードとインストール
http://www.nekomataya.info/cgi-bin/control.cgi?PAGE=85&ITEM=080101
(お試しキット と サンプルファイル)
現在Mac版のフィルタはPhotoshopCS/PPC用のものしかバイナリがありません。 必要な方は、ソースがありますのでご自分の環境用のFFをインストールしてビルドしてください。 各環境用のフィルタをビルドして提供してくださる方、大募集中FilterFactory FilterFoundry を参照
インストーラがつきました。
が、まだ動作があやしいので、うまくいかなかったらやっぱり手作業でインストールしてください。
詳しいインストール方法は psPaintお試しキットのreadmeファイル こちらで
作業手順詳細
取り込み
TWAINの入力機器、またはファイルから取り込む。この後の「線画前処理」工程が写真調の画質を想定しているので、画質調整があるなら「文字」や「図面」等の調整で無く「写真」またはそれに類する調整で取り込むこと。
デジカメやHDビデオの場合は、なるべくコントラストが高くなるように取り込んだ方が良いですが、コントラストをあげすぎるとシャギーが立つのでご注意
こんな画像推奨
すでに部分的にシャギーが立ってるのであまりうれしくない。線画用の補正機能は良し悪し
今回のメソッドは階調保持が試験の眼目なので取り込み画像は、わりと「コントラストぬるめ」がおすすめです。 実線は黒くなくても良いし、紙は真っ白でない方が良い感じです。
ただし、きれいに調整できる別の方法をお持ちなら、そちらで調整をして前処理工程をパスしてもOKです。 タブレット直書きなどの場合は、線や階調の調整は不要になると思いますので、そのように処理してください。
色トレスは、彩度の高い色ならば何でも良いですが、現在「色鉛筆1色ごとに1レイヤ」を作成する想定で実験しているので色トレスの種類をあまり増やすと手間が増えますので後注意。 ただいま認識できる鉛筆は現在 赤、黄緑、水色 の3色で実装しています。(増やせます)
色トレスのみ(ハイライトなど)の「ペイント境界線ではない線」は、他の色鉛筆と色を変えておくのをお勧め。
ある程度の画面の汚れは画像処理で排除しますが、やはりきれいな画面の方が仕上がりもキレイなのです。スキャンは大切ですねぇ…
がんばってください。
線画前処理
線画を表示して アクション「00線画前処理」を実行して線画の事前調整を行ないます。
元データを保持する為に現在の画像を統合・複製してこれに調整をかけます。
具体的にナニをしているかというと、現在の画像にフィルタをかけて、この後の「トレス線分離」をしやすい画像に調整しています。
- 現在の画像を結合複製して新しいレイヤを作る。(元のレイヤはオリジナルレイヤとして保存)
- 一定彩度以下のピクセルを輝度を保持して無彩色にする。(デジカメや廉価版スキャナのカラーノイズの除去)
- 用紙の「下地(白)」の部分と線画部分を判別して 下地を「白(255/255/255)」に、線画部分のコントラストを強調しています。
この工程で出来上がった線が、最終の画像で使用する線です。
この線の調子は、ほとんどそのまま最終画面に残りますので、次の工程に進む前に仕上がりを意識して(必要に応じて)線の修正を行なってください。
- 実線トレースは、[0/0/0]の黒で、ブラシ等を使って書きたしができます。
- 色鉛筆の線は、画面からピックアップした色で書き足しや塗り足しをしてください。
- 消したい部分は、白で潰していただけます。
線のかすれや、タッチを残す場合は、別の色トレースで塗りわけ境界線をこの時点でつないでおくのがお勧めです。
トレス線分解
調整(+修正)済みの線画が表示された状態で、アクション「20トレース線分離(rcyk)」をクリックして下さい。 以下の各色のトレースレイヤと、画像確認用のレイヤを作成してトレース部分をひとつのレイヤセットにまとめます。
- トレース(k) 黒い部分を抽出したレイヤ 実線部分
- トレース(y) 黄色部分を抽出したレイヤ 黄緑の色鉛筆が現れやすい
- トレース(c) シアン部分を抽出したレイヤ 水色の色鉛筆が現れやすい
- トレース(r) 赤色部分を抽出したレイヤ 赤鉛筆が現れやすい
- backDrop 線画を確認するための白いレイヤ
暫定的にFFフィルタでチャンネルの演算をして抽出しています。同梱のアクションには他に
- 主線抽出
- 実線のみの抽出
- 色トレス抽出(r)
- 赤のみの抽出
- 色トレス分離(rgbcmyk)
- トレスを7レイヤに分離
などが置いてあります。内容は難しくないので改造等はご自分の環境に合わせてご自由にどうぞ。 またご要望ご質問あれば遠慮なくどうぞ。私の作ったものより良いものができたかた、どうぞ私にも下さい。
彩色レイヤ作成
調整済みの線画、または彩色用の境界にしたい線画を表示状態にして、アクション「20彩色レイヤ作成」を実行して下さい。
現在表示されているレイヤを複製して 彩色用のレイヤを作成して黒白二値化します。
ここでは、彩色用の二値化レイヤを作りますので、「ペイント境界線ではない線」を非表示にしてから作業を行なってください。
彩色レイヤの線の途切れやかすれを修正してください。後で(彩色中でも)修正は可能ですが、線が太いときの方がラクに修正ができる感じです。
この彩色レイヤは、このままでは線が太いのでこのまま彩色すると分離したトレス線の下に黒いペイント境界がはみ出します。 なかなか格好悪いので、これを抑制する為にフィルタを使用して境界線の細線化を行ないます。
アクション「25細線化」を実行して線を細くします。
現在の細線化アクションは単機能フィルタを4セット実行して線の両側を最高4ピクセル削ります。(ラインの太さが1ピクセルになったらそれ以上は削りません。) (そのうちもっと早いフィルタと換装予定)
細くなった線を元の絵と比べてざっと確認をお願いします。
途中の調整で線画が太くなり過ぎると細線が曲がって原画をはみ出すことがあります。
途中の調整が薄過ぎると、線が切れやすくなります。
うまい調整パラメータとか処理アルゴリズム探索中
作成された彩色レイヤは、線が黒[0/0/0]です。
実は上からトレス線を置いてもこの黒色は、わりとはっきり見えます。が、これは後で消しますのであまり気にしないで下さいね。
領域彩色・色トレス線着彩
彩色レイヤに色を塗ってください。この辺の支援機能は今はありません。
バケツツールでざーっと塗ってもらえば良いかなと思います。
黒い境界線を保護するために、白い部分をあらかじめ削除して「背景」モードで作業すると境界線を間違って塗ってしまう事が無いので作業中、気がラクです。
フィルタ「punchOutWhite」で白部分を一発で抜けます。(色域指定+カットでもok)
境界線の切れ目が残っていて塗っている最中に色がこぼれる場合は、その場でブラシ(鉛筆)にツールを切り替えて切れている境界線を書き足すか、または今塗っている色で切れ目をふさいで塗ってしまって下さい。
境界線を書き足す場合は、黒[0/0/0]です。自動処理の予約色なので値を間違えないようにご注意下さい。
トレースレイヤセットを開いて分離したトレースの色を指定の色にします。(トレース線を塗る)
トレースレイヤの「背景」を保護して、ペイントブラシか、バケツツールで塗るのが割とラクです。
彩色済みレイヤとトレス線の統合
彩色レイヤの上にトレスレイヤを表示すると一応セルらしくなります。が、この方法で塗ったセルは当然ですが「黒い境界線」が透けて気になります。
これを消す為に、「彩色レイヤを選択した状態」でアクション「40境界線削除」を実行してください。
現在のレイヤを複製して黒い境界線を近隣の色で置換えます。黒が残ってしまう場合は、アクションを再実行してください。
もとの彩色レイヤは非表示になって保存されます。(保存不要かも? 現在思案中)
書き出し
現在はナニも支援機能はありません。 アクションに「複製して統合」とか作るかと思案中
作業アクション
この一連の作業は、手作業でも慣れればかなり早く出来ますが、フィルタをいちいち手作業で組み合わせるのは、たいへん面倒なので機能名を付けたアクションを用意します。現在以下のアクションが使えます。 線画の状態によっては不要な工程もありますので、色々とお試しください。ご意見ご感想大歓迎中
00線画前処理
スキャン画像に対して前処理をします。10トレース分離(rcyk)
トレース線を分離します。性能は調整中 改善の余地あり20彩色レイヤ作成
現在の表示画像から彩色レイヤを作ります。25細線化
彩色レイヤの線を細くして塗りやすくします。40境界線消去
塗り上がった彩色レイヤの境界線(黒)を消します。作業補助アクション
機能補助的なアクションもいくつかあります。まだ始めたばかりなので要らないものとかありますが、使いこんで様子を見て行きたいと思います。 ご意見ご感想おまちしておりますので、なんか文句付けてください。 ご希望のアクションとかあればリクエストにもお答えします。
袋塗り作成
トレース線にすごく太い所などがある時、これで袋塗り部分を作ります。必要に応じて[20彩色レイヤ作成]の後[25細線化]前にご使用下さい。
途中の調整で、「残したい線を全て消す」のがポイント
白ドット削除
1ドット残った白部分は塗りにくくてやな感じなので、これで自動的に捨てます。必要に応じて[20彩色レイヤ作成]から[25細線化]のあたりでご使用下さい。
自動処理に組み込んだ方が良いかも知れない。
黒ドット削除
1ドット残った黒いドットを捨てます。…が、作ったのは良いけど使わない様な気がしてます。
後処理でどうせ消してしまうので二度手間か?
必要に応じて[20彩色レイヤ作成]から[25細線化]のあたりでご使用下さい。
主線抽出
トレース線抽出の単独アクションです。色トレース抽出(r)
赤色トレース抽出の単独アクションです。トレース分離(rgbcmyk)
現在の表示画像からトレス分離をします。 rgbcmyk全てのトレースレイヤを作ります。 トレース用レイヤセットは作りません。 試験用です。白部分削除
[255/255/255]の白部分を透明にします。 背景レイヤに対して使ってもレイヤアルファチャンネルが無いのでナニも起きません。
フィルタ機能一覧
今回の彩色支援機能の為に幾つかのフィルタを作成しました。
- MacとWinで同等の機能が欲しい
- ねこまたやではSDKを使ったフィルタの開発環境が無い
以上のふたつの条件の為に現在のフィルタは、
Filter Foundry(ttp://www.telegraphics.com.au/sw/)を使用して作成されています。
そのため処理速度は、「たいへん遅い」ですが、今のところは実験だとおもって堪忍してください。
フィルタについて 詳しくは psPaintPlugin へ 現在のフィルタ解説
borderFill
黒[0/0/0]のピクセルを周囲のそれ以外の色と置換えるフィルタ主に彩色後の「彩色レイヤ」の境界線を消去する為に使用する。 現在は、FFの仕様の為隣接ピクセルのみしか処理できないので、黒ピクセルを全て消去するためには複数回同じフィルタを実行する必要がある。
colorRotation
色相の変換 特定の色トレスを別の色にして抽出できる色相値で指定
dotRemoveK
周辺を白に囲まれた黒いピクセルを白で塗りつぶすフィルタ主に彩色レイヤののごみ取り用
dotRemoveW
周辺を黒に囲まれた白いピクセルを黒で塗りつぶすフィルタ主に彩色レイヤののごみ取り用
paintPreProcess
現在のレイヤを二値化するフィルタ。二値化条件は、やや特殊(単純な域値ではありません。)主に彩色用の線画を生成する為に使用する。
内部的には、RGB各チャンネルの最も低い値を使ったグレースケールを作成して、 そのデータの指定範囲を0-255にマッピングした後で、指定のしきい値で二値化している。
- ctl(0) 取得範囲上限値
- ctl(1) 取得範囲下限値
- ctl(2) 二値化域値 コントロールスライダは、線画の太さと調子を決定する為に使用する。
ただし、このフィルタが作るのでは最終線画ではなくあくまでも「彩色用レイヤ」なので線のきれいさではなく、 薄い色トレス(境界線)が出ているか?必要なエリアが潰れていないか?を主眼にみること。
trace_Xxx
指定のレイヤの特定の色のみを残して他エリアを「抜く」フィルタ主に色トレスの分離に使う。
Xxx 部分は色によって違います。
コントロールスライダは、線画の太さと調子を決定する為に使用する。 上下のスライダの位置によっては画像が反転するので注意が必要
pickup_Color
指定色のみを残して他エリアを抜くフィルタの試験版
フィルタ1本で全色に対応
traceK
指定のレイヤの黒線のみを残して他エリアを「抜く」フィルタ
主に鉛筆線(主線)のトレス分離に使う。
コントロールスライダは、線画の太さと調子を決定する為に使用する。
punchOutWhite
指定レイヤの白部分を抜くフィルタ主に彩色レイヤのヌキ部分を作成する為に使用する。
対象色はW[255/255/255]のみなので、注意
punchOutRed
彩色レイヤの赤部分を抜く専用フィルタ細線化で中間生成される彩色レイヤのヌキ部分を作成する為に使用する。
正確には、赤チャンネルの値をRGBチャンネルに適用してアルファチャンネルに反転Rチャンネルを適用する処理をしているので一般性はありません。 ご注意下さい。
scanLineNormalize
指定されたレイヤのコントラストを調整するフィルタ主にスキャンした線画をセル画用に調整する為に使用する。
コントロールスライダは、線画の太さと調子を決定する為に使用する。
- ctl(0) 彩度域値
- ctl(1) 背景の切り捨て域値
- ctl(2) 線の濃さ
thinXXX
"XXX"部分にはナンバーが入る。 黒白二値画像の細線化を行なう処理の部分フィルタ。thin000 thin001 thin002 thin003 四つのフィルタを順次適用することで、黒線部分を周囲から1ピクセルずつ白に置換える事が出来る。 太さが1ピクセルになった時点で処理が行なわれなくなる。
現在はアクションを使用して4ループ実行している。
「細線化」の一般的な応用は、画像処理の前段であることが多いが、今回は「二値化した線画を彩色向けに調整」する事が目的なので 最大4ピクセル描線が細くなるだけ充分と判断しての処置です。 FFの仕様により、フィルタ内部でのループが出来ないので、このような構成になっています。
最終的にはより高速なフィルタと置換える予定です。
この辺りのプロジェクトに興味のある方へお願い
Filter Foundryは、機種別に異なるバイナリを必要とします。現在以下の機種に対応してそれぞれのバイナリ互換はありません。
- Windows
- 68k Mac
- Mac
- Mac CS2(only)
- Mac CS3(only PPC+Intel) この内、現在のねこまたやで作成しているバイナリは、Windows および Mac の2機種分のみです。
これ以外のプラットフォームをご使用の方は、Filter Foundryをインストールして同梱のソースからフィルタをビルド(Make)する必要があります。 メイクしたバイナリを提供してくださる方が居られましたら、ねこまたやまで連絡頂けると幸いです。
Mac/Winのフィルタ開発環境をおもちの方で、このプロジェクトに協力してくださる方がいれば大歓迎なので もしも気が向いた方、居られましたら「ねこまたや」まで連絡下さい。
…自分で開発環境を準備するか?今はきついなぁ
最後に
ボチボチと、あやしいプロジェクト開始です。気が向いた方、お試しお願いします。
協力者大歓迎。
連番画像処理の支援機能はそのうち着手する予定。
スクリプトを使用した彩色支援機能は、メソッドが固まってから実装予定。アクションとフィルタはエレメントでも使用可能。
画質と速度的には、まだまだだけどそれは、そのうち。「売り」はやっぱりPhotoshop内完結?でしょうか?
お試しセット配布中
ツッコミ歓迎
Powered by YukiWiki 2.1.2a / Modified by Nekomataya.