3

これは、karlphillipmevatron、およびabid-rahman-kがいくつかのクールなアプローチを思いついた正方形検出に関するいくつかの同様の 質問へのフォローアップです。

レシートの画像を残りの画像から分離するのに役立つ堅牢な正方形検出アルゴリズムを設計しようとしています。私のコードは、前の質問からの凸包アプローチから構築されていますが、ポイントの 1 つが画像になく、レシートの端に左側のペン ホルダーが原因で収差がある画像で窒息しています。

この領収書の角を検出するにはどうすればよいですか?

画像は次のとおりです。

領収書のイメージ

これが私のコードです:

import cv2
import numpy as np

img = cv2.imread('taco.jpg')
img = cv2.resize(img,(1944,2592))
img = cv2.medianBlur(img,31)
img = cv2.GaussianBlur(img,(0,0),3)

grayscale = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
thresh = cv2.Canny(grayscale, 10, 20)
thresh = cv2.dilate(thresh,None)

contours,hier = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

for cnt in contours:
    if cv2.contourArea(cnt)>250:  # remove small areas like noise etc
        hull = cv2.convexHull(cnt)    # find the convex hull of contour
        hull = cv2.approxPolyDP(hull,0.1*cv2.arcLength(hull,True),True)
        if len(hull)==4:
            cv2.drawContours(img,[hull],0,(0,255,0),2)

cv2.namedWindow('output',cv2.cv.CV_WINDOW_NORMAL)
cv2.imshow('output',img)
cv2.cv.ResizeWindow('output',960,640)
cv2.waitKey()
cv2.destroyAllWindows()

何か案は?

4

1 に答える 1

3

Mathematica での解決策:

イメージをインポートします。

i = Import@"http://i.imgur.com/RrYKJ.jpg";

レシートの文字よりも大きなスケールでエッジを検出 (パラメータ)

i1 = EdgeDetect[i, 10]

Mathematica グラフィックス

レシートの周囲の縮尺より小さい行を削除 (パラメータ)

i2 = DeleteSmallComponents[i1, 1000]

Mathematica グラフィックス

形態学的成分を見つける

(mc = MorphologicalComponents[Erosion[ColorNegate@i2, 1]]) // Colorize

Mathematica グラフィックス

より多くの境界隣接を持つモーフ コンポーネントを見つけます (マスクから削除するため)。

com = Commonest[Join[mc[[1]], mc[[-1]], Transpose[mc][[1]], Transpose[mc][[-1]]]]

マスクを形成する

mc1 = Unitize[mc /. com[[1]] -> 0];

Mathematica グラフィックス

マスクに元の画像を掛けます

ImageMultiply[Image@mc1, i]

Mathematica グラフィックス

于 2012-09-04T17:12:40.873 に答える