画像処理ソリューション
これを見れば画像処理の入門から基礎~応用まで全てがわかるのを目指して!
   
翻訳(Translate)

プロフィール

Akira

ニックネーム:Akira
東京都の町田事業所に勤務
画像処理ソフトの開発を行っています。リンクフリーです!
詳細プロフィールは こちら
お問い合わせは、こちら↓

【補助HP】
画像処理ソリューションWeb版 【Newブログ】
イメージングソリューション

スポンサーリンク


カテゴリ

最近のコメント

カレンダー

07 | 2017/08 | 09
S M T W T F S
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -

趣味のブログ

iPhone萬歳!
iPhoneの情報いろいろ。
ブログ学習帳
ブログ、SEO、アフィリエイト情報など(まだまだこれから)
俺流クラフト日記
ハンドメイド作品の記録(現在、放置中)

スポンサーリンク 最近の記事
(09/18)  計測測定展に光切断のデモを出展しました
(08/17)  ディジタル画像技術事典200に記事が載りました
(06/09)  光切断を画像センシング展で公開
(05/14)  中国(上海)へ行って来ました
(04/12)  韓国へ行って来ました
(03/10)  私の求める新人像
(01/18)  エレクトロテストジャパンにカラー光切断法のデモを出展しました。
(12/23)  ユニークアクセス200万達成!
(12/10)  【カラー光切断法】YouTube動画まとめ
(11/04)  国際画像機器展2014にカラー光切断法を出展します。
(10/05)  第25回コンピュータビジョン勉強会@関東に参加してきました。
(09/08)  フーリエ変換の記事を追加しました。
(08/09)  【画像処理】ランキング低下中
(07/06)  記事の更新が停滞中...
(06/08)  画像センシング展2014でカラー光切断法のデモを行います。
(05/17)  カラー光切断法の動画を公開しました。
(04/30)  ソニーα NEX-5Rで星空撮影
(04/10)  カラー光切断法の取込結果を追加しました
(03/08)  Korea Vision Show 2014へ行ってきました
(02/05)  フーリエ変換シリーズを始めます。
(01/06)  2014年、あけましておめでとうございます。
(12/04)  カラー光切断法を公開(国際画像機器展2013にて)
(11/13)  国際画像機器展2013に出展します
(10/14)  「画像処理のためのC#」はじめます。
(09/16)  【C#,VB.NET】高速描画コントロールをバージョンアップしました。
(09/04)  拡大鏡に輝度値表示、ルーラー機能を追加した個人ツールを公開
(08/05)  7月の拍手Top5
(07/06)  2013年6月人気記事Top5
(05/12)  SONY α NEX-5Rレビュー
(04/24)  SONY α NEX-5RY購入

【C++/CLI】CSVファイル保存(輝度値のCSVファイル保存)

画像処理を行っていると輝度値をCSVファイル(カンマ区切りファイル)に保存して、エクセルで参照したい場合があるかと思います。
そんなときに簡単に使えるサンプルプログラムを作成したました。

今回作成したプログラムはこんなイメージです↓

 CSVファイル保存サンプルプログラム

このサンプルプログラムはこちら右ボタンクリック→対象をファイルに保存)よりダウンロードできます。

このプログラムで保存したCSVファイルをエクセルで開くと、こんなイメージです。

■モノクロ画像の場合 
  CSVファイル保存
  

■カラー画像の場合


CSVファイル保存


CSVファイルを作成している関数部分は以下の通りです。

