1

指紋のローカル リッジの向きをフローチャートとして表示しようとしています。しかし、私はそうすることに惨めに失敗しているようです。私の方法は、次の手順で構成されています。

  • lro関数を使用する
  • 16x16 ブロックで最も優勢な角度を見つける
  • 線分を作成し、主な角度で回転させて表示します

問題は、 が生成する角度lroは良好ですが、フローチャートでのこれらの表示がまったく機能しないことです。そこでは、あらゆる種類の方向に向かうランダムな角度がたくさんあります。誰でもこの問題を解決するのを手伝ってもらえますか?

私が使用しているコードは次のとおりです。

def lro(im_np):
    eps = 2**(-52)
    orientsmoothsigma = 4

#     original
    Gxx = cv2.Sobel(im_np, -1, 2, 0)
    Gxy = cv2.Sobel(im_np, -1, 1, 1)
    Gyy = cv2.Sobel(im_np, -1, 0, 2)



    Gxx = scipy.ndimage.filters.gaussian_filter(Gxx, orientsmoothsigma)
    Gxy = scipy.ndimage.filters.gaussian_filter(Gxy, orientsmoothsigma)
    Gyy = scipy.ndimage.filters.gaussian_filter(Gyy, orientsmoothsigma)

    angle = math.pi/2. + numpy.divide(numpy.arctan2(numpy.multiply(Gxy,2), numpy.subtract(Gxx,Gyy)),2)

    return angle

def createLine(im_np):

    #Assumes it is 17x17
    #Takes in the block-direction
    #returns a block-direction image as a numpy array

    angle = numpy.max(im_np)
#     print im_np.shape
    im = Image.new('L', (im_np.shape[0], im_np.shape[1]), (0))
    draw = ImageDraw.Draw(im) 
    draw.line([(0,im_np.shape[0]/2), (im_np.shape[0],im_np.shape[0]/2)], fill=255)
    im = im.rotate(angle)
    img_np2 = numpy.asarray(im)
#     print img_np2
    return img_np2

def findDomAngle(im_np):
    mask = numpy.zeros((180,2))

    for i in range(180):
        mask[i][0] = i+1

    for i in range(im_np.shape[0]):
        for j in range(im_np.shape[0]):
            mask[im_np[i][j]-1][1] +=  1

    max = 0
    bestdir = 0
    for i in range(180):
        if mask[i][1] > max:
            bestdir = i + 1 
            max = mask[i][1]
#     print mask
#     print max
    return bestdir


def blkdir(angle_mat):
    x = angle_mat.shape[0]
    y = angle_mat.shape[1]
#     print angle_mat

    domAngle = findDomAngle(angle_mat)
#     print domAngle
    blkAngle = angle_mat
    blkAngle.setflags(write=True)

    for i in range(x):
        for j in range(y):
            blkAngle[i][j] = domAngle

    return blkAngle 

imageブロックごとに処理する別の関数を適用していますが、この方法は機能することが証明されているため、含める必要はありません。

4

0 に答える 0