2017年7月31日月曜日

C# Magick.NETを使ってみる。画像の複製と切り出し

C# Magick.NETを使ってみる
目次→http://1studying.blogspot.jp/2017/07/c-magicknetmokuzi.html#kuw15


画像の複製と切り出し


「Clone」で画像を複製。
「Crop」で画像の特定箇所を切り出します。

            var fileName = "./色チャート/色600_グレー.tif";
            using (var myMagick = new ImageMagick.MagickImage(fileName))
            {
                //画像の複製
                using(var cloneImage = myMagick.Clone())
                {
                    //x100,y50の位置から横500縦300pixel切り出し
                    cloneImage.Crop(100, 50, 500, 300);
                    cloneImage.Write("./test_outfile1.tif");
                }
                myMagick.Write("./test_outfile2.tif");

            }
            MessageBox.Show("処理終了。");








C# Magick.NETを使ってみる。Fx

C# Magick.NETを使ってみる
目次→http://1studying.blogspot.jp/2017/07/c-magicknetmokuzi.html#kuw14


「Fx」は用意した式を使い、各Pixelに対して計算を行う事ができます。
「Fx」は様々な事ができる反面、処理が重めですし、式を作るのが面倒な事もあり、
気軽には使用しにくい機能ですが、うまくはまれば非常に便利な機能だと思います。

Fx


式の記述には文字列を使用します。
(チャンネル指定も可能です。)
IM使用例→https://www.imagemagick.org/script/fx.php
IM使用例→https://www.imagemagick.org/Usage/transform/index.html#fx

Fx系は色々できるがあまりにも処理が重すぎて、
場合によっては直接画像いじくっちゃった方が早いかもしれない。
保留。




以下のサイトを参考にしました。


オリジナルの計算式作成例、魚眼
http://q.hatena.ne.jp/1347662738

IM写真から指定の色の半透明濃淡画像に変換する
http://kyle-in-jp.blogspot.jp/2008/04/imagemagick.html


2017年7月24日月曜日

C# Magick.NETを使ってみる。シャープ、ぼかし

C# Magick.NETを使ってみる
目次→http://1studying.blogspot.jp/2017/07/c-magicknetmokuzi.html#kuw13


シャープ、アンシャープマスク


「シャープ、アンシャープ」はチャンネルに対してかける事もできます。
強い数値を1回かけるより、弱い数値で複数回かけた方が結果が良いです。

シャープ
IM使用時→http://www.imagemagick.org/Usage/blur/#sharpen
                //シャープ
                //引数(0固定, シャープ量)
                myMagick.Sharpen(0, 0.8);//Psに寄せた値

シャープ(強)
                //シャープ(強)
                //引数(0固定, シャープ量)
                myMagick.Sharpen(0, 0.9);//2回かけで、
                myMagick.Sharpen(0, 0.9);//Psに寄せた値となる

シャープ(輪郭のみ)
                //シャープ(輪郭のみ)
                //画像の輪郭に対してシャープ適用。
                //引数(Pixel範囲, シャープ量)
                //シャープ量は0.9位でも良い結果が出る。
                myMagick.AdaptiveSharpen(0.0, 0.7);//Psに寄せた値


アンシャープ
IM使用時→http://www.imagemagick.org/Usage/blur/#unsharp
                //アンシャープ
                //引数(Pixel範囲, アンシャープ量, 量, 閾値レベル0か1/1~255)
                //Pixel範囲→0で自動。アンシャープ量に左右される。
                //アンシャープ量→
                //量→1.0で100%、2.0で200%だが、Psよりかかりが弱い気がする
                //閾値レベル→0か1/1~255……「Q16」だと65535になるのかな?未確認
                myMagick.UnsharpMask(0.0, 1.0, 1.0, 0.0);




ぼかし


「ぼかし」はチャンネルに対してかける事もできます。
強い数値を1回かけるより、弱い数値で複数回かけた方が結果が良いです。
IM使用時→http://www.imagemagick.org/Usage/blur/#blur_args

ぼかし
                //ぼかし
                //引数(Pixel範囲, ぼかし量)
                myMagick.Blur(0.0, 0.45);//Psに寄せた値

ぼかし(強)
                //ぼかし(強)
                //引数(Pixel範囲, ぼかし量)
                myMagick.Blur(1.0, 0.7);//Psに寄せた値

ぼかし(ガウス)
                //ぼかし(ガウス)
                //引数(Pixel範囲, ぼかし量)
                myMagick.GaussianBlur(2.0, 1.2);//Psの1pixelに寄せた値

ぼかし(輪郭以外)
                //ぼかし(輪郭以外)
                //引数(Pixel範囲, ぼかし量)
                myMagick.AdaptiveBlur(5.0, 5.0);

ぼかし(移動)
                //ぼかし(移動)
                //引数(Pixel範囲, ぼかし量, 移動角度)
                myMagick.MotionBlur(5.0, 5.0, 45.0);

ぼかし(放射状、回転)
                //ぼかし(放射状、回転)
                //引数(ぼかし回転量)
                myMagick.RotationalBlur(10);

ぼかし(しきい値)
                //ぼかし(しきい値)
                //色が閾値%以下と色差が閾値以下の物をぼかす。処理が重い。
                //引数(Pixel範囲, ぼかし量, 閾値%)
                myMagick.SelectiveBlur(5.0, 5.0, new ImageMagick.Percentage(50.0));





以下のサイトを参考にしました。

IMぼかしとシャープ
http://www.imagemagick.org/Usage/blur/

シャープとアンシャープの違い
https://silkypix.isl.co.jp/how-to/function/sharpness-unsharp-mask/
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1428974339

画像をぼかす
http://imagemagick.rulez.jp/archives/432




2017年7月22日土曜日

C# Magick.NETを使ってみる。リサイズ拡大縮小

C# Magick.NETを使ってみる
目次→http://1studying.blogspot.jp/2017/07/c-magicknetmokuzi.html#kuw12


リサイズ


画像の拡大縮小を行います。
%でリサイズ
                //%リサイズ
                myMagick.Resize(new ImageMagick.Percentage(50.0));

横%縦%でリサイズ
                //横%縦%でリサイズ
                myMagick.Resize(new ImageMagick.Percentage(50.0), new ImageMagick.Percentage(100.0));

指定Pixel以下の画像にリサイズ(縦横比率は変更無し)
                //指定Pixel以下の画像にリサイズ(縦横比率は変更無し)
                myMagick.Resize(500, 500);


サムネイル作成用リサイズ(高速縮小)
                //サムネイル作成時の高速縮小用
                //・「Thumbnail」は内部で以下の処理が自動で行う事により、
                // サムネイルの作成を高速処理させます。
                // 1)「myMagick.Strip()」Exif等の画像情報除去(但しICCプロファイルは削除しません)
                // 2)「myMagick.Sample(~)」画像をターゲットサイズの高さの5倍まで縮小
                // 3)「myMagick.Resize(~)」画像をターゲットサイズへ縮小
                myMagick.Strip();
                myMagick.Thumbnail(100,100);
                //圧縮率(0低圧縮~100高圧縮)JpegやPngに対応
                //myMagick.Quality = 0; 


高速リサイズ(通常は使用しない)
                //高速リサイズ(通常は使用しない)
                //「Resize」を簡略化、高速化版。「ピクセル平均化で縮小」あまり使用しません。
                //(200%や400%等の倍数拡大時、エッジがぼやけない)
                myMagick.Scale(new ImageMagick.Percentage(150.0));
                //「Resize」を簡略化、高速化版。「行列の複製削除リサイズ」。
                //(「Scale」よりも更に高速。
                // リサイズ時に色の追加や削除を行わない為、GIFアニメーションリサイズ時等で使用できる)
                myMagick.Sample(new ImageMagick.Percentage(150.0));


倍数拡大(まろやか綺麗)
1回実行する毎に倍に拡大されます。拡大時のエッジが非常にまろやかになります。
倍数拡大のみですが、新たな色の追加がなく、かなり綺麗に拡大されます。
使用例が以下に記載されています。
IM使用方法→http://www.imagemagick.org/Usage/resize/#magnify
使用例→http://www.scale2x.it/
                //倍数拡大(まろやか綺麗)
                myMagick.Magnify();
                myMagick.Magnify();
                //複数回使用が可能です。この例では400%拡大となります。


