33

「ドキュメント」からの画像から水平線と垂直線を見つけようとしています。ドキュメントは契約書からスキャンされたページであるため、行は表や契約書ブロックに表示されるものと同じように見えます。

私は仕事のためにOpenCVを試してきました。OpenCV でのハフ変換の実装は、この仕事に役立つように見えましたが、垂直線と水平線をきれいに見つけることができるパラメーターの組み合わせを見つけることができませんでした。エッジ検出ありとなしで試してみました。運がない。誰かが似たようなことをしたことがあるなら、その方法を知りたいです。

OpenCV での HoughP の実験前後の画像を参照してください。それは私ができる最善のことです、http://dl.dropbox.com/u/3787481/Untitled%201.png

だから今、水平線と垂直線(できれば破線も)を確実に見つけることができる別の種類の変換があるかどうか疑問に思っています。

Nuance と ABBYY OCR ツールを使用しているため、この問題は解決可能であることがわかります。これらのツールは、水平線と垂直線の両方を確実に抽出し、線の境界ボックスを返すことができます。

ありがとう!パトリック。

4

6 に答える 6

36

HoughLinesP関数のドキュメントのコード サンプルを見たことがありますか?

アルゴリズムの出発点として使用できると思います。水平線と垂直線を選択するには、線の角度で他の線を除外する必要があります。

アップデート:

ご覧のとおり、ページの行ではなく、水平方向と垂直方向のエッジを見つける必要があります。このタスクでは、良い結果を得るためにいくつかの処理ステップを組み合わせる必要があります。

あなたの画像では、Canny エッジ検出と HoughLinesP を組み合わせることで、良い結果を得ることができました。これが私のコードです(私はpythonを使用しましたが、アイデアがわかると思います):

img = cv2.imread("C:/temp/1.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 80, 120)
lines = cv2.HoughLinesP(edges, 1, math.pi/2, 2, None, 30, 1);
for line in lines[0]:
    pt1 = (line[0],line[1])
    pt2 = (line[2],line[3])
    cv2.line(img, pt1, pt2, (0,0,255), 3)
cv2.imwrite("C:/temp/2.png", img)

結果は次のようになります。

于 2011-08-29T10:19:13.003 に答える
10

「線分」ではなく「線」だけが必要な場合は、コードの速度を上げたい場合に備えて、Canny、Hough、FindContours、またはその他のそのような関数の使用を避けます。画像が回転されておらず、見つけたいものが常に垂直または水平である場合、cv::Sobel (垂直用と水平用) を使用して、列と行の累積配列を作成します。次に、たとえばしきい値を設定することにより、そのような累積またはプロファイルで最大値を検索でき、垂直または水平のエッジ ラインがある行または列を知ることができます。

于 2012-07-27T12:46:59.363 に答える
7

このメソッドは、必ずしも線分ではなく「グローバル」な線を探すため、ハフ線検出を終了することを検討してください。私は最近、「平行四辺形」を特定するアプリケーションを実装しました。これは、基本的には正方形であり、視野角のために回転し、遠近法が短縮される可能性があります。あなたは似たようなことを考えるかもしれません。私のパイプラインは次のとおりです。

  1. RGB からグレースケールに変換 (cvCvtColor)
  2. スムーズ (cvSmooth)
  3. しきい値 (cvThreshold)
  4. エッジの検出 (cvCanny)
  5. 輪郭を見つける (cvFindContours)
  6. 線形フィーチャを使用した輪郭の近似 (cvApproxPoly)

アプリケーションでは、結果として得られる輪郭リストはおそらく大きくなります (スムージングの「積極性」と Canny エッジ検出器の機能拡張によって異なります。このリストは、さまざまなパラメーターによって削除できます: 輪郭ファインダーから返されるポイントの数, 輪郭の領域 (cvContourArea) など. 私の経験から, アプリケーションの「有効な」行には、明確に定義された領域と頂点数のプロパティがあることが期待されます. さらに, 端と端の間の距離に基づいて輪郭を除外できますポイント、端点を結ぶ線によって定義される角度など。

CPU の「時間」に応じて、Hough アルゴリズムと上記のようなアルゴリズムを常に組み合わせて、水平線と垂直線を確実に識別することができます。

于 2011-08-29T18:30:40.080 に答える
6

RGB をグレースケールに変換しないでください。場合によっては、RGB の異なる色が同じグレースケール値にマージされることがあるため、一部の輪郭が失われる可能性があります。各 RGB チャネルを個別に分析する必要があります。

于 2013-02-25T15:24:36.483 に答える