行毎の黒のドット(ピクセル)数を教えていただけませんか?
開発環境Microsoft Visual Studio .NET 2003
2値画像を読み込んだ時、各行毎の黒のピクセル(ドット)数を表示する
プログラムを組もうとしているのですがわかりません。
画像読み込みまではできたのですがその後のプログラムがわかりません
誰か組んでいただけないでしょうか?
#include <stdio.h>
#include <process.h>
#define Y_SIZE 3648 // 処理できる最大画像
#define X_SIZE 3648
#define HIGH 255 // 画像の最大強度値
#define LOW 0 // 画像の最小強度値
#define LEVEL 256 // 画像の強度レベル値
// BMPファイルのフォーマットに従って用意した変数
typedef unsigned short WORD;
typedef unsigned long DWORD;
WORD bfType;
DWORD bfSize;
WORD bfReserved1,
bfReserved2;
DWORD bfOffBits;
DWORD biSize,
biWidth, biHeight;
WORD biPlanes,
biBitCount;
DWORD biCompression,
biSizeImage,
biXPelsPerMeter,
biYPelsPerMeter,
biClrUsed,
biClrImportant;
unsigned char image_in[Y_SIZE][X_SIZE][3]; // 入力カラー画像配列
unsigned char image_out[Y_SIZE][X_SIZE][3]; //出力カラー画像配列
unsigned char image_bw[Y_SIZE][X_SIZE]; //濃淡画像配列
unsigned char data_rgb[Y_SIZE][X_SIZE][3]; // RGB画像配列
//********************************************
// 24Bitビットマップファイル読み込み *
//********************************************
void readBMP(
char *filename, // BMPファイル名
unsigned char image[Y_SIZE][X_SIZE][3] // 24ビットRGB画像配列
)
{
FILE *fp;
int i, j, k;
// ファイルオープン
if ((fp = fopen(filename, "rb"))==NULL) {
printf("readBmp: Open error!\n");
exit(1);
}
printf("input file : %s\n", filename);
// ヘッダー情報読み込む
fread(&bfType, sizeof(bfType), 1, fp);
fread(&bfSize, sizeof(bfSize), 1, fp);
fread(&bfReserved1, sizeof(bfReserved1), 1, fp);
fread(&bfReserved2, sizeof(bfReserved2), 1, fp);
fread(&bfOffBits, sizeof(bfOffBits), 1, fp);
fread(&biSize, sizeof(biSize), 1, fp);
fread(&biWidth, sizeof(biWidth), 1, fp);
fread(&biHeight, sizeof(biHeight), 1, fp);
fread(&biPlanes, sizeof(biPlanes), 1, fp);
fread(&biBitCount, sizeof(biBitCount), 1, fp);
fread(&biCompression, sizeof(biCompression), 1, fp);
fread(&biSizeImage, sizeof(biSizeImage), 1, fp);
fread(&biXPelsPerMeter, sizeof(biXPelsPerMeter), 1, fp);
fread(&biYPelsPerMeter, sizeof(biYPelsPerMeter), 1, fp);
fread(&biClrUsed, sizeof(biClrUsed), 1, fp);
fread(&biClrImportant, sizeof(biClrImportant), 1, fp);
// RGB画像データ読み込む
for (i=0; i<(int)biHeight; i++)
for (j=0; j<(int)biWidth; j++) {
for (k=0; k<3; k++) {
//fread(&image[i][j][2-k], 1, 1, fp);
fread(&image[biHeight-i][j][2-k], 1, 1, fp);
}
}
fclose(fp);
}
//**********************************************
// RGBカラー画像を256諧調白黒濃淡画像へ変換 *
//**********************************************
void BMPto256BW(
unsigned char image[Y_SIZE][X_SIZE][3],
unsigned char image_bw[Y_SIZE][X_SIZE] )
{
int y, x, a;
for (y=0; y<(int)biHeight; y++)
for (x=0; x<(int)biWidth; x++) {
a = (int)(0.3*image[y][x][0] + 0.59*image[y][x][1] + 0.11*image[y][x][2]);
if (a<LOW) a = LOW;
if (a>HIGH) a = HIGH;
image_bw[y][x] = a;
}
}
//*****************************************
//各行の黒色判定
//*****************************************
//****************************************
// 白黒濃淡画像配列のコピー *
//****************************************
void imageCopyBW(
unsigned char image1[Y_SIZE][X_SIZE],
unsigned char image2[Y_SIZE][X_SIZE] )
{
int x, y;
for (y=0; y<(int)biHeight; y++)
for (x=0; x<(int)biWidth; x++)
image2[y][x] = image1[y][x];
}
void main(void)
{
char input[100], output[100];
int intensity;
printf("入力画像ファイル名(*.bmp):"); scanf("%s", input);
readBMP(input, image_in); // 画像の入力,RGB24ビットカラーBMP画像を配列に格納
//一列各行の黒色の数出力
}
お礼
お手本を示していただいたコードを元に 自分なりに書き直してみた結果です。 ((pword)fat)[0] |= 0x0FF0; *((pword)&fat[1]) |= 0xFFF0; for (i=1; i<clust; i++) { clustNo = ((i+1)*3)>>1; if (i & 0x01) { *((pword)&fat[clustNo]) |= (i+2); } else { *((pword)&fat[clustNo]) |= (i+2) << 4; } } clustNo = ((i+1)*3)>>1; if (i & 0x01) *((pword)&fat[clustNo]) = 0x0FFF; else *((pword)&fat[clustNo]) = 0xFFF0; >>start.. A Drive was Opened. Boot sector was Read. System file was Read. Size of system file. [3168] Size put together on sector boundary. [3584] Necessary number of clusters. [7] つたない英語はお許しください。 F0 FF FF 03 40 00 05 60 00 07 80 00 FF 0F 00 00 一応、期待通りに動いたみたいです。 大変参考になるコードを示していただき感謝いたします。 ありがとうございました。
補足
>「FATへのクラスタ番号の書き込みを関数にしてない」 これは、限られた条件の(初期化された状態で2番のクラスタから順番にかきこむ)ため 関数化の必要を感じていなかった訳です。 >「何故第2FATを書かないのか」 バッファを1stFATへ書き込んだ後に2ndFATに書き込むつもりでした。 >「ルートディレクトリは書かないのか?」 初期化された状態で書き込むので、ルートディレクトリエントリの最初に構造体を書き込もうと思っています。 何も書き込まれていないのが条件なので、特に問題は無いと思ってます。 >いちいちclustが1か1以外か場合分けする必要はない。 言われてから気づきました。 そうですよね、よく考えたらわざわざ処理分けする必要なんてありませんでした。 ご指摘ありがとう御座います。