%でリサイズ(ぼけ最小、+-50%以内)
「Resize」時のぼけを最小にしたリサイズを行います。
但し、+−50%以内のみ有効です。
それ以外を入力すると、エイリアシングやモアレが発生します。
IM使用法→http://www.imagemagick.org/Usage/resize/#adaptive-resize
エイリアシングやモアレ→http://www.imagemagick.org/Usage/filter/#aliasing
                //%でリサイズ(ぼけ最小、+-50%以内)
                //(+-50%以内のみ有効。それ以外を入力すると、
                //エイリアシングやモアレが発生します。)
                myMagick.AdaptiveResize(new ImageMagick.MagickGeometry((int)Math.Round(myMagick.Width*1.5, MidpointRounding.AwayFromZero), (int)Math.Round(myMagick.Height * 1.5, MidpointRounding.AwayFromZero)));


シームカービングでリサイズ(画像印象を保持)
画像の印象をできる限り保持してリサイズを行う。
見た目に凄い機能ですが、画像の内容によっては不自然な歪みが生じます。
IM使用法→http://www.imagemagick.org/Usage/resize/#interpolative-resize
シームカービング→https://en.wikipedia.org/wiki/Seam_carving
YouTubeでのデモ→https://youtu.be/vIFCV2spKtg
                //シームカービングでリサイズ(画像印象を保持)
                //(画像内容によっては不自然な歪みが生じます)
                myMagick.LiquidRescale(new ImageMagick.Percentage(70.0), new ImageMagick.Percentage(100.0));



自由変形でリサイズ
自由変形を利用してリサイズを行います。
自由変形のアルゴリズムを選択できます。
「Resize」より結果が良くなる事がありますが、その分処理が重くなります。
(フィルターとの併用も可能っぽい?未確認。)
IM使用法→http://www.imagemagick.org/Usage/resize/#distort
IM使用法→http://www.imagemagick.org/Usage/distorts/#resize
                //自由変形でリサイズ
                double resizePercent = 1.0; //変倍率(100%→1.0)
                int out_Width = (int)Math.Round(myMagick.Width * resizePercent, MidpointRounding.AwayFromZero);
                int out_Height = (int)Math.Round(myMagick.Height * resizePercent, MidpointRounding.AwayFromZero);
                var param = new double[]
                {
                    0,0,                                //入力_左上座標
                    0,0,                                //出力_左上座標
                    0,myMagick.Height,                  //入力_左下座標
                    0,out_Height,                       //出力_左下座標
                    myMagick.Width,myMagick.Height,     //入力_右下座標
                    out_Width,out_Height,               //出力_右下座標
                    myMagick.Width,0,                   //入力_右上座標
                    out_Width,0                         //出力_右上座標
                };
                //自由変形
                //第2引数がtrueの場合は処理結果画像の全体を表示(RePage処理が必要となります)
                //第1引数で変換時のアルゴリズムを変更できます
                myMagick.Distort(ImageMagick.DistortMethod.Affine, true, param);
                //画像の位置をリセット
                myMagick.RePage();
                //上下左右に1pxelずつ無駄なPixelが追加される為、削除。
                myMagick.Crop(1, 1, out_Width, out_Height);



解像度の変更(縦横サイズ固定、縦横Pixel数変化)
画像の縦横のサイズを保ったまま解像度を変更した場合、
縦横のPixel数は変更解像度に従って変化します。
この時、内部でリサイズ処理が行われます。
IM使用時→http://www.imagemagick.org/Usage/resize/#resample
                //解像度の変更(縦横サイズ固定、縦横Pixel数変化)
                //縦横のサイズを保ったまま解像度を変更します。
                //その為、縦横のPixel数は指定解像度に従って変化します
                myMagick.Resample(300.0, 300.0);



%でリサイズ(フィルターを指定)
「Resize」時フィルターを使用する事で様々なアルゴリズムを使用できます。
例えばリサイズに「バイキュービック法」を使いたい場合は、
フィルターで「Cubic」を選択します。
IM使用時→http://www.imagemagick.org/Usage/filter/
フィルタ使用例→http://www.robotplanet.dk/graphics/imagemagick_scaling/
各フィルタのグラフ→http://sharp-bang.jp/prog/im.html
                //%リサイズ(フィルターを指定)
                //Pointフィルタは変倍時ボケが出ませんが、モアレが顕著に出ます。
                myMagick.FilterType = ImageMagick.FilterType.Point;
                myMagick.Resize(new ImageMagick.Percentage(150.0));
                myMagick.FilterType = ImageMagick.FilterType.Undefined;//初期値に戻す。






以下のサイトを参考にしました。

ImageMagickでのリサイズについて説明
http://www.imagemagick.org/Usage/resize/
ImageMagickでのピクセルの拡大縮小時の畳み込み方法等の説明
http://www.imagemagick.org/Usage/morphology/


リサイズ時、独自のアルゴリズムを制作「FCBI」
「Nearest-Neighbor」「Bi-Liner」「Bi-Cubic」「Lanczoz」「Mitchell」
アルゴリズムによる違いも書いてある。
https://blog.awm.jp/2017/03/07/fcbi/
https://blog.awm.jp/2017/03/08/fcbi/
https://blog.awm.jp/2017/03/11/fcbi/

画像のリサイズ時、
「Nearest Neighbor法」「Bilinear法」「Bicubic法」「Lanczos法」
http://koujinz.cocolog-nifty.com/blog/2009/04/post-b8e6.html

IMのリサイズについて結構詳細にまとめてくれている
http://freeparticle.hatenablog.com/entry/2015/01/16/230956

2017年7月19日水曜日

C# Magick.NETを使ってみる。モノクロ2階調変換

C# Magick.NETを使ってみる
目次→http://1studying.blogspot.jp/2017/07/c-magicknetmokuzi.html#kuw09

「Magick.NET」で
グレースケール画像を、モノクロ2階調へ変換する方法を記載します。
(2階調画像を作成する場合は、
必ず事前にグレースケール画像を用意します。)

画像のグレースケール化処理については以下のリンク先を参照して下さい。
「C# Magick.NETを使ってみる。グレースケール変換」
http://1studying.blogspot.jp/2017/07/c-magicknet.html



しきい値で2値化


グレースケール画像を閾値で2値化します。
                //閾値で2階調化(カラータイプ変更無し)
                myMagick.Threshold(new ImageMagick.Percentage(50.0));//50%→128

グレースケール画像を閾値で2値化時、
閾値より暗い色を全て黒(K100)にします。
                //閾値より暗い色を全て黒(K100)にする(カラータイプ変更無し)
                myMagick.BlackThreshold(new ImageMagick.Percentage(50.0));//50%→128

グレースケール画像を閾値で2値化時、
閾値より明るい色を全て白(K0)にします。
                //閾値より明るい色を全て白(K0)にする(カラータイプ変更無し)
                myMagick.WhiteThreshold(new ImageMagick.Percentage(50.0));//50%→128




ディザで2値化


「Magick.NET」ではグレースケール画像をディザで2値化する場合、
初期値として「Riemersmaディザ」が使われます。
                //「Riemersmaディザ」で2値化(カラータイプ変更無し)
                myMagick.ColorType = ImageMagick.ColorType.Bilevel;

「Riemersmaディザ」を明示して2値化を行う場合は、クオンタイズを使います。
以下のようにします。
                //「Riemersmaディザ」で2値化(カラータイプ変更無し)
                ImageMagick.QuantizeSettings qSetting = new ImageMagick.QuantizeSettings();
                qSetting.ColorSpace = ImageMagick.ColorSpace.Gray;
                qSetting.DitherMethod = ImageMagick.DitherMethod.Riemersma;
                qSetting.Colors = 2;
                myMagick.Quantize(qSetting);


「誤差拡散ディザ」の「フロイドスタインバーグ」(よく使われるディザ処理です)
を明示して2値化を行う場合は、クオンタイズを使います。
以下のようにします。
                //「誤差拡散ディザ」「フロイドスタインバーグ」で2値化(カラータイプ変更無し)
                ImageMagick.QuantizeSettings qSetting = new ImageMagick.QuantizeSettings();
                qSetting.ColorSpace = ImageMagick.ColorSpace.Gray;
                qSetting.DitherMethod = ImageMagick.DitherMethod.FloydSteinberg;
                qSetting.Colors = 2;
                myMagick.Quantize(qSetting);


