私はAndroidプラットフォームでopenCVを使用しています。このコミュニティと技術者の多大な支援により、画像からシートを正常に検出できました。これらは私が使用したステップです。
1.Imgproc.cvtColor()
2.Imgproc.Canny()
3.Imgproc.GausianBlur()
4.Imgproc.findContours()
5.Imgproc.approxPolyDP()
6.findLargestRectangle()
7.find the vertices of the rectangle
8.find the vertices of the rectangle top-left anticlockwise order using center of mass approach
9.find the height and width of the rectangle just to maintain the aspect ratio and do warpPerspective transformation.
これらすべての手順を適用した後、画像からドキュメントまたは最大の長方形を簡単に取得できます。ただし、背景とドキュメントシートの強度の違いに大きく依存します。 Canny Edgeは強度勾配の原理に基づいて動作するため、強度の違いは常に実装側から想定されます。そのため、キャニーはさまざまなしきい値パラメーターを考慮に入れました。
したがって、ピクセルの強度勾配が上限しきい値よりも大きい場合、それは出力画像のエッジピクセルとして追加されます。強度勾配値が下限しきい値よりも低い場合、ピクセルは完全に拒否されます。また、ピクセルの強度が下限と上限の間にある場合、上限のしきい値より大きい値を持つ他のピクセルに接続されている場合にのみ、そのピクセルはエッジピクセルとして追加されます。
私の主な目的は、ドキュメントのスキャンにCanny Edge検出を使用することです。したがって、これらのしきい値を動的に計算して、暗い背景と明るい背景の両方のケースで機能するようにする方法を知りたいです。
パラメータを手動で調整して何度も試しましたが、シナリオに関連する関係は見つかりませんでした。
私は私のポイントをクリアしてくれるといいのですが、事前に感謝します
大津の方法 を使用してしきい値を計算できます
(Python)コードは次のようになります。
high_thresh, thresh_im = cv2.threshold(im, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
lowThresh = 0.5*high_thresh
THIS BLOG から取得した次のスニペットを使用します。
v = np.median(gray_image)
#---- apply automatic Canny Edge detection using the computed median----
lower = int(max(0, (1.0 - sigma) * v))
upper = int(min(255, (1.0 + sigma) * v))
edged = cv2.Canny(gray_image, lower, upper)
cv2.imshow('Edges',edged)
グレースケール画像の中央値をとっています。 0.33のシグマ値は、下限と上限のしきい値を設定するために選択されます。 0.33の値は通常、統計学者がデータサイエンスに使用します。したがって、ここでも考慮されます。