いろいろ
Seize the day.
2007-01-13 [長年日記]
■ [comp] カラー EPS 画像をコマンド一発でグレースケール変換するワンライナー
カラーの EPS 画像をコマンド一発でグレースケール変換するワンライナーです.特に,Illustrator などでグレースケール化するとファイルサイズが肥大して嫌だという人や,ファイルが大量にある人には便利かと思います.MATLAB R2006b が吐いた EPS (RGB カラー) の場合,
% perl -p -i.bak -e 's/([0-9.]+) ([0-9.]+) ([0-9.]+) sr/0.299*$1+0.587*$2+0.114*$3." sg"/e;' hoge.epsIllustrator 10 が吐いた EPS (CMYK カラー) の場合,
% perl -p -i.bak -e 'use List::Util qw(min);s/([0-9.]+) ([0-9.]+) ([0-9.]+) ([0-9.]+) cmyk/"0 0 0 ".(0.299*min(1,$1+$4)+0.587*min(1,$2+$4)+0.114*min(1,$3+$4)." cmyk")/e;' hoge.epsでいけます.ただし,特殊な図の場合は無理かも.汎用性はあまり確かめてませんし,バージョン依存の可能性もあります.他のアプリケーションで生成した EPS にも使える場合があるかも知れません.バックアップがいらない人は -i.bak を外して下さい.なお,変換式には諸派があるので,あくまで「なんちゃってグレースケール」ということでよろしく.
発端は昼飯時の職場の後輩との会話.
後輩: カラーの PDF をグレースケールにする簡単な方法ってありませんかね?
私: うーん… Illustrator で読み込んでモノクロにできなかったっけ? 自信ないけど.
後輩: できるんですかね? Photoshop でやろうとしたら全体が画像になっちゃってダメでした.
私: あ,Acrobat Distiller にそういう機能なかったっけか?
後輩: それがないんですよ.ていうか MATLAB が吐いた EPS 画像を全部グレースケールにしたいだけなんですけどね.
私: え? 普通に Illustrator で EPS を開いてグレースケールにするんじゃだめ?
後輩: いやー,MATLAB が吐いた EPS を Illustrator で開くととんでもなく肥大化しません? あれが嫌なんです.
私: あーなるほど.うーん…,EPS の PostScript を直接書き換えちゃえばいいんじゃね? …ていうか昔そういうことをやったような記憶が微かにある.むはー.調べてみるか.
後輩: (やや引きつつ) お,おながいします….
というわけで,記憶をひもといてみたところ,昔やったのは「カラー文書を Unix から PostScript プリンタに印刷する時に,プリンタ固有のコードをジョブに追加することで無理矢理モノクロ印刷させる hack」であって,今回のようにファイルそのもののモノクロ化ではなかった (この話はいつか書くかも).あとは EPS 画像内のハイフン記号をマイナス記号に変換する話とかもあったか [2005-11-18].でもまあ,今回も同じ手法が使えるはず,ということで,今日締切の仕事をほっぽりだして現実逃避開始(激ぉ
まず,MATLAB の場合から.同じ図をカラー化したものとモノクロ化したものをそれぞれ保存して diff をとる,というのが基本方針.
MATLAB プロットでは,RGB カラーテーブルは例えば以下のように表現されていることがわかった.
0.000000 0.000000 0.000000 sr 1.000000 1.000000 1.000000 sr 0.900000 0.000000 0.000000 sr 0.000000 0.820000 0.000000 sr 0.000000 0.000000 0.800000 sr 0.910000 0.820000 0.320000 sr 1.000000 0.260000 0.820000 sr 0.000000 0.820000 0.820000 sr小数の triplet が RGB 成分を,sr が RGB カラーであることを示している (ただし,数値は MATLAB のバージョンによって異なるようで,以前は原色が使われていた).順に black,white,red,green,blue,yellow,magenta,cyan に相当する.
いっぽう,グレースケールの場合は,
0.50000 sgのように表され,数値が輝度,sg がグレースケールであることを示している.なので,前者の表現から後者の表現に変換してやればよいことになる.
ではどのように変換するか? ここでは,よく使われている RGB→YIQ 変換を使うことにする (人間の視覚特性を考慮した重みづけがなされている).ここで,Y が輝度を表す.
Y = 0.299R + 0.587G + 0.114Bつまり,EPS ファイルの中から RGB 成分を抜き出して上式で変換したもので置換してやればよいわけだ.このワンライナーでは Perl の s 関数に e オプションをつけて,置換部分を式として評価させている.
いっぽう,Illustrator の吐くファイルの場合はもう少し複雑で,色は CMYK 空間で表現されている.
.0157 .2431 .2863 0 cmykそこで,CMYK→RGB→YIQ 変換を行う.RGB と CMYK の関係は,
R = min(1, C+K) G = min(1, M+K) B = min(1, Y+K)となっているので (諸派あるが,最も単純なものを用いた),これを用いて
0 0 0 0.1800322 cmykのように K 成分のみに輝度情報を入れてやれば OK.Illustrator でグレースケール化したものと値を比べてみたが,だいたい近い値にはなっているようだ.
ワンライナー万歳!
[ ツッコミ | permalink | trackback ]
[TrackBack URL: http://nao.s164.xrea.com/td/tb.rb/20070113]
[(注) スパム対策のため,言及リンクのないトラックバックは受け付けていません.]
[(注) スパム対策のため,言及リンクのないトラックバックは受け付けていません.]
本日のリンク元
その他のリンク元
検索
- グレースケール化 ×47 / matlab グレースケール ×17 / YIQ変換 ×11 / RGB YIQ 変換 ×10 / RGB グレースケール 変換 ×10 / eps グレースケール 変換 ×10 / MATLAB グレースケール ×9 / matlab グレースケール 変換 ×7 / イラストレータ RGB CMYK 変換式 ×7 / matlab red成分 ×6 / eps グレースケール ×6 / illustrator グレースケール ×5 / Illustrator コマンド ×5 / キーワード不明 ×5 / illustrator グレースケール化 ×5 / matlab rgb ×5 / RGB YIQ 重み 視覚特性 ×4 / 輝度 MATLAB カラーからモノクロ ×4 / グレースケール matlab ×4 / グレースケール変換 ×4 / eps モノクロ 変換 ×4 / EPS グレースケール変換 ×4 / pdf グレースケール ×4 / eps ファイル 変換 色 ×3 / matlab カラー モノクロ ×3 / CYMK RGB 変換 MATLAB ×3 / PDF カラー グレースケール 変換 ×3 / matlab 画像 RGB ×3 / eps カラー matlab ×3 / MATLAB モノクロ 変換 ×3 / グレースケール 重み ×3 / グレースケール変換 輝度 ×3 / photoshop グレースケール 変換式 ×3 / MATLABで使う RGB ×3 / カラー 画像 重み ×3 / pdf カラー グレー 変換 ×3 / 輝度 画像 matlab ×3 / acrobat RGB グレー 変換 ×3 / グレースケール MATLAB ×3 / CMYK RGB 変換式 ×3 / CMYK RGB 変換 式 ×3 / Illustrator グレースケール ×3 / MATLAB RGB CMYK ×3 / matlab カラー ×3 / perl ワンライナー 全角変換 ×3 / matlab eps ×2 / illustrator グレースケール 変換 ×2 / CMYK 輝度 変換 ×2 / Illustrator RGB CMYK K ×2 / matlab 印刷 マイナス ×2 / ILLustrator スクリプト グレースケール変換 ×2 / eps画像 拡張子変換 ×2 / matlab RGB情報 輝度情報 変換 ×2 / eps cmyk ×2 / 自動 グレースケール ×2 / MAtlab RGB 0.299 ×2 / グレースケール 変換 コマンド ×2 / RGB CMYK 変換式 ×2 / YIQ変換 画像 ×2 / matlab min ×2 / PDF グレースケール ×2 / eps 表示するコマンド ×2 / pdf グレースケール 変換 ×2 / PDF グレースケール化 ×2 / Acrobat 8 グレースケール変換 ×2 / rgb cmyk 変換式 ×2 / eps cmyk rgb 変換 ×2 / PDF グレースケール 変換 ×2 / matlab カラー rgb ×2 / matlab RGB ×2 / カラー 画像 グレースケール 変換 ×2 / matlab コマンド 画像 ×2 / カラー 数値 変換式 ×2 / YIQ 変換 ×2 / カラー グレースケール化 ×2 / psファイル グレースケールに コマンド ×2 / CMYK RGB 変換 ×2 / matlab モノクロ 変換 ×2 / MATLAB グレースケールにする ×2 / EPS RGB ×2 / グレースケール EPS 変換 ×2 / ps 印刷 グレースケール ×2 / グレースケール CMYK RGB ×2 / CMYK変換 コマンドライン ×2 / tex eps グレースケール ×2 / 画像 eps カラー ×2 / eps変換 コマンド ×2 / 画像 グレースケール化 ×2 / CMYK rgb 変換式 ×2 / distiller グレースケール 変換 ×2 / pdfをグレースケールに ×2 / illustrator cs グレースケール変換 ×2 / RGB 変換 YIQ ×2 / MATLAB 画像変換 ×2 / illustrator モノクロ ×2 / グレースケール変換方法 ×2 / ガチャピン EPS ×2 / グレイスケール eps ×2 / PDF 保存 グレースケール ×2 / matlab 輝度情報 ×2
以下の広告はサーバによって自動的に挿入されています.
Copyright © 2004-2006, nao. All rights reserved.





