らべリnグについての質問です
数字が書かれた画像を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
#define L_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;
}