数字が書かれた画像を2値化し、ラベリングして数字だけを抜き出して出力したいのですが、どうも上手くいきません。
色々試しても見たのですが、数字だけを取り出すことはできませんでした。
以下のプログラムのどこを直せば、ラベリングされた画像を抜き出すことができるのでしょうか?
一週間やってもできませんでした…
何方か教えて下さると大変助かります


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

#define Y_SIZE 512 //縦の最大画素数
#define X_SIZE 512 //横の最大画素数
#define HIGH 255 //最大階調値
#define LOW 0 //最小階調値
#define Level 256
#define FileName 256
#define MaxBufferSize 640
#defineL_BASE 100
#define Black 1
#define White 2

unsigned char image[Y_SIZE][X_SIZE]; //入力画像用配列
unsigned char label_image[Y_SIZE][X_SIZE];
unsigned char image_h[Y_SIZE][X_SIZE];
int x_size, y_size;
int Label=200;
long hist[256];

void set(unsigned char image[Y_SIZE][X_SIZE], int xs, int ys, int label);
void save(unsigned char output_img[Y_SIZE][X_SIZE],int output_ysize,int output_xsize);

void load(void)
{
入力画像
}

void hist1(unsigned char image_in[Y_SIZE][X_SIZE], int x, int y, long hist[256])
{
ヒストグラム処理
}

void hist2(long hist[256], unsigned char image_h[Y_SIZE][X_SIZE])
{
ヒストグラムを画像化
}

void thr(unsigned char image_in[Y_SIZE][X_SIZE], unsigned char image_out[Y_SIZE][X_SIZE], int thresh, int type)
{
閾値処理
閾値180
タイプ白
}

画像のラベリング処理
int labeling(unsigned char image_in[Y_SIZE][X_SIZE], unsigned char image_label[Y_SIZE][X_SIZE])
{
int i, j, label;

for (i = 0; i < Y_SIZE; i++)
for (j = 0; j < X_SIZE; j++)
image_label[i][j] = image_in[i][j];
label = L_BASE;
for (i = 0; i < Y_SIZE; i++)
for (j = 0; j < X_SIZE; j++) {
if (image_label[i][j] == HIGH) {
if (label >= HIGH) return -1;
set(image_label, j, i, label); label++;
}}
return label - L_BASE;
}

連結している画素すべてにラベル付け
void set(unsigned char image[Y_SIZE][X_SIZE], int xs, int ys, int label)
{
int i, j, cnt, im, ip, jm, jp;
image[ys][xs] = label;
while(1) {
cnt = 0;
for (i = 0; i < Y_SIZE; i++)
for (j = 0; j < X_SIZE; j++)
if (image[i][j] == label) {
im = i-1; ip = i+1; jm = j-1; jp = j+1;
if (im < 0) im = 0; if (ip >= Y_SIZE) ip = Y_SIZE-1;
if (jm < 0) jm = 0; if (jp >= X_SIZE) jp = X_SIZE-1;
if (image[i ][jp] == HIGH) {
image[i ][jp] = label; cnt++;
}
if (image[im][jp] == HIGH) {
image[im][jp] = label; cnt++;
}
if (image[im][j ] == HIGH) {
image[im][j ] = label; cnt++;
}
if (image[im][jm] == HIGH) {
image[im][jm] = label; cnt++;
}
if (image[i ][jm] == HIGH) {
image[i ][jm] = label; cnt++;
}
if (image[ip][jm] == HIGH) {
image[ip][jm] = label; cnt++;
}
if (image[ip][j ] == HIGH) {
image[ip][j ] = label; cnt++;
}
if (image[ip][jp] == HIGH) {
image[ip][jp] = label; cnt++;
}
}
if (cnt == 0) break;
}
save(image,ys,xs);
}

//ラベリング画像の出力
void save(unsigned char output_img[Y_SIZE][X_SIZE],int output_ysize,int output_xsize)
{
char f_name[FileName];
FILE *fp;
int i, j,n;

printf("Output File (*.pgm) : ");
scanf("%s",f_name);
fp = fopen(f_name, "wb");

fputs( "P5\n", fp );
fputs( "# Created by Image Processing\n", fp );

fprintf( fp, "%d %d\n", output_xsize, output_ysize );
fprintf( fp, "%d\n", HIGH);


画像データの出力
for (i=0; i<output_ysize; i++)
for (j=0; j<output_xsize; j++)
fputc(output_img[i][j], fp);

fclose(fp);
}

int main(void){

int thresh=180, type=White;

入力画像
load();

ヒストグラム処理
hist1(image, x_size, y_size, hist);

ヒストグラム画像化
hist2(hist,image_h);

閾値処理
thr(image, image_h, thresh, type);

labeling(image_h, label_image);

return 0;
}

このQ&Aに関連する最新のQ&A

A 回答 (2件)

|そもそも同じ色に対しては同じラベル番号になるかと思いますが、そこらへん理解してます?



すみません、間違えました、、
私こそ理解してませんね 笑
    • good
    • 0

参考になるかな?



第 3 章 画像処理入門 1
http://msdn.microsoft.com/ja-jp/academic/cc99860 …

3.3 ラベリング処理を参照。

そもそも同じ色に対しては同じラベル番号になるかと思いますが、そこらへん理解してます?
    • good
    • 0

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


人気Q&Aランキング