void SaveCSVFile(String^ FileName, Bitmap^ bmp, Rectangle rect){
     //ビットマップの輝度値をCSVファイルに保存する。
     int i, j;

     //エラー確認
     if ((FileName == nullptr) || (bmp == nullptr)) return;
     if (rect.X + rect.Width > bmp->Width) rect.Width = bmp->Width - rect.X;
     if (rect.Y + rect.Height > bmp->Height) rect.Height = bmp->Height - rect.Y;

      // ファイル開く
      System::IO::StreamWriter^ sw
           = gcnew System::IO::StreamWriter(FileName, false, 
                         System::Text::Encoding::GetEncoding("shift-jis"));
     //Lock
     Imaging::BitmapData^ bmpData = bmp->LockBits(rect, Imaging::ImageLockMode::ReadOnly,    bmp->PixelFormat); 
 
     //ビットマップデータのメモリのポインタ
     Byte* pBuf = (Byte*)bmpData->Scan0.ToPointer();

     //輝度値の取得、設定
     switch (bmp->PixelFormat){ 
          case Imaging::PixelFormat::Format8bppIndexed: 
               //8ビットデータの場合

              
//////////////////////////////////
               // 項目ラベル

               sw->Write("Y座標\X座標,");
               for (i = 0; i < rect.Width; i++){
                    sw->Write((rect.X + i).ToString() + ",");
               }
               //改行
               sw->WriteLine();

              
//////////////////////////////////
               // Y座標、輝度値
               for (j = 0; j < rect.Height; j++){
                   
//Y座標
                    sw->Write((rect.Y + j).ToString() + ",");
                    for (i = 0; i < rect.Width; i++){
                         //輝度値
                         sw->Write(pBuf[i + j * bmpData->Stride].ToString() + ",");
                    }
                    //改行
                    sw->WriteLine();
                }

               break;

          case Imaging::PixelFormat::Format24bppRgb: 
               //24ビットカラーデータの場合 
               //輝度値はG,B,R,B,G,R・・・の順で格納されています。 
          case Imaging::PixelFormat::Format32bppRgb: 
          case Imaging::PixelFormat::Format32bppArgb: 
               //32ビットカラーデータの場合 
               //輝度値はG,B,R,A,B,G,R,A・・・の順で格納されています。

               //1画素何バイト表示か?
               int Channel = bmp->GetPixelFormatSize(bmp->PixelFormat) / 8;

              
//////////////////////////////////
               // 項目ラベル
               sw->Write("Y座標\X座標,");
               for (i = 0; i < rect.Width; i++){
                   
//R
                    sw->Write((rect.X + i).ToString() + "(R),");
                    //G
                    sw->Write((rect.X + i).ToString() + "(G),");
                    
//B
                    sw->Write((rect.X + i).ToString() + "(B),");
               }
              
//改行
               sw->WriteLine();

               
//////////////////////////////////
               // Y座標、輝度値
               for (j = 0; j < rect.Height; j++){
                   
//Y座標
                    sw->Write((rect.Y + j).ToString() + ",");
                    for (i = 0; i < rect.Width; i++){
                        
//輝度値
                         //R
                         sw->Write(pBuf[i * Channel + 2 + j * bmpData->Stride].ToString() + ",");
                         //G
                         sw->Write(pBuf[i * Channel + 1 + j * bmpData->Stride].ToString() + ",");
                         //B
                         sw->Write(pBuf[i * Channel     + j * bmpData->Stride].ToString() + ",");
                     }
                     //改行
                    sw->WriteLine();
               }
               break;
     }
     //UnLock
     bmp->UnlockBits(bmpData);

     // ファイルを閉じる
     sw->Close();

}

注意点
 CSVファイルをエクセルで開く場合、エクセルの制限として横方向に256セル、縦方向に65536セルまでしか開くことができません。
輝度値をファイルに保存する領域は、今回作成したSaveCSVFile関数のrectの領域で調整して下さい。

■CSVファイル関連で必要な関数について  


StreamWriter (
    String^ path,
    bool append,
    Encoding^ encoding
)

 概要
  ファイルを開く

パラメータ
 
pathファイル名
append指定したファイル名が存在する場合
faselのとき、ファイルを上書きします。
trueのとき、ファイルのデータの末尾に追記されます。
encoding文字エンコーディング
エクセルなどでファイルを開く場合は"shift-jis"を指定します。

その他
  他にいくつかオーバーロードが用意されていますが、この組合せが一番使いやすいかと思います。


Write (
    String^ value 
)

など。他、多数

  概要
  ストリームの最後の部分にvalueが追加されます。

パラメータ
 
valueストリームに書き込む内容


WriteLine (
    String^ value 
)

など。他、多数

概要
  ストリームの最後の部分にvalueを追加し、さらに改行が追加されます。
  サンプルプログラムではただの改行の役目として使っています。

パラメータ
 
valueストリームに書き込む内容

 


 

Close ( )

概要
  ストリームを閉じます。


輝度値の参照部分に関しては「画像の輝度値を取得設定する」のページでも説明してます。
合わせてご参照下さい。 


このCSVファイル保存を応用すると、こんなこと↓

CSVファイル保存3D表示

もできます。
上図はCSVファイルをエクセル(2007)で開いて等高線でグラフ表示しています。
ただし、横方向のデータ数(データ系列)が255までしか指定できないのが、ちょっと厳しい...

 
 


Loading...
スポンサーリンク

この記事に対するコメント
Re: タイトルなし
このページへコメント頂いた方へ。
メールアドレスの記載がなかったので、このページに書きますが、リンク先のファイルは、このページ↓
http://imagingsolution.web.fc2.com/program/cppcli/

  CSVファイル保存(輝度値のCSVファイル保存)
の部分にあるので、そちらからダウンロードしてみて下さい。
【2013/12/07 14:59】 URL | Akira #- [ 編集]


コメントを頂いた方へ。
ご連絡頂いたメールアドレスへは、メール送信できなかったので、簡単に内容を書いておきます。
輝度値を-3000~+3000にしたいという事ですが、値の範囲からすると16bit必要となりますが、画像データでは負の値を持つフォーマットがありません。
また、このページ↓
http://imagingsolution.blog107.fc2.com/blog-entry-65.html
でも試しているように16bitの画像データは.NETでは対応していないようです。

そのため、 -3000~+3000の輝度値を扱いたい場合は、データとしてshort型の配列で確保しておいて、画像を表示する時に -3000~+3000 の値を0~255へ変換するしかないと思います。

変換するのも、特に変換する関数がある訳でも無いので、計算で求めて下さい。

以上、よろしくお願い致します。
【2012/07/07 21:13】 URL | AKira #- [ 編集]


この記事に対するコメントの投稿














管理者にだけ表示を許可する


この記事に対するトラックバック
トラックバックURL
→http://imagingsolution.blog107.fc2.com/tb.php/72-73a9c0d8
この記事にトラックバックする(FC2ブログユーザー)

現在の閲覧者数: / 合計