BMPを2値化処理して、2値化されたものをBMPとして保存したいのですが、保存方法がわかりません。そもそも2値化の閾値は濃度平均を境に白と黒に分ける方法であっていますでしょうか?
以下が作りかけのプログラムです。
#include <stdio.h>
int main(void)
{
FILE *fp;
int wide,hite,cm;
int v[256][256];
int h[54],palette[1024];
int i,j,a,b,x,n;
int heikin,sum=0;
/*1枚目の画像data*/
fp=fopen("c.bmp","rb"); // mono画像ファイルを開く
if(fp==NULL){
printf("エラー\n");
return 1; }
for(j=0; j<54; j++) h[j]=fgetc(fp); // ヘッダの読み込み
wide=h[18]+h[19]*256; // 画像の幅の計算
hite=h[22]+h[23]*256; // 画像の高さの計算
cm=h[28];
if(cm=8)for(j=0; j<1024; j++) palette[j]=fgetc(fp);
//mono画像データ読み込み
for(a=0; a<hite; a++)for(b=0; b<wide; b++){
v[a]=fgetc(fp); //濃度値を取得
n=v[a];
sum+=n; //濃度値合計sum
heikin=sum/(wide*hite); //閾値を決めるためのheikin
if(n>heikin) n=0; //濃度値がheikin以上なら黒
else n=255; //以下なら白にする
printf("v=%d\n",n);
}
return 0;
}
2値化プログラム
Re:2値化プログラム
バグさんありがとうございます!
2値化はどうにかできました。☆
次に2値化したのを画像として保存したいのですが、
BMPの保存の仕方がわからなくて困っています。
とりあえず私の作ったプログラムはこれです。
#include <stdio.h>
int main(void)
{
FILE *fp;
int wide,hite,cm;
int v[256][256];
int h[54],palette[1024];
int i,j,a,b,x,n;
double heikin;
int sum=0;
fp=fopen("5.bmp","rb"); // mono画像ファイルを開く
if(fp==NULL){
printf("エラー\n");
return 1; }
for(j=0; j<54; j++) h[j]=fgetc(fp); // ヘッダの読み込み
wide=h[18]+h[19]*256; // 画像の幅の計算
hite=h[22]+h[23]*256; // 画像の高さの計算
cm=h[28];
if(cm=8)for(j=0; j<1024; j++) palette[j]=fgetc(fp);
//mono画像データ読み込み
for(a=0; a<hite; a++)for(b=0; b<wide; b++){
v[a]=fgetc(fp); //濃度値を取得
sum+=v[a]; //濃度値合計sum
}
heikin=sum/(wide*hite); //閾値を決めるためのheikin
printf("heikin=%f\n",heikin);
for(a=0; a<hite; a++)for(b=0; b<wide; b++){
n=v[a];
if(n>heikin) n=0; //濃度値がheikin以上なら黒
else n=255; //以下なら白にする
printf("v=%d\n",n);
}
return 0;
}
2値化はどうにかできました。☆
次に2値化したのを画像として保存したいのですが、
BMPの保存の仕方がわからなくて困っています。
とりあえず私の作ったプログラムはこれです。
#include <stdio.h>
int main(void)
{
FILE *fp;
int wide,hite,cm;
int v[256][256];
int h[54],palette[1024];
int i,j,a,b,x,n;
double heikin;
int sum=0;
fp=fopen("5.bmp","rb"); // mono画像ファイルを開く
if(fp==NULL){
printf("エラー\n");
return 1; }
for(j=0; j<54; j++) h[j]=fgetc(fp); // ヘッダの読み込み
wide=h[18]+h[19]*256; // 画像の幅の計算
hite=h[22]+h[23]*256; // 画像の高さの計算
cm=h[28];
if(cm=8)for(j=0; j<1024; j++) palette[j]=fgetc(fp);
//mono画像データ読み込み
for(a=0; a<hite; a++)for(b=0; b<wide; b++){
v[a]=fgetc(fp); //濃度値を取得
sum+=v[a]; //濃度値合計sum
}
heikin=sum/(wide*hite); //閾値を決めるためのheikin
printf("heikin=%f\n",heikin);
for(a=0; a<hite; a++)for(b=0; b<wide; b++){
n=v[a];
if(n>heikin) n=0; //濃度値がheikin以上なら黒
else n=255; //以下なら白にする
printf("v=%d\n",n);
}
return 0;
}