1

だから私はこのビットのコードを持っています

for x in range(x1,x2):
        for y in range(y1, y2):
            cpixel = pixels[x, y]
            if bw:
                bw_value = int(round(sum(cpixel) / float(len(cpixel))))
                all_pixels.append(bw_value)
                title = "Averaged (B&W) Pixel Values"
            else:
                if lumi:
                    luma = (0.3 * cpixel[0]) + (0.59 * cpixel[1]) + (0.11 * cpixel[2])
                    all_pixels.append(luma)
                    title = "Pixel Luminosity Values"
                else:
                    if round(sum(cpixel)) / float(len(cpixel)) > 100:
                        all_pixels.append(255)
                    else:
                        all_pixels.append(0)
                    title = "Pixel Binary Transform Values"

here から少し取得して変更しましたPILからピクセル値のリストを取得して、境界領域 (ユーザーが選択した) 内のピクセル値 (all_pixels) のリストを取得します。

一連の同様の値が記録された後、リスト内の変更を検出する効率的な方法を見つけようとしています。リストにはピクセル値が上から下、左から右にリストされているように見えるためです。私が使用するシナリオでは、値が新しい値の周りで再び安定するまで、値が前後に切り替わり始める画像の領域に到達するまで、同様の値のリストがあります。

私が興味を持っているのは、これら 2 つの境界を追跡することです。この境界がどこにあり、左または右にシフトするかどうかを検出したいと考えています。all_pixels に追加された各値を確認してから、座標をたどる以外に方法は考えられません。

しかし、任意の数の値を同じに設定したとしても、次の値が大幅に異なる場合は、単なる外れ値ではなく重要な変化と見なされ、その後、値が古い値の間でトグルし始めるため、これでもかなり大雑把に思えます。そして新しいもの。

理想的には、この境界領域/線の座標に最適な線を生成する必要があると思います。この問題にどのようにアプローチするか、いくつかのアイデアが必要です。

4

2 に答える 2

1

あなたのコメントの問題の説明に基づいて、単純なエッジ検出器で十分だと思いますが、それはカメラの角度、コントラスト、照明などによって異なります.

画像の垂直導関数を取得し、おそらくそれを少し滑らかにして、最大値の行を見つけることができます。画像が円柱上で拡大され、粉末の境界以外に他の主要な垂直方向のコントラストがないと仮定すると、それが粉末の高さになります。

これを自分でコーディングすることも、OpenCV を使用することもできますが、このタスクには少し圧倒される可能性があると思います。Numpy も良い選択肢です。

于 2012-06-14T02:59:37.690 に答える
0

あなたの説明から、独自の画像検出コードを作成しようとするのではなく、実際にはコンピューター ビジョン ライブラリを使用する必要があるように思えます。

ここでは、Python でのコンピューター ビジョンについて説明し ます。Flash/HTML5 ビデオで顔を見つけることができる、Python 用の優れたコンピューター ビジョン ライブラリは何ですか?

OpenCVが最善の策のようです。

http://opencv.willowgarage.com/

于 2012-06-14T02:49:58.747 に答える