2017-06-20 33 views
3

注:私は、このイメージだけではなく、一般的な範囲のイメージ、方向、および品質で動作するプロセスを作成しようとしています。任意の形状四角形の最小境界ボックスまたは凸包ですか?

凸包を使用して点集合をポリゴンで囲むことができ、いくつかのアルゴリズムのいずれかを使用して、それらの点の最小境界ボックスを作成することができます。しかし、最小限の境界ボックスに似ているが、四角形に限定されることはない。

enter image description here

凸包:

enter image description here

最小バウンディング・ボックス(回転キャリパー):

は、私は、この領収書を持っていると言います0

enter image description here

私の目標:(MS-塗料):

領収書が台形からなので、あなたが、非常にうまくいかない最小バウンディングボックスを見ることができるように

enter image description here

パースペクティブ。これは、視点が低くなるほど悪化します。私は4点と鋭いコーナーを持ちたいので、私は凸包を使用することはできません。

凸包や最小境界ボックスに似たものを得るのに4点に限定されたアルゴリズムや四角形を使用するアルゴリズムはありますか?

+0

なぜハリスコーナー検出器?現在のアルゴリズムでは、凸包からの小さな線を拒否し、長い線の交点を見つけることができます。 2つのエンドポイントを使用すると、[determinantsを使って]交差点を見つけることができます(https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection#Given_two_points_on_each_line)。または、あなたが持っているすべての点を凸包から守り、['kmeans' clustering](http://docs.opencv.org/3.0-beta/modules/core/doc/clustering.html)を使ってそれら4点をあなたのポイントと呼んでください。 –

+1

ハフラインとの交差点クラスタリングの例については、私の答え[ここ](https://stackoverflow.com/questions/44449871/fine-tuning-hough-line-function-parameters-opencv/44454619#44454619)を参照してください。私は輪郭を見つけることがそのイメージにとっては良いかもしれないと思っています。そして、その答えにしたようにラインを合わせ、交差点を見つけてください。 –

+0

@AlexanderReynolds良いアイデア。今、私は輪郭を生成し、それらを近似し、それらを凸包し、最小限の境界ボックスを探します。凸包または等高線を使用したくない唯一の理由は、非常に丸みのある、または反りのあるぎこちない領収書のためです。ハフ線は代替ですが、エッジ検出前にぼかしや平滑化をしても、テキストから数百、数百の線が得られます。もしそれを改善したいのであれば、それはもう一つの疑問です。良い答えをそこに編集すると、有望に見えます。 –

答えて

1

色空間のフィルタリングと形態学的操作を混乱させて、私は成功したHarris検出器を使用することができました。代わりにハーフラインからhereのように交差点を使用してこれを拡張することもできますが、これは少し冗長ですが有用かもしれません。この特定のイメージではうまくいきますが、パイプラインでは多くのパラメータ(カーネルのサイズや反復の開閉)が必要です。コーナー

import numpy as np 
import cv2 

# read image 
img = cv2.imread('receipt.png') 

# thresholding 
blur = cv2.GaussianBlur(img, (5,5), 1) 
hls = cv2.cvtColor(blur, cv2.COLOR_BGR2HLS) 
low = np.array([0, 70, 0]) 
high = np.array([255, 255, 85]) 
thresh = cv2.inRange(hls, low, high) 

# morphological operations to get the paper 
kclose = np.ones((3,3), dtype=np.uint8) 
kopen = np.ones((5,5), dtype=np.uint8) 
closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kclose, iterations=2) 
opening = cv2.morphologyEx(closing, cv2.MORPH_OPEN, kopen, iterations=6) 

# corner detection 
opening = cv2.GaussianBlur(opening, (3,3), 1) 
opening = np.float32(opening) 
dst = cv2.cornerHarris(opening, 2, 3, 0.04) 

# drawing corners 
dst = cv2.dilate(dst, None) 
img[dst>0.01*dst.max()]=[0,0,255] 

cv2.imshow('Corners', img) 
cv2.waitKey(0) 

をそしてここです:あなたは複数のピクセルを取得

Corners

私の実装はPythonであるが、もちろんこれは、同様にC++やJavaで仕事ができますHarrisから、後でワーピングするためにそれらを使いたい場合は、特異点を得るためにクラスタリングを行う必要があります。

画像の色空間のフィルタリング、クロージング、および開きからマスクを適用したので、その操作の後でマスクを見ることができます。

フィルタリング:

Filtering

クロージング:

Closing

オープニング:

Opening

+0

ありがとうalex!私は今これを通過しています。なぜあなたは低い/高い色を選んだのですか?それはこの画像、または標準に特有のものであるかどうかは任意ですか?それがこの画像だけに限定されている場合、特定の画像に対してどのような低い/高いべきかを判断する方法がありますか? –

+0

この画像に完全に固有です。自動的なフィルタリングを試みるのは、一般的にどのような背景があるのか​​を特定することが難しいです。バックグラウンドで動作するアプリを開発している場合、この方法はそれほど堅牢ではありません。あなたは、それぞれの白と明るい灰色に対応するものの感触を得るために、異なる色空間で実験する必要があります。任意の画像については、あなたのオリジナルの方法---輪郭を進めて、あなたの質問のコメントで提案した方法でコーナーに従う方が簡単です。 –

関連する問題