c言語による画像処理について
いつもお世話になってます。
c言語を使った画像処理を学び始めました。
入力画像の白(RGB値255,255,255)以外の画像を黒(RGB値0,0,0)
に変換するプログラムを作成したいと思っているのですが、
入力画像の大きさによっては正常に命令を実行してくれないことがあるので、
改善点をご教示いただきたいと考え投稿させていただきました。ソースプログラムは
#include<stdio.h>
#define nx 100 //画像の幅
#define ny 100 //画像の高さ
int main(void)
{
FILE *fp,*fp2;
int i,j;
unsigned char header[54];
unsigned char screen[nx][ny][3];
/* ファイルから読む */
fp=fopen("input.bmp","rb"); //ビットマップ形式 ,24ビットカラー
fread(header,1,54,fp); // ヘッダ(54バイト)を飛ばす */
fread(screen,1,nx*ny*3,fp); // 残りはデータ(最下行から順に入る)
//(255,255,255)以外なら黒(0,0,0)に
for(j=0;j<ny;j++)
for(i=0;i<nx;i++)
if(screen[j][i][0]!=255||screen[j][i][1]!=255||screen[j][i][2]!=255){
screen[j][i][0]=0;
screen[j][i][1]=0;
screen[j][i][2]=0;
}
fclose(fp);
/* ファイルに書く */
fp=fopen("output.bmp","wb");
fwrite(header,1,54,fp); /* ヘッダ */
fwrite(screen,1,nx*ny*3,fp); /* データ */
fclose(fp);
return 0;
}
となっています。ここで、画像の高さ、幅を100以下にすると正常に変換できなくなります。
どなたか原因がお分かりでしたらお知らせ願えないでしょうか?
お礼
noocyteさん、いつもご解答いただきどうもありがとうございます。返事遅れまして申し訳ございません。noocyteさんのおかげさまで、大体目標達成しました。 傾きを調べた後、私はその傾きにあるすべての画素の分散値を計算し、閾値判定の方法(もし一本の直線だったら、分散値は小さいわけ)で、直線を検出し、その後ろの画素値で一番前の直線埋めました。 6日間がんばって、このような結果を得ました。ご覧ください。 もとの画像: http://www.xiaochuncnjp.com/bbs/attachments/month_0711/20071128_ee90d0311393057524d7gQlddHvLwucT.jpg 前の直線を検出した画像: http://www.xiaochuncnjp.com/bbs/attachments/month_0711/20071128_7b95db96813d76499c48xrPHAX4PGhDO.jpg 最後の結果、処理した画像: http://www.xiaochuncnjp.com/bbs/attachments/month_0711/20071128_416abe213e8e01032448l0zO40HnVtvk.jpg 大体できましたけど、処理した画像にはまだ違和感が有ります。綺麗じゃない部分はまだ残ってます。直線判定と画素を埋める手法のアルゴリズムの問題なんですか?まだ考えてます。