アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語による画像再構成の基礎 (画像再構成シリーズ)

という本に基づいてC言語で画像再構成のプログラミングの勉強をしているのですが、この本の中で白い部分を100、黒い部分を0と画像を表現するプログラムを組んだあとそれを白と黒の画像にするソフトが明記されていませんでした。そのページが以下です。
http://autolandtom.web.fc2.com/text.html

赤下線部の「画像表示専用のソフト」を何かが存じの方がいらっしゃいましたら教えてくだいさい。
よろしくお願い致します。

A 回答 (4件)

No.3です.


説明が足りなかったと思うので補足します。

ImageJで表示できるだろうと述べたのは、質問者さんがお礼に書かれていた、 P3-03rect.c で作った画像データです。私のPC環境では、前に回答した手順で特にColor画面をいじる必要もなく、黒地に白い四角が表示されます。

ただこの画像の作り方は、P3-03rect.c をコンパイル・実行した環境によってデータの長さやエンディアンが変わる可能性があります。その場合はその環境に応じて対処する必要が生じます。
    • good
    • 0

> 赤下線部の「画像表示専用のソフト」を何か...



著者が自作したソフトのような気がしますね。float型の画像、しかも素のバイナリデータ、これを扱える表示ソフトは非常に少ないです。


確かとは言えませんが、この画像ならImageJで表示できるかもしれません。ImageJを使うにはJava(http://java.com/ja/)も必要です。

ImageJを起動し、メニューから[File] - [Import] - [Raw...]
ファイルダイアログボックスでファイルを選択します。
次のダイアログ画面で下のように入力し、
 Image type: 32-bit Real
 Width: 128
 Height: 128
[OK]をクリックすれば読み込めます。

あとはメニューから[Image] - [Adjust] - [Color Balance...]
でColor画面を開き、明るさを適当に調整すればよいかと。

(プログラムを実行する環境によっては、書き込む画像データのエンディアンも変換が必要かもしれませんが、それは別途調べてください)

参考URL:http://rsb.info.nih.gov/ij/index.html
    • good
    • 0

多分カテゴリ、「技術者向」のほうがよかったですね。

これ

しっかし!ひどい本だね~これ
料理番組で「秘密のソースを加えます」って書いてるようなもんだわ。
BMP(DIB)の作り方から教えるべきじゃないのかな~これって(w)

まずは、この部分の開設

// 画像の初期化
for (i = 0 ; i < nx*ny ; i++)
img[i] = 0;


ワークに全部0を代入しています。今回の例では「黒」を意味しているようです。

その後、以下の処理で、くりぬきを行っているようです。


// 矩形画像の作成
for (i = 32 ; i <= 96 ; i++) {
for(j = 32 ; j <= 96 ; j++) {
img[i*nx+j] = 1;
}
}


部分的に、1を代入しているようです。今回の例では、「白」を意味しているようです。

で問題は、書き出したこのデータなんですが。。
データであって、画像形式ではないのが、問題ですね。

そこを説明していたのが、No1さんです。
画像形式といっても、複数あるが、手っ取り早いつくり方を
アドバイスしています。

で、この本で書かれていない問題点として、
0と1しか使ってませんが、どっちが黒?どっちが白?はなく、
ただの値でしかなく、これを色にするには、カラー情報が別途必要です。
たとえば、赤と青のみでも、「2値」の情報=0と1だけだということです。

".pgm"の形式をサポートするグラフィックビュアーをお持ちなら、
No1さんの形式でぜんぜんOKですし。

1歩さがって、DIBの形式を覚えてみるのも手ですね。
手っ取り早いのは、フルカラー24ビットで、ヘッダーのみいれたのが
使いやすいかもしれません。

ということで、一度、メモリの中身を画像化するプログラムを
やってみてはいかがでしょう?

現在は、まだ、値だけしか、見えていないのでしょうし。

私が思うには、このサンプル。。。
"*" と " " とかで、コンソールで見えるサンプルにするべきだと
思うのだが。。
読むと余計に、パニック起こしそうに感じます。

**************** < 練習用サンプルなのであれば
****************
***** *****
***** *****
****************
**************** < こんな感じで、画面に出たほうが、ありがたいとおもうが。
    • good
    • 0

imgという1次元配列(128*128で要素数は16384)のうち0になる部分は黒で、


100になる部分は白として点(ドット)を打っているだけでしょう。

画像に関しては実行環境に依存すると思われますので、具体的なプログラム例が出ていないだけではありませんか?
画像フォーマットに合わせて出力すれば、その画像フォーマットに適合したビュアーで表示できるでしょう。
# BMPのヘッダとデータ構造に合わせればペイントとかで見られますし。
まぁ、状況からしたら…PBMとかの方が楽でしょうかね。

http://www.mm2d.net/c/c-08.shtml
fopen()でなんちゃら.pgmとしてオープンして…

fputs("P2\n128 128\n100\n", fp);
for(i=0;i<128;i++) {
 for(j=0;j<128;j++) {
  fprintf(fp, "%d ", img[i*128+j]);
 }
 fputs("\n", fp);
}
みたいな感じで。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
参考プログラムは載っていました。

/* P3-03rect.c */

#include <stdio.h>
#include <stdlib.h>

main( )
{
char fi[50];
float img[128*128];
int nx = 128, ny = 128;
int i, j;
FILE *fp;

// 画像の初期化
for (i = 0 ; i < nx*ny ; i++)
img[i] = 0;

// 矩形画像の作成
for (i = 32 ; i <= 96 ; i++) {
for(j = 32 ; j <= 96 ; j++) {
img[i*nx+j] = 1;
}
}

// 画像の書き出し
printf( "Input new file name: " );
scanf( "%s", fi );
if ((fp = fopen ( fi, "wb")) == NULL) {
printf("Error: file open [%s].\n", fi);
exit (1);
}
fwrite(img, sizeof(float), nx*ny, fp);
fclose (fp);
}


というプログラムがのっていましたが
//短形画像の作成というところが白と黒を区別しているところなのでしょうか?
だとしたら図3-10のような画像を表示させるためにはどのような実行をすればよろしいのでしょうか?

お礼日時:2014/04/08 01:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!