この質問は、純粋な C を使用した画像処理について理解を深める上で難しい問題です。GCC でコンパイルされた C を使用して、非バイナリ PGM ファイルを読み取る簡単なプログラムを作成しました。現在、バイナリ PGM ファイルを読み込もうとすると問題が発生しています。このバイナリ PGM ファイルは、 IrvanViewを使用してJPGをPGMに変換することで取得できます。
注:画像処理ライブラリ (OpenCV など) で回答しないでください。
私の現在のコードは次のとおりです。
#include <stdio.h>
#include <stdlib.h>
#define WIDTH 1024
#define HEIGHT 768
#define READ_IMAGE_NAME "MY_PGM_FILE_NAME.pgm"
void print_histogram_table(int *histog);
main() {
FILE *fp;
int i,j, height= HEIGHT, width=WIDTH;
char line[100];
// Color depth is 255.
unsigned char pixel_value;
fp = fopen(READ_IMAGE_NAME,"r");
// get the first four lines.
fgets (line,100,fp);
fgets (line,100,fp);
fgets (line,100,fp);
fgets (line,100,fp);
// Histogram helper
int histo[65536];
int x;
for ( x =0; x < 65536; x++) {
histo[x] = 0;
}
for(j=0;j<height;j++) {
for(i=0;i<width;i++) {
fread(&pixel_value, sizeof(unsigned char), 1, fp);
// Turn on the code below, if you want to check color on specific row and column.
// printf("row num. %d column num. %d pixel value=%d\n",j,i,pixel_value);
histo[pixel_value]++;
}
}
// Make histogram
print_histogram_table(histo);
fclose(fp);
getch();
}
void print_histogram_table(int *histog)
{
int x;
for (x= 0; x < 255; x++) {
if ( histog[x] != 0)
printf("Color number %d count %d\n", x, histog[x]);
}
}
私の問題に関連するいくつかのページを読みました [ .PGM 形式のファイルを読むには? ] ですが、明確で簡単な答えは見つかりません。私のコードに間違いがあったことをお詫び申し上げます。私のコードに関する提案や批評をいただければ幸いです。
上記のスクリプトでは、正しい色のヒストグラムを表示できませんでした。合理的に考えれば、ピクセルの色が 100 を超える (100 未満だけではない) 可能性があるからです。したがって、主な質問は、この問題を解決するにはどうすればよいですか?
編集私
- PGM イメージを追加します。PGM 画像サンプル
- 画像ヒストグラムを作成する機能を追加。
編集Ⅱ
- fgetsをもう 1 つ追加します。サンプル イメージを参照してください。