画像の細線化について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Img

画像の細線化について

#1

投稿記事 by Img » 12年前

画像の細線化処理を作成しているのですが,サンプルの結果と一致しません.
画像のピクセルデータを置き換えるタイミングがおかしいのでしょうか?ご教授お願いします.

方法は田村の細線化を利用しています.
参考URL:画像処理ソリューション http://imagingsolution.blog107.fc2.com/ ... y-138.html

画像データを読み込み,ピクセル(i,j)データが白(255)ならdata[j]に1を,黒(0)なら0を代入しています.
細線化処理のコードを以下に示します.

コード:

        /*----細線化----*/
        void thinning(int xmin, int xmax, int ymin, int ymax)
        {
            int i, j;
            int d_flg1,d_flg2;
            int cnt;
     
            for (i = ymin; i < ymax; i++)
            {
                for (j = xmin; j < xmax; j++)
                {
                    d_flg1 = 0;
                    d_flg2 = 0;
                    cnt = 0;
                    while (true)
                    {
                        d_flg1 = 0;
                        d_flg2 = 0;
                        //パターン1
                        //--除去パターン--//
                        if (data[i][j] == 1 && data[i - 1][j] == 0)
                        {
                            d_flg1++;
                        }
                        else if (data[i][j] == 1 && data[i][j + 1] == 0)
                        {
                            d_flg1++;
                        }
                        //--除去パターン--//
                        else
                        {//除去パターンにあてはまらない
                            break;
                        }
                        if (d_flg1 != 0)
                        {
                            //--除去しないパターン--//
                            if (data[i][j] == 1 && data[i - 1][j] == 0 && data[i][j + 1] == 1
                                && data[i + 1][j] == 1 && data[i + 1][j + 1] == 0)
                            {
                                d_flg1 = 0;
                                break;
                            }
                            else if (data[i][j] == 1 && data[i - 1][j - 1] == 0 && data[i - 1][j] == 1
                                && data[i][j - 1] == 1 && data[i][j + 1] == 0)
                            {
                                d_flg1 = 0;
                                break;
                            }
                            //--共通パターン--//
                            else if (data[i][j] == 1 && data[i][j - 1] == 0 && data[i][j + 1] == 0
                                && data[i + 1][j] == 1)
                            {//1
                                d_flg1 = 0;
                                break;
                            }
                            else if (data[i][j] == 1 && data[i - 1][j] == 0 && data[i][j - 1] == 1
                                && data[i + 1][j] == 0)
                            {//2
                                d_flg1 = 0;
                                break;
                            }
                            else if (data[i][j] == 1 && data[i - 1][j] == 1 && data[i][j - 1] == 0
                                && data[i][j + 1] == 0)
                            {//3
                                d_flg1 = 0;
                                break;
                            }
                            else if (data[i][j] == 1 && data[i - 1][j] == 0 && data[i][j + 1] == 1
                                && data[i + 1][j] == 0)
                            {//4
                                d_flg1 = 0;
                                break;
                            }
                            else if (data[i][j] == 1 && data[i][j - 1] == 0 && data[i + 1][j - 1] == 1
                                && data[i + 1][j] == 0)
                            {//5
                                d_flg1 = 0;
                                break;
                            }
                            else if (data[i][j] == 1 && data[i - 1][j - 1] == 1 && data[i - 1][j] == 0
                                && data[i][j - 1] == 0)
                            {//6
                                d_flg1 = 0;
                                break;
                            }
                            else if (data[i][j] == 1 && data[i - 1][j] == 0 && data[i - 1][j + 1] == 1
                                && data[i][j + 1] == 0)
                            {//7
                                d_flg1 = 0;
                                break;
                            }
                            else if (data[i][j] == 1 && data[i][j + 1] == 0 && data[i + 1][j] == 0
                                && data[i + 1][j + 1] == 1)
                            {//8
                                d_flg1 = 0;
                                break;
                            }
                            else if (data[i][j] == 1 && data[i - 1][j - 1] == 0 && data[i - 1][j] == 1
                                && data[i - 1][j + 1] == 0 && data[i][j - 1] == 1 && data[i][j + 1] == 1
                                && data[i + 1][j - 1] == 0 && data[i + 1][j + 1] == 0)
                            {//9
                                d_flg1 = 0;
                                break;
                            }
                            else if (data[i][j] == 1 && data[i - 1][j - 1] == 0 && data[i - 1][j] == 1
                                && data[i - 1][j + 1] == 0 && data[i][j + 1] == 1 && data[i + 1][j - 1] == 0
                                && data[i + 1][j] == 1 && data[i + 1][j + 1] == 0)
                            {//10
                                d_flg1 = 0;
                                break;
                            }
                            else if (data[i][j] == 1 && data[i - 1][j - 1] == 0 && data[i - 1][j + 1] == 0
                                && data[i][j - 1] == 1 && data[i][j + 1] == 1 && data[i + 1][j - 1] == 0
                                && data[i + 1][j] == 1 && data[i + 1][j + 1] == 0)
                            {//11
                                d_flg1 = 0;
                                break;
                            }
                            else if (data[i][j] == 1 && data[i - 1][j - 1] == 0 && data[i - 1][j] == 1
                                && data[i - 1][j + 1] == 0 && data[i][j - 1] == 1 && data[i + 1][j - 1] == 0
                                && data[i + 1][j] == 1 && data[i + 1][j + 1] == 0)
                            {//12
                                d_flg1 = 0;
                                break;
                            }
                            //--共通パターン--//
                            if (d_flg1 != 0)
                            {
                                data[i][j] = 0;
                            }
                        }

                        //共通パターン
                        d_flg2 = 0;

                        if (d_flg1 != 0)
                        {
                            //--パターン2
                            //--除去パターン--//
                            if (data[i][j] == 1 && data[i + 1][j] == 0)
                            {
                                d_flg2++;
                            }
                            else if (data[i][j] == 1 && data[i][j - 1] == 0)
                            {
                                d_flg2++;
                            }
                            //--除去パターン--//
                            if (d_flg2 != 0)
                            {//除去したら
                                
                                //除去しないパターン
                                if (data[i][j] == 1 && data[i - 1][j - 1] == 0 && data[i - 1][j] == 1
                                    && data[i][j - 1] == 1 && data[i + 1][j] == 0)
                                {
                                    d_flg2 = 0;
                                    break;
                                }
                                else if (data[i][j] == 1 && data[i][j - 1] == 0 && data[i][j + 1] == 1
                                    && data[i + 1][j] == 1 && data[i + 1][j + 1] == 0)
                                {
                                    d_flg2 = 0;
                                    break;
                                }
                                //共通パターン
                                else if (data[i][j] == 1 && data[i][j - 1] == 0 && data[i][j + 1] == 0
                                    && data[i + 1][j] == 1)
                                {//1
                                    d_flg2 = 0;
                                    break;
                                }
                                else if (data[i][j] == 1 && data[i - 1][j] == 0 && data[i][j - 1] == 1
                                    && data[i + 1][j] == 0)
                                {//2
                                    d_flg2 = 0;
                                    break;
                                }
                                else if (data[i][j] == 1 && data[i - 1][j] == 1 && data[i][j - 1] == 0
                                    && data[i][j + 1] == 0)
                                {//3
                                    d_flg2 = 0;
                                    break;
                                }
                                else if (data[i][j] == 1 && data[i - 1][j] == 0 && data[i][j + 1] == 1
                                    && data[i + 1][j] == 0)
                                {//4
                                    d_flg2 = 0;
                                    break;
                                }
                                else if (data[i][j] == 1 && data[i][j - 1] == 0 && data[i + 1][j - 1] == 1
                                    && data[i + 1][j] == 0)
                                {//5
                                    d_flg2 = 0;
                                    break;
                                }
                                else if (data[i][j] == 1 && data[i - 1][j - 1] == 1 && data[i - 1][j] == 0
                                    && data[i][j - 1] == 0)
                                {//6
                                    d_flg2 = 0;
                                    break;
                                }
                                else if (data[i][j] == 1 && data[i - 1][j] == 0 && data[i - 1][j + 1] == 1
                                    && data[i][j + 1] == 0)
                                {//7
                                    d_flg2 = 0;
                                    break;
                                }
                                else if (data[i][j] == 1 && data[i][j + 1] == 0 && data[i + 1][j] == 0
                                    && data[i + 1][j + 1] == 1)
                                {//8
                                    d_flg2 = 0;
                                    break;
                                }
                                else if (data[i][j] == 1 && data[i - 1][j - 1] == 0 && data[i - 1][j] == 1
                                    && data[i - 1][j + 1] == 0 && data[i][j - 1] == 1 && data[i][j + 1] == 1
                                    && data[i + 1][j - 1] == 0 && data[i + 1][j + 1] == 0)
                                {//9
                                    d_flg2 = 0;
                                    break;
                                }
                                else if (data[i][j] == 1 && data[i - 1][j - 1] == 0 && data[i - 1][j] == 1
                                    && data[i - 1][j + 1] == 0 && data[i][j + 1] == 1 && data[i + 1][j - 1] == 0
                                    && data[i + 1][j] == 1 && data[i + 1][j + 1] == 0)
                                {//10
                                    d_flg2 = 0;
                                    break;
                                }
                                else if (data[i][j] == 1 && data[i - 1][j - 1] == 0 && data[i - 1][j + 1] == 0
                                    && data[i][j - 1] == 1 && data[i][j + 1] == 1 && data[i + 1][j - 1] == 0
                                    && data[i + 1][j] == 1 && data[i + 1][j + 1] == 0)
                                {//11
                                    d_flg2 = 0;
                                    break;
                                }
                                else if (data[i][j] == 1 && data[i - 1][j - 1] == 0 && data[i - 1][j] == 1
                                    && data[i - 1][j + 1] == 0 && data[i][j - 1] == 1 && data[i + 1][j - 1] == 0
                                    && data[i + 1][j] == 1 && data[i + 1][j + 1] == 0)
                                {//12
                                    d_flg2 = 0;
                                    break;
                                }
                                if (d_flg2 != 0)
                                {
                                    data[i][j] = 0;
                                }
                            }
                        }
                    }
                }
            }
        }
        /*----細線化----*/

アバター
usao
記事: 1892
登録日時: 13年前
連絡を取る:

Re: 画像の細線化について

#2

投稿記事 by usao » 12年前

一か所の説明でよくわからない場合は,複数個所を参照すると良いでしょう.
例えば,ここの説明の方が手順がわかりやすいと思います.
http://www.hundredsoft.jp/win7blog/log/eid119.html

そのコードでは,なんというか,全体的に手順を勘違いしているように思います.
オフトピック
画像を走査していく処理を書くときに
走査中に画像値を書き換えてしまうようなコードを書いていたら
注意深く「この時点で書き換えてしまっても大丈夫なアルゴリズムなのか?」ということを考えて確認すると良いです.
今回の場合,各画素位置のチェック時点では 画素値を書き換えてはいけない 処理に思います.

閉鎖

“C言語何でも質問掲示板” へ戻る