考察:
Photoshopの誤差拡散ディザはフロイドスタインバーグとは違う結果となる。
独自のアルゴリズムっぽい気がする。(Sierraっぽい?)
(参照→https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%A3%E3%82%B6
「Magick.NET」のディザ処理は、
「Riemersmaディザ」も「誤差拡散ディザ」の「フロイドスタインバーグ」も、
Photoshopと比べて結果があまり良くない。
グレーの10%以下は飛ぶし、85%以上は潰れた表現になる。

自分用メモ:
「フロイドスタインバーグ」は「Magick.NET」に用意されている物より、
自作した物の方が結果が良かった。
「C# Magick.NET 自作ディザの作成」(非公開)
http://00studying.blogspot.jp/2017/07/c-magicknet.html?zx=a09787eceddc7dea


「無作為 (Random) ディザ」
ランダムにディザを掛ける為、毎回結果が変わります。
                //「無作為 (Random) ディザ」で2値化(カラータイプ変更無し)
                myMagick.RandomThreshold(new ImageMagick.Percentage(0.0), new ImageMagick.Percentage(100.0));
(グレースの5%以下や95%以上も、ちゃんとディザがかかるが、
細部の表現に弱い)




スクリーントーンで2値化


「Magick.NET」はスクリーントーンで2値化を行う際、
スクリーンの選択肢が少なく、角度指定も出来ないです。
かなりザックリとした物となります。
                //「スクリーントーン」で2値化
                myMagick.OrderedDither("h8x8a");
引数の文字列には、標準で以下の設定が用意されています。
(threshold,checks,
o2x2,o3x3,o4x4,o8x8,
h3x4a,h6x6a,h8x8a,
h3x4o,h6x6o,h8x8o,h36x16o,
c5x5b,c5x5w,c6x6b,c6x6w,c7x7b,c7x7w)

「Magick.NET」の標準では、
「Photoshop」の「スクリーントーン」とは程遠い結果となります。

自分用メモ:
「Photoshop」の「スクリーントーン」に処理結果を近づける。
「C# Magick.NETで「Photoshop」の2値網化をエミュレート1」非公開
http://00studying.blogspot.jp/2017/07/c-magicknetphotoshop.html
「C# Magick.NETで「Photoshop」の2値網化をエミュレート2」非公開
http://00studying.blogspot.jp/2017/07/c-magicknetphotoshop_11.html




ローカルしきい値で2値化


指定したピクセル範囲内のピクセル濃度の平均を閾値として、
2値化処理を行います。
                //「ローカル閾値法」で2値化
                //4x4の周辺ピクセルの単純平均を取りそれを閾値として2値化する
                myMagick.AdaptiveThreshold(4, 4);
                myMagick.Negate();



その他



ImageMagickなら
「convert -list threshold」で所有ディザマップ(所持網点)の一覧表示

参考にしたサイト
2値化して、1bppの白黒画像を作成する
(C#での2値画像の作成)
https://dobon.net/vb/dotnet/graphics/1bpp.html
B/W Halftone Dither
https://www.imagemagick.org/discourse-server/viewtopic.php?t=17389
ディザ処理とハーフトーン処理の概要
http://caca.zoy.org/study/part2.html
誤差拡散の説明
http://caca.zoy.org/study/part3.html
ディザ
https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%A3%E3%82%B6
ディザ「C#画像を色から白黒に変換する」
https://stackoverflow.com/questions/31148616/c-sharp-convert-an-image-from-color-to-a-black-and-white
ImageMagickでのディザを使った様々なテスト結果。
http://bisqwit.iki.fi/jutut/colorquant/

ローカルしきい値法の説明
http://ishidate.my.coocan.jp/vcpp10_g9/vcpp10_g9.htm


2017年7月12日水曜日

C# Magick.NETを使ってみる 「目次」

C# Magick.NETを使ってみる「目次」

取っ散らかってきたので目次を作りました。
結構深い部分まで調べたトピックもあります。

基本的な「Magick.NET」の使い方は「GitHub」の「Documentation」で
解説されています。
https://github.com/dlemstra/Magick.NET/tree/master/Documentation

解説内に出てくる全ての「myMagick」オブジェクトは
「ImageMagick.MagickImage」のインスタンスとなります。

C# Magick.NETを使ってみる。その1

http://1studying.blogspot.jp/2017/05/c-magicknet.html

・描画系の処理
  楕円と線の描画
  角丸四角と文字列の描画
・画像を開いて保存
  「bmp画像を開く」→「50%縮小」→「グレースケール化」→「tif形式で保存」
・「Magick画像」と他バイナリ形式との相互変換
  「ストリーム」や「byte[]」を「Magick画像」として開く
  「ファイル」や「Bitmap」や「ストリーム」や「byte[]」へ書き出す


C# バッキングストアとストリームについて

http://1studying.blogspot.jp/2017/05/c.html

・バッキングストア(backing store)とは…

・ストリーム(Stream)とは…
  「System.IO.FileStream」クラス
  「System.Net.Sockets.NetworkStream」クラス
  「System.IO.MemoryStream」クラス
  「System.IO.BufferedStream」クラス
  使用する際の注意
・Streamクラス…
  プロパティ
  メソッド
・使ってみる
  「MemoryStream」を使ってみる
  「FileStream」を使ってみる


C# Magick.NETを使ってみる。その2

http://1studying.blogspot.jp/2017/05/c-magicknet_31.html

・画像の開き方1

・画像の開き方2(PDFやEPSやAI)
  「Ghostscript」のインストール
  「PDF」や「EPS」や「AI」を開く
  「複数頁PDF」を開く(頁指定も)
  「複数頁PDF」への保存
  ラスタライズ時のアンチエイリアス設定
・画像の開き方3(PSDとレイヤー)
  PSDを開く(レイヤー含む)
  指定レイヤーを開く
  PSDでの保存
・画像の開き方4(-define jpeg)
  「画像情報」取得
  「Exif情報」取得
  「Exif情報」から「サムネイル画像」の取得
  「Magick画像」情報取得


C# Magick.NETを使ってみる。補足 画像情報取得

http://1studying.blogspot.jp/2017/07/c-magicknet_12.html

・画像の主要情報取得
  画像の主要情報取得の為のコードを記載


C# Magick.NETを使ってみる。その3

http://1studying.blogspot.jp/2017/06/c-magicknet_28.html

・「色深度」について

・色の指定
  色の指定の仕方1(RGB)
  色の指定の仕方2(アルファ)
  色の指定の仕方3(CMYK)
  色の指定の仕方4(グレー)
  色の指定の仕方5(ICCプロファイル、デバイス)
・「Photoshop」上での「カラーモード」と「ICCプロファイル」


Photoshop上でのカラーモードとICCプロファイル

http://1studying.blogspot.jp/2017/05/photoshopicc.html

・「カラーモード」と「ICCプロファイル」
  カラーモード(カラータイプ)
  ICCプロファイル
・「作業用スペース」と「プロファイルの指定」
  「作業用スペース」(表示用「ICCプロファイル」指定)
  「プロファイルの指定」(「ICCプロファイル」埋め込み設定)
・「プロファイル」状態によるタイトルバー表示の違い
  「RGB/8」「RGB/8#」「RGB/8*」の違い
・「カラーモード」の変換について
  「カラーモード」を変換してみる
  「Photoshop」での実際の「RGB→CMYK」変換手順


C# Magick.NETを使ってみる。ICCプロファイル変換

http://1studying.blogspot.jp/2017/07/c-magickneticc.html

・色々なプロファイル
  埋め込みプロファイル名表示
・「Magick.NET」の標準「ICCプロファイル」

・「ICCプロファイル」変換(普通の方法)
  「RGB」から「CMYK」への色変換
・「ICCプロファイル」変換(普通の方法)解説
  RGBの「ICCプロファイル」
  CMYKの「ICCプロファイル」
  「変換方式」
  「マッチング方法」(レンダリングインテント)
  「黒点の補正を使用」
  「ディザの使用」


C# Magick.NETを使ってみる。グレースケール変換

http://1studying.blogspot.jp/2017/07/c-magicknet.html

・カラースペースでグレー変換
  グレーへ変換
・「Intensity」強度を指定してグレー変換
  グレー化時「Intensity」を選択
・「FX」で手動グレー変換

・「ColorMatrix」で手動グレー変換
  変換用パラメータの行列
  パラメータ行列の意味
  レシピ1
  レシピ2
  RGBをグレー変換するには
・グレー化時、「Intensity」強度の種類に合わせるには


C# Magick.NETを使ってみる。モノクロ2階調変換

http://1studying.blogspot.jp/2017/07/c-magicknet_19.html

・しきい値で2値化
  閾値で2値化
  閾値で2値化。暗い色をK100
  閾値で2値化。明るい色をK0
・ディザで2値化
  「Riemersmaディザ」で2値化
  「Riemersmaディザ」で2値化(明示)
「誤差拡散ディザ」「フロイドスタインバーグ」で2値化(明示)
  「無作為 (Random) ディザ」で2値化
・スクリーントーンで2値化

・ローカルしきい値で2値化
  「ローカル閾値法」で2値化


C# Magick.NETを使ってみる。 トーンカーブ

http://1studying.blogspot.jp/2017/06/c-magicknet_9.html

・ガンマを使ってみる

・レベルを使ってみる
  レベルを使ってみる
  「ライナーストレッチ」を使う
・Fxを使ってみる
  「gnuplot」のインストール
  「gnuplot」で計算式を導き出す(4つのポイント用)
  Fxに計算式を適用させる
  「gnuplot」で計算式を導き出す(3〜12ポイント用)
・modulateを使ってみる
  モデュレートで明度、彩度、色相変更
・SigmoidalContrastを使ってみる
  引数の説明
  「シグモイダルコントラスト」の使用
・FunctionのPolynomialを使ってみる


C# Magick.NETを使ってみる。画像回転

http://1studying.blogspot.jp/2017/07/magicknet.html

・通常の回転

・アフィン変換による回転

・Exif情報内のorientation情報について


C# Magick.NETを使ってみる。リサイズ拡大縮小

http://1studying.blogspot.jp/2017/07/c-magicknet_22.html

・リサイズ
  %でリサイズ
  横%縦%でリサイズ
  指定Pixel以下の画像にリサイズ(縦横比率は変更無し)
  サムネイル作成用リサイズ(高速縮小)
  高速リサイズ(通常は使用しない)
  倍数拡大(まろやか綺麗)
  %でリサイズ(ぼけ最小、+-50%以内)
  シームカービングでリサイズ(画像印象を保持)
  自由変形でリサイズ
  解像度の変更(縦横サイズ固定、縦横Pixel数変化)
  %でリサイズ(フィルターを指定)


C# Magick.NETを使ってみる。シャープ、ぼかし

http://1studying.blogspot.jp/2017/07/c-magicknet_24.html

・シャープ、アンシャープマスク
  シャープ
  シャープ(強)
  シャープ(輪郭のみ)
  アンシャープ
・ぼかし
  ぼかし
  ぼかし(強)
  ぼかし(ガウス)
  ぼかし(輪郭以外)
  ぼかし(移動)
  ぼかし(放射状、回転)
  ぼかし(しきい値)


C# Magick.NETを使ってみる。Fx

http://1studying.blogspot.jp/2017/07/c-magicknetfx.html

・Fx
  保留


C# Magick.NETを使ってみる。画像の複製と切り出し

http://1studying.blogspot.jp/2017/07/c-magicknet_31.html

・画像の複製と切り出し




ダミー

ダミー








ここから下は自分用の目次。
リンク先は非公開となります。


C# Magick.NETで「Photoshop」のカラーモード変換をエミュレート

http://00studying.blogspot.jp/2017/07/c-magicknetcolorpshopemu.html

・「RGB」と「CMYK」の相互変換

・「RGB」から「グレースケール」へ変換(Photohosp互換)
  RGB → 「Phothoshop」グレー化
・「CMYK」から「グレースケール」へ変換2(Rip互換)
  CMYK → Ripグレース化


C# Magick.NETで「Photoshop」の2値網化をエミュレート1

http://00studying.blogspot.jp/2017/07/c-magicknetphotoshop.html

・準備
  自作網点の追加
・使い方
  自作した網点を読み込む
  自作した網点の使用例


C# Magick.NETで「Photoshop」の2値網化をエミュレート2

http://00studying.blogspot.jp/2017/07/c-magicknetphotoshop_11.html

網点選択一覧
「ImageMagick」を「bash」から使用する場合
・網点を自作
 「Indesign」「javascript」


C# Magick.NET Pixelへのアクセス

http://00studying.blogspot.jp/2017/07/c-magicknet-pixel.html

・Pixelへのアクセス(通常)
  Pixelへアクセス(通常)foreach
  Pixelへアクセス(通常)xyループ
・Pixelへのアクセス(高速)

・画像のテキスト変換


C# Magick.NET 自作ディザの作成

http://00studying.blogspot.jp/2017/07/c-magicknet.html

・自作ディザ「Void and cluster」
  使い方
・自作誤差拡散ディザ「フロイドスタインバーグ」

・自作誤差拡散ディザ「JaJuNi(Jarvis,Judice and Ninke)」

・自作誤差拡散ディザ「3行シエラ」

・自作誤差拡散ディザ「2行シエラ」(Two-row Sierra)

・自作誤差拡散ディザ「SierraLite」

・自作誤差拡散ディザ「Atkinson」

・自作誤差拡散ディザ「Stucki」

・自作誤差拡散ディザ「Burkes」



C# Magick.NET フーリエ変換

http://00studying.blogspot.jp/2017/07/c-magicknet_26.html

うまく行かない為、保留


C# Magick.NET 課題。やり残しメモ。

http://00studying.blogspot.jp/2017/07/c-magicknet_31.html






ダミー

ダミー










以下のサイトを参考にしました。

「IM使用例まとめ」
http://www.imagemagick.org/Usage/

「JMagickまとめ」
http://kyle-in-jp.blogspot.jp/2011/07/jmagick.html





C# Magick.NETを使ってみる。ICCプロファイル変換

C# Magick.NETを使ってみる
目次→http://1studying.blogspot.jp/2017/07/c-magicknetmokuzi.html#kuw07

「Magick.NET」の「ICCプロファイル」の扱い方。

先に、
「Photoshop」でのカラーマネジメント方法を知る必要があります。
Photoshop上でのカラーモードとICCプロファイル
については以下のリンク先で説明しています。
http://1studying.blogspot.jp/2017/05/photoshopicc.html


色々なプロファイル


画像ファイル「ICCプロファイル」の他にも、
様々な「プロファイル」が付加されている(埋め込まれている)可能性があります。
            using (var myMagick = new ImageMagick.MagickImage("./test_RGB.psd"))
            {
                var strArray = myMagick.ProfileNames.ToArray();
                MessageBox.Show(strArray.Length.ToString());
                foreach (var profileName in strArray)
                {
                    MessageBox.Show(profileName); //埋め込みプロファイル名を表示
                }
            }
            MessageBox.Show("処理終了");
の様にすると確認できます。
実行すると、
「5」「8bim」「exif」「icc」「iptc」「xmp」「処理終了」
のように順表示されます。
(ファイルに埋め込まれていないプロファイルは表示されません。)

・「8bim」(8bimプロファイル)
 →「myMagick.Get8BimProfile()」
・「exif」(Exif情報)
 →「myMagick.GetExifProfile()」
・「icc」(カラーマネジメント用「ICCプロファイル」)
 →「myMagick.GetColorProfile()」
 画像を表示する際の、色変換フィルタ。
・「iptc」(IPTC情報)
 →「myMagick.GetIptcProfile()」
・「xmp」(Xmp情報)
 →「myMagick.GetXmpProfile()」
 「Photoshop」上でファイル情報からも確認できる。(IPTC情報も編集可)



「Magick.NET」の標準「ICCプロファイル」


「Magick.NET」では、標準的に以下の「ICCプロファイル」を内蔵しています。

「AdobeRGB1998」「AppleRGB」「CoatedFOGRA39」
「ColorMatchRGB」「SRGB」「USWebCoatedSWOP」
です。
普段は、
RGBカラーは「SRGB」
CMYKカラーは「CoatedFOGRA39」(USWebCoatedSWOPより結果が良い)
辺りを使用していれば問題ないと思います。



「ICCプロファイル」変換(普通の方法)


「Magick.NET」に内蔵された「ICCプロファイル」で変換します。
            using (var myMagick = new ImageMagick.MagickImage("./test_RGB.psd"))
            {
                //「マッチング方法」→「Perceptual」知覚的(Photoshopデフォルト)
                myMagick.RenderingIntent = ImageMagick.RenderingIntent.Perceptual;
                //「黒点の補正を使用」
                myMagick.BlackPointCompensation = true;

                //「ICCプロファイル」が埋め込まれていなければ
                if (myMagick.GetColorProfile() == null)
                {
                    myMagick.AddProfile(ImageMagick.ColorProfile.SRGB);
                    MessageBox.Show("埋め込みました");
                }

                //埋め込まれた「ICCプロファイル」(RGB)から
                //他の「ICCプロファイル」(CMYK)へ変換
                myMagick.AddProfile(ImageMagick.ColorProfile.CoatedFOGRA39);

                //プロファイルの削除
                myMagick.RemoveProfile("icc");

                //「背景」にする(アルファを白くします)
                myMagick.ColorAlpha(ImageMagick.MagickColors.White);

                myMagick.Write("./test_outfile.tif");
            }
            MessageBox.Show("処理終了。");
「RGB」から「CMYK」へカラーモードが変更されました。
「Photoshop」にそこそこ近い結果の画像が取得出来ます。


「ICCプロファイル」が現在の画像に埋め込まれているかの確認を
                if (myMagick.GetColorProfile() == null)
で行っています

「AddProfile()」は画像へ「ICCプロファイル」を埋め込みます。
                    myMagick.AddProfile(ImageMagick.ColorProfile.SRGB);
既に「ICCプロファイル」が埋め込まれている場合は、
既に埋め込まれている「ICCプロファイル」から、
新たに指定した「ICCプロファイル」へ「色変換」した上で
「ICCプロファイル」が埋め込み直されます。

埋め込まれた「ICCプロファイル」を削除するのは
                myMagick.RemoveProfile("icc");
で行います。


何故その「ICCプロファイル」を選択したのか、
何故その変換方式や設定を使用しているのか、
については次のトピックで解説します。



「ICCプロファイル」変換(普通の方法)解説



RGBの「ICCプロファイル」
・「SRGB」を使用する理由
 「Photoshop」のRGB時のデフォルトの「ICCプロファイル」が
 「sRGB IEC61966-2.1」となっています。
 これは、大抵のモニタの色域が「sRGB」の為です。 
 「SRGB」を指定すると、
 「sRGB IEC61966-2.1」(Photoshopのデフォルトと同じ物)
 が自動で使用されます。
myMagick.AddProfile(ImageMagick.ColorProfile.SRGB);


CMYKの「ICCプロファイル」
・「CoatedFOGRA27」を使用する理由
 印刷に使われる「PDF/X」でCMYK書き出しする際、
 Adobeのソフトから書き出し時「ICCプロファイル」指定無しの場合、
 「PDF/X-1a:2001」では「USWebCoatedSWOP.icc」
 「PDF/X-3:2002」(X-1aの上位互換)では「CoatedFOGRA27.icc」
 がデフォルトで使われます。
 「Photoshop」デフォルトの「Japan Color 2001 Coated」に
 より近い結果がでる「CoatedFOGRA27」の方を使用するのが良いでしょう。
                myMagick.AddProfile(ImageMagick.ColorProfile.CoatedFOGRA39);


「変換方式」
・「LCMS(Little CMS)」を使用する理由
 「Magick.NET」は何も指定しなくても「LCMS(Little CMS)」を使用します。
 (「LCMS」はオープンソースの変換エンジンです)
 「Photoshop」では「ACE(Adobe Color Engine)」が使用されています。
 が、現在「Magick.NET」からは変換エンジンを指定する事ができません。
 その為、特に指定しません。(「LCMS(Little CMS)」が使用されます)


「マッチング方法」(レンダリングインテント)
・「Perceptual」(知覚的)を利用する理由
 「Photoshop」のデフォルト設定が「知覚的」となっている為これを使用します。
 以下のような設定も可能です。
 「Absolute」(絶対的な色域を保持)
 「Perceptual」(知覚的)(Photoshopデフォルト)
 「Relative」(相対的な色域を保持)
 「Saturation」(彩度)
                myMagick.RenderingIntent = ImageMagick.RenderingIntent.Perceptual;


「黒点の補正を使用」
・「黒点の補正を使用」をtrueにする理由
 「Photoshop」の「黒点の補正を使用」デフォルト設定が「ON」
 となっている為これを使用します。
                myMagick.BlackPointCompensation = true;


「ディザの使用」
・「ディザの使用」をtrueにしたいが出来ない。
 「Photoshop」の「ディザの使用」デフォルト設定が「ON」となっている為です。
 が、「Magick.NET」内に設定が今のところ見当たりませんでした。




「Photoshop」カラーモード変換をエミュレート



自分用めも:
「C# Magick.NETでPhotoshopカラーモード変換をエミュレート」非公開
http://00studying.blogspot.jp/2017/07/c-magicknetcolorpshopemu.html






CMYKとRGBの相互変換時、
「myMagick.ColorSpace = ImageMagick.ColorSpace.sRGB;」

「myMagick.ColorType = ImageMagick.ColorType.TrueColor;」
で変換行うと
「可変R255G255B←→C」
「255R可変G255B←→M」
「255R255G可変B←→Y」
の数値がそのまま変換されます。
Kのみ「可変R可変G可変B←K」で変換されます。


「Magick.NET」の使い方は
https://magick.codeplex.com/documentation
に載っています


以下のサイトを参考にしました。
[めも][ImageMagick]Magick.NET のカラマネAPI
http://www.cat-ears.net/?p=39561

Windowsカラーマネジメントプログラミング入門(?)
http://blog.livedoor.jp/yamma_ma/archives/8414849.html
Windowsカラーマネジメントプログラミング入門(2)
http://blog.livedoor.jp/yamma_ma/archives/8434429.html
Windowsカラーマネジメントプログラミング入門(3)
http://blog.livedoor.jp/yamma_ma/archives/43764758.html
Windowsのカラーマネジメントシステム まとめ
http://blog.livedoor.jp/yamma_ma/archives/35547647.html

ImageMagickのPSDの扱い方
http://paranoid360.blogspot.jp/2011/04/imagemagickpsd.html
ImageMagick PSD続き、PNGをインデックスカラーで透過
http://paranoid360.blogspot.jp/2011/04/imagemagick-psdpng.html

ImageMagick で ICC プロファイルを扱う #3 コマンド解説
https://blog.awm.jp/2017/08/06/imicc/


C# Magick.NETを使ってみる。補足 画像情報取得

C# Magick.NETを使ってみる
目次→http://1studying.blogspot.jp/2017/07/c-magicknetmokuzi.html#kuw04

「C# Magick.NETを使ってみる。その2」
http://1studying.blogspot.com/2017/05/c-magicknet_31.html
の補足情報です。


画像の主要情報取得


画像の主要情報取得の為のコードを記載します。
「Form1」クラスの「button1」クリックイベントコードを以下に置換
        private void button1_Click(object sender, EventArgs e)
        {
            string fileStr = "./test_RGB.psd";
            //string fileStr = "./test_CMYK.psd";
            //string fileStr = "./test_グレー.psd";
            //string fileStr = "./test_2値.psd";
            using (var myMagick = new ImageMagick.MagickImage(fileStr))
            {
                chk_info(fileStr);//ファイルのインフォメーション表示
                chk_Exif(myMagick);//「Magick.NET画像」のEXIF情報表示
                chk_data(myMagick);//「Magick.NET画」の詳細情報書き出し
                MessageBox.Show("処理終了");
            }
        }
「Form1」クラス内に以下のコードを追記
        //ファイルのインフォメーション表示
        private void chk_info(string filenameStr)
        {
            var myMagickInfo = new ImageMagick.MagickImageInfo();
            myMagickInfo.Read("" + filenameStr);
            //「画像情報」取得
            string msg = "info\n";
            msg += "ファイル名:" + myMagickInfo.FileName + "\n";
            msg += "色空間:" + myMagickInfo.ColorSpace + "\n";
            msg += "横pixel:" + myMagickInfo.Width + "\n";
            msg += "縦pixel:" + myMagickInfo.Height + "\n";
            msg += "画像形式:" + myMagickInfo.Format + "\n";
            msg += "横解像度:" + myMagickInfo.Density.X + "\n";
            msg += "縦解像度:" + myMagickInfo.Density.Y + "\n";
            msg += "解像度の単位:" + myMagickInfo.Density.Units + "\n";
            MessageBox.Show(msg);
        }


        //「Magick.NET画像」のEXIF情報表示
        private void chk_Exif(ImageMagick.MagickImage myMagick)
        {
            //using (var myMagick = new ImageMagick.MagickImage("./Lenna.jpg"))
            //{
            //「Exif情報」取得
            ImageMagick.ExifProfile myMagickExif = myMagick.GetExifProfile();
            //「Exif情報」が存在すれば
            if (myMagickExif != null)
            {
                string str = "exif\n";
                foreach (var exifValue in myMagickExif.Values)
                {
                    str += exifValue.Tag + "(";
                    str += exifValue.DataType + "):";
                    str += exifValue.ToString() + "\n";
                }
                MessageBox.Show(str);
            }
            else
            {
                MessageBox.Show("Exif情報はありません");
            }
            //}
        }


        //「Magick.NET画」の詳細情報書き出し
        private void chk_data(ImageMagick.MagickImage myMagick)
        {
            string tmpStr = "";
            //using (var myMagick = new ImageMagick.MagickImage("./test_RGB.psd"))
            //using (var myMagick = new ImageMagick.MagickImage("./test_CMYK.psd"))
            //using (var myMagick = new ImageMagick.MagickImage("./test_グレー.psd"))
            //using (var myMagick = new ImageMagick.MagickImage("./test_2値.psd"))
            //{
            tmpStr += "取得開始\n";
            tmpStr += myMagick.Density.ToString() + "\n";
            tmpStr += myMagick.ColorType.ToString() + "\n";
            tmpStr += myMagick.Depth.ToString() + "\n";

            tmpStr += myMagick.ChannelCount.ToString() + "\n";//r
            tmpStr += myMagick.ClassType.ToString() + "\n";
            tmpStr += myMagick.ColorFuzz.ToString() + "\n";
            tmpStr += myMagick.ColormapSize.ToString() + "\n";
            tmpStr += myMagick.ColorSpace.ToString() + "\n";
            tmpStr += myMagick.Compose.ToString() + "\n";

            tmpStr += myMagick.Endian.ToString() + "\n";
            tmpStr += myMagick.FilterType.ToString() + "\n";
            tmpStr += myMagick.Format.ToString() + "\n";
            tmpStr += myMagick.Gamma.ToString() + "\n";//r
            tmpStr += myMagick.Height.ToString() + "\n";//r
            tmpStr += myMagick.Interlace.ToString() + "\n";
            tmpStr += myMagick.Interpolate.ToString() + "\n";
            tmpStr += myMagick.IsOpaque.ToString() + "\n";//r
            tmpStr += myMagick.MatteColor.ToString() + "\n";
            tmpStr += myMagick.Orientation.ToString() + "\n";
            tmpStr += myMagick.Page.ToString() + "\n";
            tmpStr += myMagick.ProfileNames.ToString() + "\n";//r
            tmpStr += myMagick.Quality.ToString() + "\n";
            tmpStr += myMagick.ReadMask.ToString() + "\n";
            tmpStr += myMagick.RenderingIntent.ToString() + "\n";
            tmpStr += myMagick.Settings.ColorSpace.ToString() + "\n";
            tmpStr += myMagick.Settings.ColorType.ToString() + "\n";
            tmpStr += myMagick.Settings.Endian.ToString() + "\n";
            tmpStr += myMagick.Settings.Format.ToString() + "\n";

            tmpStr += myMagick.Signature.ToString() + "\n";//r
            tmpStr += myMagick.TotalColors.ToString() + "\n";//r
            tmpStr += myMagick.VirtualPixelMethod.ToString() + "\n";
            tmpStr += myMagick.Width.ToString() + "\n";//r
            tmpStr += myMagick.WriteMask.ToString() + "\n";
            //}

            Encoding utf8Enc = Encoding.GetEncoding("utf-8");
            using (var writer = new System.IO.StreamWriter(@"./test_out.txt", false, utf8Enc))
            {
                writer.Write(tmpStr);
                writer.WriteLine("取得終了。");
                MessageBox.Show("「Magick.NET画像」詳細情報を\n「test_out.txt」へ書き出しました");
            }
        }
該当する画像を読み込み、必要な情報を取得します。




「Magick画像」の主要プロパティ設定値



「Magick画像」主要プロパティ一覧
・テストに使用したデータ
 DLL「Q8」使用
 600Dpi
 2362×2362Pixel、99.99×99.99mm
 「Photoshop」で作成したpsd(画像統合済み、レイヤー無し)
の「RGB」「CMYK」「グレースケール」、「2階調」画像を、
それぞれ「Magick画像」として開き検証してみた。
↓(r)はGetのみ 「RGB」 「CMYK」 「Gray」 「2値」
「Density」 600x600 inch 600x600 inch 600x600 inch 600x600 inch
「ColorType」 TrueColor ColorSeparation Palette Palette
「Depth」 8 8 8 1
(r)
「ChannelCount」
3 4 2 2
「ClassType」 Direct Direct Pseudo Pseudo
「ColorFuzz」 0% 0% 0% 0%
「ColormapSize」 -1 -1 256 256
「ColorSpace」 sRGB CMYK Gray Gray
「Compose」 Over Over Over Over
「Endian」 MSB MSB MSB MSB
「FilterType」 Undefined Undefined Undefined Undefined
「Format」 Psd Psd Psd Psd
(r)
「Gamma」
0.4545454
38289642
0.4545454
54545455
0.4545454
54545455
0.4545454
54545455
(r)
「Height」
2362 2362 2362 2362
「Interlace」 NoInterlace NoInterlace NoInterlace NoInterlace
「Interpolate」 Undefined Undefined Undefined Undefined
(r)
「IsOpaque」
True True True True
「MatteColor」 #BDBDBDFF #BDBDBDFF #BDBDBDFF #BDBDBDFF
「Orientation」 TopLeft TopLeft TopLeft TopLeft
「Page」 2362x2362 2362x2362 2362x2362 2362x2362
(r)
「ProfileNames」
(stringコンテナ) (stringコンテナ) (stringコンテナ) (stringコンテナ)
「Quality」 0 0 0 0
「ReadMask」 Psd 2362x2362
 8-bit Gray 0.00
Psd 2362x2362
 8-bit Gray 0.00
Psd 2362x2362
 8-bit Gray 0.00
Psd 2362x2362
 1-bit Gray 0.00
「RenderingIntent」 Perceptual Perceptual Undefined Undefined
「Settings.
ColorSpace」
Undefined Undefined Undefined Undefined
「Settings.
ColorType」
Undefined Undefined Undefined Undefined
「Settings.
Endian」
Undefined Undefined Undefined Undefined
「Settings.
Format」
Unknown Unknown Unknown Unknown
(r)
「Signature」
(署名)
ユニークな英数字
(署名)
ユニークな英数字
(署名)
ユニークな英数字
(署名)
ユニークな英数字
(r)
「TotalColors」
766 1281 256 2
「VirtualPixelMethod」 Undefined Undefined Undefined Undefined
(r)
「Width」
2362 2362 2362 2362
「WriteMask」 Psd 2362x2362
 8-bit Gray 0.00
Psd 2362x2362
 8-bit Gray 0.00
Psd 2362x2362
 8-bit Gray 0.00
Psd 2362x2362
 1-bit Gray 0.00

考察
「RGB」と「CMYK」の違いは「ColorType」と「ColoreSpace」で判別している?
「グレースケール」と「2値」データの違いはDepthが1か8かの違いのみ。
 「Gamma」は「0.454545…」となっているが、
実際は「1/0.454545…」なので、標準的につかわれる「Gamma2.2」となる。



「Magick画像」の主要プロパティ設定値2



色々な「Magick画像」のデータを比較してみる。

・Q8「RGB」
 DLL「Q8」使用
 600Dpi
 2362×2362Pixel、99.99×99.99mm
 「Photoshop」で作成したpsd(画像統合済み、レイヤー無し)の「RGB」画像
・Q16「自作RGB」
 DLL「Q16」使用
 背景緑、150×150Pxel
            //「インスタンス時に開く」(背景緑、150*150)
            using (var myMagick = new ImageMagick.MagickImage(new ImageMagick.MagickColor("#00ff00"), 150, 150))
            {
            }
で生成
・Q8 Ps変換「2値Tiff」
 DLL「Q8」使用
 Q8「RGB」を「Photoshop」でグレースケール化→2値化した物です。
 「画像圧縮をLZW」で保存しています。
・Q8 自前変換「2値Tiff」
 DLL「Q8」使用
 Q8「RGB」を「Magick.NET」でグレースケール化→2値化した物です。

 の順で変換後保存。
 (保存前にプロパティやExif調べて、
  保存後、再度開いてのプロパティやExifを調べる。違いがでるか…確認。
  PSDとtiffで保存した場合、開いた物との違いは出るのか?
  ↓
  違いが出るっぽい。
  ここでの表は後で取得し直す必要あり。)

↓(r)はGetのみ Q8
「RGB」
Q16
「自作RGB」
Q8 Ps変換
「2値Tiff」
Q8 自前変換
「2値Tiff」
「Density」 600x600 inch 0x0 600x600 inch
「ColorType」 TrueColor TrueColor Bilevel
「Depth」 8 16 1
(r)
「ChannelCount」
3 3 1
「ClassType」 Direct Direct Direct
「ColorFuzz」 0% 0% 0% 0%
「ColormapSize」 -1 -1 -1
「ColorSpace」 sRGB sRGB Gray Gray
「Compose」 Over Over Over Over
「Endian」 MSB LSB LSB MSB
「FilterType」 Undefined Undefined Undefined Undefined
「Format」 Psd Xc Tiff Psd
(r)
「Gamma」
0.4545454
38289642
0.4545454
38289642
0.4545454
54545455
0.4545454
54545455
(r)
「Height」
2362 150 2362 2362
「Interlace」 NoInterlace NoInterlace NoInterlace NoInterlace
「Interpolate」 Undefined Undefined Undefined Undefined
(r)
「IsOpaque」
True True True True
「MatteColor」 #BDBDBDFF #BDBDBDBD
BDBDFFFF
#BDBDBDFF #BDBDBDFF
「Orientation」 TopLeft Undefined TopLeft TopLeft
「Page」 2362x2362 150x150 2362x2362 2362x2362
(r)
「ProfileNames」
(stringコンテナ) (stringコンテナ) (stringコンテナ) (stringコンテナ)
「Quality」 0 0 0 0
「ReadMask」 Psd 2362x2362
 8-bit Gray 0.00
Xc 150x150
 16-bit Gray 0.00
Tiff 2362x2362
 1-bit Gray 0.00
Psd 2362x2362
 1-bit Gray 0.00
「RenderingIntent」 Perceptual Perceptual Undefined Undefined
「Settings.
ColorSpace」
Undefined Undefined Undefined Undefined
「Settings.
ColorType」
Undefined Undefined Undefined Undefined
「Settings.
Endian」
Undefined Undefined Undefined Undefined
「Settings.
Format」
Unknown Unknown Unknown Unknown
(r)
「Signature」
(署名)
ユニークな英数字
(署名)
ユニークな英数字
(署名)
ユニークな英数字
(署名)
ユニークな英数字
(r)
「TotalColors」
766 1 2 2
「VirtualPixelMethod」 Undefined Undefined Undefined Undefined
(r)
「Width」
2362 150 2362 2362
「WriteMask」 Psd 2362x2362
 8-bit Gray 0.00
Xc 150x150
 16-bit Gray 0.00
Tiff 2362x2362
 1-bit Gray 0.00
Psd 2362x2362
 1-bit Gray 0.00


考察
・「Q16」で新規キャンバスを作成した時のみ「Depth」は「16」となる。
 16bitの色深度をサポートしていないビューアが多い為、
 「Q16」で新規キャンバスを作成する場合注意が必要。
・これとは別に、
 Q8「RGB」と同じファイルをQ16で開いてみても全ての値は同じだった。
 「Depth」は「8」となる。
・「Endian」エンディアンの違い
 「LSB」リトルエンディアン
 「MSB」ビックエンディアン
 保持される画像形式により違いが出る。
・注意!
 保存形式を変更した場合、
 そのままで、情報を取得したものと、
 保存したファイルを開き直したものとで、結果に違いが出る!



表に関しては、
再度作り直しが必要。
値を信じ切らないようにして下さい。
中途半端な状態での公開です。



2017年7月11日火曜日

C# Magick.NETを使ってみる。グレースケール変換

C# Magick.NETを使ってみる
目次→http://1studying.blogspot.jp/2017/07/c-magicknetmokuzi.html#kuw08


カラースペースでグレー変換


一番スタンダードな方法。
            using (var myMagick = new ImageMagick.MagickImage("./色チャート/色600_RGB.psd"))
            {
                //「マッチング方法」→「Perceptual」知覚的(Photoshopデフォルト)
                myMagick.RenderingIntent = ImageMagick.RenderingIntent.Perceptual;
                //「黒点の補正を使用」
                myMagick.BlackPointCompensation = true;

                //「ICCプロファイル」が埋め込まれていなければ
                if (myMagick.GetColorProfile() == null)
                {
                    myMagick.AddProfile(ImageMagick.ColorProfile.SRGB);
                    //MessageBox.Show("埋め込みました");
                }
                //プロファイルの削除
                myMagick.RemoveProfile("icc");

                //カラースペースをグレーに変更
                myMagick.ColorSpace = ImageMagick.ColorSpace.Gray;

                ////「背景」にする(アルファを白くします)
                //myMagick.ColorAlpha(ImageMagick.MagickColors.White);

                myMagick.Write("./test_outfile.tif");
            }
            MessageBox.Show("処理終了。");
一応グレー変換前に「ICCプロファイル」を消去しましたが、
グレー変換時、「ICCプロファイル」の影響は受けないっぽい。
消去していなくても、グレー変換時に「ICCプロファイル」は自動で消去される。
(「Rec709Luma」でグレー化したのと同じ結果になります。)
「Photoshop」に近い結果は得られない。




「Intensity」強度を指定してグレー変換


グレーへ変換時、「Intensity」強度の種類を指定出来る。
            using (var myMagick = new ImageMagick.MagickImage("./色チャート/色600_RGB.psd"))
            {
                //「マッチング方法」→「Perceptual」知覚的(Photoshopデフォルト)
                myMagick.RenderingIntent = ImageMagick.RenderingIntent.Perceptual;
                //「黒点の補正を使用」
                myMagick.BlackPointCompensation = true;

                //「ICCプロファイル」が埋め込まれていなければ
                if (myMagick.GetColorProfile() == null)
                {
                    myMagick.AddProfile(ImageMagick.ColorProfile.SRGB);
                    //MessageBox.Show("埋め込みました");
                }
                //プロファイルの削除
                myMagick.RemoveProfile("icc");

                //グレー化する時の「Intensity」強度の種類を選択できる
                //myMagick.Grayscale(ImageMagick.PixelIntensityMethod.Average);
                //myMagick.Grayscale(ImageMagick.PixelIntensityMethod.Brightness);
                //myMagick.Grayscale(ImageMagick.PixelIntensityMethod.Lightness);
                //myMagick.Grayscale(ImageMagick.PixelIntensityMethod.MS);
                //「Rec601Luma」(R=0.298839 + G=0.586811 + B=0.114350)
                //myMagick.Grayscale(ImageMagick.PixelIntensityMethod.Rec601Luma);
                //myMagick.Grayscale(ImageMagick.PixelIntensityMethod.Rec601Luminance);
                //「Rec709Luma」(R=0.212656 + G=0.715158 + B=0.072186)
                myMagick.Grayscale(ImageMagick.PixelIntensityMethod.Rec709Luma);
                //myMagick.Grayscale(ImageMagick.PixelIntensityMethod.Rec709Luminance);
                //myMagick.Grayscale(ImageMagick.PixelIntensityMethod.RMS);

                ////「背景」にする(アルファを白くします)
                //myMagick.ColorAlpha(ImageMagick.MagickColors.White);

                myMagick.Write("./test_out_Rec709Luma.tif");
            }
            MessageBox.Show("処理終了。");
様々な強度の種類があるけど、「Photoshop」に近い結果が無かった。



「FX」で手動グレー変換


「FX」を使用して手動でグレー変換してみる。
                //「FX」を使う
                myMagick.Fx("0.2*r+0.7*g+0.1*b");
処理に時間が掛かります。
「Photoshop」に近い結果は得られない。


「ColorMatrix」で手動グレー変換


「ColorMatrix」は彩度の変更、色相の回転、アルファの輝度、様々なエフェクトが可能。
基本は以下の様な記述になります。
                var matrixElement = new double[]{
                    1.0, 0.0, 0.0, 0.0, 0.0, 0.0, //レッド or シアン
                    0.0, 1.0, 0.0, 0.0, 0.0, 0.0, //グリーン or マゼンタ
                    0.0, 0.0, 1.0, 0.0, 0.0, 0.0, //ブルー or イエロー
                    0.0, 0.0, 0.0, 1.0, 0.0, 0.0, //無し or ブラック
                    0.0, 0.0, 0.0, 0.0, 1.0, 0.0, //アルファ
                    0.0, 0.0, 0.0, 0.0, 0.0, 1.0
                    };
                myMagick.ColorMatrix(new ImageMagick.MagickColorMatrix(6, matrixElement));
この変換用パラメータの場合画像に対して何の変更も行いません。


変換用パラメータの行列
RGBA画像は5行×5列(6行×6列でも問題なし)
RGBA画像にオフセット(+やー数値の追加)を付けたい場合6行×6列
(CMYKのサポートの為、オフセット量は6列目に記述します。
 255で割った数値を記述します。-1.0〜+1.0)
CMYKA画像は6行×6列(6列目がオフセット量)
のパラメータ行列を使用します。
カラー行列(変換用パラメータ)は必ず行と列が同じ数となります。


パラメータ行列の意味
・列は入力値を示します。
 1列目〜5列目に「1.0」を100%とした各色の入力数値を設定します。
 (255の場合、1.0は255が入力、0.5の場合128が入力値となる)
 左から「R、G、B、AかC、M、Y、K、A」の順で列に入力値を割り振ります。
 上から何行目に数値を設定するかで出力色が決まります。

・6列目はオフセット用の列です。
 6列目のみ特殊な列となります。
 行内の各列各色の入力数値を合計した、合計出力値に対するオフセット値となります。
 合計出力値に対して-1.0(常に濃度0%)〜+1.0(常に濃度100%)を割り振れます。

・行は各色の出力値を示します。
1行目左から「RGBAかCMYKA」の入力合計値が「RかC」へ出力(0.0〜1.0)
2行目左から「RGBAかCMYKA」の入力合計値が「GかM」へ出力(0.0〜1.0)
3行目左から「RGBAかCMYKA」の入力合計値が「BかY」へ出力(0.0〜1.0)
4行目左から「RGBAかCMYKA」の入力合計値が「AかK」へ出力(0.0〜1.0)
5行目左から「RGBAかCMYKA」の入力合計値が「  A」へ出力(0.0〜1.0)
6行目左から「RGBAかCMYKA」の入力合計値が「ダミー?」へ出力(0.0〜1.0)


レシピ1
RGBのGを全てRの色に割り振りGは常に0となる。
                var matrixElement = new double[]{
                    1.0, 1.0, 0.0, 0.0, 0.0, 0.0,
                    0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                    0.0, 0.0, 1.0, 0.0, 0.0, 0.0,
                    0.0, 0.0, 0.0, 1.0, 0.0, 0.0,
                    0.0, 0.0, 0.0, 0.0, 1.0, 0.0,
                    0.0, 0.0, 0.0, 0.0, 0.0, 1.0
                    };
                myMagick.ColorMatrix(new ImageMagick.MagickColorMatrix(6, matrixElement));

レシピ2
RGB画像にオフセットを付けてコントラストを追加
                var matrixElement = new double[]{
                    1.5, 0.0, 0.0, 0.0, 0.0,-0.157,
                    0.0, 1.5, 0.0, 0.0, 0.0,-0.157,
                    0.0, 0.0, 1.5, 0.0, 0.0,-0.157,
                    0.0, 0.0, 0.0, 1.0, 0.0, 0.0,
                    0.0, 0.0, 0.0, 0.0, 1.0, 0.0,
                    0.0, 0.0, 0.0, 0.0, 0.0, 1.0
                    };
                myMagick.ColorMatrix(new ImageMagick.MagickColorMatrix(6, matrixElement));

RGBをグレー変換するには
行のR+G+Bの合計出力値が丁度1.0になるように調整すれば、
グレー出力となります。
                double red = 0.3;
                double grn = 0.6;
                double blu = 0.1;
                var matrixElement = new double[]{
                    red, grn, blu, 0.0, 0.0, 0.0,
                    red, grn, blu, 0.0, 0.0, 0.0,
                    red, grn, blu, 0.0, 0.0, 0.0,
                    0.0, 0.0, 0.0, 1.0, 0.0, 0.0,
                    0.0, 0.0, 0.0, 0.0, 1.0, 0.0,
                    0.0, 0.0, 0.0, 0.0, 0.0, 1.0
                    };
                myMagick.ColorMatrix(new ImageMagick.MagickColorMatrix(6, matrixElement));

グレー化時、「Intensity」強度の種類に合わせるには
「Rec601Luma」(R=0.298839 + G=0.586811 + B=0.114350)
「Rec601Luminance」(R=0.298839 + G=0.586811 + B=0.114350)
「Rec709Luma」(R=0.212656 + G=0.715158 + B=0.072186)
「Rec709Luminance」(R=0.212656 + G=0.715158 + B=0.072186)
(「Rec601Luminance」と「Rec709Luminance」は
「Gamma1.0」なので同じにならない)
「Rec709Luma」の処理結果と同じ物を作るには以下のような記述となります。
                //「Rec709Luma」と同じ処理結果になります。
                //myMagick.Grayscale(ImageMagick.PixelIntensityMethod.Rec709Luma);
                double red = 0.212656;
                double grn = 0.715158;
                double blu = 0.072186;
                var matrixElement = new double[]{
                    red, grn, blu, 0.0, 0.0, 0.0,
                    red, grn, blu, 0.0, 0.0, 0.0,
                    red, grn, blu, 0.0, 0.0, 0.0,
                    0.0, 0.0, 0.0, 1.0, 0.0, 0.0,
                    0.0, 0.0, 0.0, 0.0, 1.0, 0.0,
                    0.0, 0.0, 0.0, 0.0, 0.0, 0.0
                    };
                myMagick.ColorMatrix(new ImageMagick.MagickColorMatrix(6, matrixElement));



「Photoshop」のカラーモード変換をエミュレート






自分用めも:
「C# Magick.NETで「Photoshop」のカラーモード変換をエミュレート」非公開
http://00studying.blogspot.jp/2017/07/c-magicknetcolorpshopemu.html




以下のサイトを参考にしました。
ImageMagick v6の例 - 色の変更
http://www.imagemagick.org/Usage/color_mods/

【.NET】カラー行列(ColorMatrix)で画像のRGBの値を調整する
http://www.r-nakai.com/archives/30
【.NET】カラー行列(ColorMatrix)で画像をグレースケール化する
http://www.r-nakai.com/archives/41

C# ColorMatrixクラスを使用する方法
http://dobon.net/vb/dotnet/graphics/colorbalance.html

2017年7月5日水曜日

C# Magick.NETを使ってみる。画像回転

C# Magick.NETを使ってみる
目次→http://1studying.blogspot.jp/2017/07/c-magicknetmokuzi.html#kuw11

「Magick.NET」での回転では、
回転時の黒100%のエッジのボケ具合等を見ると、
「Photoshop」の回転よりも結果が良いと感じた。

「通常の回転」と「アフィン変換」での回転で少し結果が異なるが、
大きな違いはあまり感じられなかった。


通常の回転


通常の回転は処理も速めな感じ。
            using (var myMagick = new ImageMagick.MagickImage("./色チャート/色600_CMYK_グレー化.psd"))
            {
                //プロファイルの削除
                myMagick.RemoveProfile("icc");

                myMagick.Rotate(30);
                //画像の位置をリセット
                myMagick.RePage();

                myMagick.Write("./test_outfile2.tif");
            }
回転を掛けた場合、
「画像の位置をリセット」を行わないと、tiffで保存出来ないみたい。
(bmp等は問題なく保存できる。)



アフィン変換による回転


アフィン変換での回転は通常に比べて少し処理が重い。
(使えなくはないレベル)
        /// <summary>
        ///アフィン変換による回転
        /// </summary>
        /// <param name="myMagick">Magick画像のインスタンス</param>
        /// <param name="angle">回転角度</param>
        private void affinRotate(ImageMagick.MagickImage myMagick, double angle)
        {
            //以下のサイトを参考
            //http://www.imagemagick.org/Usage/distorts/affine/

            double radians = angle * Math.Atan2(1.0, 1.0) / 45;
            double sx = Math.Cos(radians);
            double sy = sx;
            double rx = Math.Sin(radians);
            double ry = -(rx);

            myMagick.AffineTransform(new ImageMagick.DrawableAffine(sx, sy, rx, ry, 0.0, 0.0));

            //画像の位置をリセット
            myMagick.RePage();

        }


Exif情報内のorientation情報について


アプリケーションによっては、
Exif情報の中のorientation情報に従って、
画像が勝手に回転してしまう場合があります。

Exif情報そのものを削除するか、
Exif情報内のorientation情報を更新するか、
Exif情報内のorientation情報に従って画像を回転させるか、
等の方法で対処します。

Exif情報そのものを削除する場合
                //Exif情報の削除
                myMagick.Strip();

回転(orientation)情報を無しに更新する(Exif情報は消さない)
                myMagick.Orientation = ImageMagick.OrientationType.Undefined;

回転(orientation)情報を左上に更新する(Exif情報は消さない)
                myMagick.Orientation = ImageMagick.OrientationType.TopLeft;

Exif情報内のorientation情報に従って画像を回転
                //Exif内orientation情報に従って画像回転
                myMagick.AutoOrient();






3Dの回転だと、
「アフィン変換」、「オイラー角変換」、「クォータニオン変換」があり、
「クォータニオン変換」が一般的らしいが、よく調べていないので分からない。
(「オイラー角変換」は正しい回転にならない事があるみたい。)


c#で画像回転
http://dobon.net/vb/dotnet/graphics/skewing.html

「ImageMagick で画像を自由自在に操りたい」
(IMでの画像回転について比較的詳しく書いてある)
http://www.taskinteractive.com/tecnical/imagemagick/

↑Topへ