アプリ版:「スタンプのみでお礼する」機能のリリースについて

画像処理について勉強しています。
画像のラベリングを行うプログラムを書いていたのですが、意図した結果になりません。

以下の関数で実現しようとしましたが、上手くいきませんでした。何か、決定的に間違っている点などがありましたら、教えてください。
また、参考になるWebページなどがありましたら、教えていただけると幸いです。


image2[][]には、レナ画像の512x512を判別分析法を使用して2値化した画像データが格納されています。
また、label[]は全て-1で初期化しました。(initialize())
void labeling(){
int x,y;
int up_label,left_label;
int label_num=1; //初期ラベル
int label_add=1; //ラベルの増分
int max;
int i;

initialize();

for(y=0; y<y_size1; y++){
for(x=0; x<x_size1; x++){
if(image2[y][x]==0 && label[y][x]==-1){
up_label=left_label=500;
if(y-1>=0) up_label=label[y-1][x];
if(x-1>=0) left_label=label[y][x-1];

if(up_label==500 && left_label==500){//(0,0)の地点の処理
label[y][x]=label_num;
}else if(up_label==left_label){//上と左が等しい場合の処理
//上と左のラベルが無い場合はラベルを作る
if(up_label < 0) label_num += label_add;
//ラベルを付与
label[y][x]=label_num;
}else{//それ以外の処理
//上と左で小さいほうのラベルを付与する
if(up_label<0) label[y][x]=left_label;
else if(left_label<0) label[y][x]=up_label;
else label[y][x]= (up_label < left_label)? up_label:left_label;
}
}
}
}
}

A 回答 (1件)

私もラベリングのアルゴリズムを考えているものです。


まだ考え途中なのですが、とりあえず訂正すべき箇所はわかりましたので、書き込ませていただきます。

上と左を調べて小さいほうのラベルを付与したあと、上と左で大きい方のラベルに小さいラベルを振りなおす必要があります。

自分で書いてても意味がわからなくなってしまったので、図で。


   333
555□□□
555□□□
555□□□

この画像を処理すると

   333
555333
555333
555333

こうなってしまうと思います。
そこで5の部分に3を入れなおさなければいけません。

   333
333333
333333
333333

この処理をエレガントに行うのが割りと難しくて私も苦労しています。

もっと詳しい方の回答をお待ちしていますw
    • good
    • 0

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