【问题标题】:Fingerprint enhancement指纹增强
【发布时间】:2017-05-19 19:52:01
【问题描述】:

正在使用指纹传感器 (Persona) 获取指纹图像。我正在努力增强这个形象。为此,我正在使用 OpenCV。这是我的原图:

我已经对其应用了 otsu 变换并得到了这张图片:

现在我已经在 0, 45, 90, 135 的方向上应用了来自 OpenCV 的 Gabor 过滤器。我得到了这个结果:

这是我在 Python OpenCV 中应用 gabor 滤波器的代码:

import numpy as np
import cv2

from matplotlib import pyplot as plt

//cv2.getGaborKernel(ksize, sigma, theta, lambda, gamma, psi, ktype)
// ksize - size of gabor filter (n, n)
// sigma - standard deviation of the gaussian function
// theta - orientation of the normal to the parallel stripes
// lambda - wavelength of the sunusoidal factor
// gamma - spatial aspect ratio
// psi - phase offset
// ktype - type and range of values that each pixel in the gabor kernel 
//canhold

g_kernel = cv2.getGaborKernel((25, 25), 6.0, np.pi/4, 8.0, 0.5, 0, ktype=cv2.CV_32F)
g_kernel1 = cv2.getGaborKernel((30, 30), 6.0, (3*np.pi)/4, 8.0, 0.5, 0, ktype=cv2.CV_32F)
g_kernel2 = cv2.getGaborKernel((30, 30),4 , 0, 8, 0.5, 0, ktype=cv2.CV_32F)
g_kernel3 = cv2.getGaborKernel((30, 30),4 , np.pi, 8, 0.5, 0, ktype=cv2.CV_32F)

print np.pi/4
img = cv2.imread('C:/Users/admin123/Desktop/p.png')
img1 = cv2.imread('C:/Users/admin123/Desktop/p.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)

// Otsu thresholding
ret2,img1 = cv2.threshold(img1,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
cv2.imshow('otsu', img1)

filtered_img = cv2.filter2D(img, cv2.CV_8UC3, g_kernel)
filtered_img1 = cv2.filter2D(img, cv2.CV_8UC3, g_kernel1)
filtered_img2 = cv2.filter2D(img, cv2.CV_8UC3, g_kernel2)
filtered_img3 = cv2.filter2D(img, cv2.CV_8UC3, g_kernel3)

cv2.imshow('0', filtered_img)
cv2.imshow('1', filtered_img1)
cv2.imshow('2', filtered_img2)
cv2.imshow('image', img)

cv2.addWeighted(filtered_img2,0.4,filtered_img1,0.8,0,img) #0 degree and 90
cv2.addWeighted(img,0.4,filtered_img,0.6,0,img) #0 degree and 90
cv2.addWeighted(img,0.4,filtered_img3,0.6,0,img)
cv2.addWeighted(img,0.4,img1,0.6,0.3,img)

cv2.imshow('per',img)

//threshold will convert it plain zero and white image
ret,thresh1 = cv2.threshold(img,150,255,cv2.THRESH_BINARY)#127 instead of 200

cv2.imshow('per1',thresh1)

h, w = g_kernel.shape[:2]
g_kernel = cv2.resize(g_kernel, (3*w, 3*h), interpolation=cv2.INTER_CUBIC)
g_kernel1 = cv2.resize(g_kernel1, (3*w, 3*h), interpolation=cv2.INTER_CUBIC)

cv2.imshow('gabor kernel (resized)', g_kernel)
cv2.imshow('gabor kernel1 (resized)', g_kernel1)

cv2.waitKey(0)
cv2.destroyAllWindows()

我想要强大的指纹识别。为此,我希望这个级别的图像能够获得准确的细节点:

我怎样才能从增强中获得如此多的结果?需要对代码进行哪些更改才能获得增强的结果?

【问题讨论】:

  • Ahmed - 您还没有如前所述上传原始图像。请上传。
  • 同时看看THIS
  • 对不起,这是我的原图...facebook.com/…
  • 在应用您的代码检查 THIS ANSWER 之前,我发布了一个额外的预处理步骤。

标签: python-2.7 image-processing computer-vision opencv3.0 scikit-image


【解决方案1】:

安装

pip install fingerprint_enhancer

用法

import fingerprint_enhancer # Load the library

img = cv2.imread('image_path', 0) # read input image

out = fingerprint_enhancer.enhance_Fingerprint(img) # enhance the fingerprint image

cv2.imshow('enhanced_image', out); # display the result

cv2.waitKey(0)

【讨论】:

    【解决方案2】:

    我可能会迟到。但这可能对以后的其他人有用。

    看看这个存储库: https://github.com/Utkarsh-Deshmukh/Fingerprint-Enhancement-Python

    它使用 python 中的定向 Gabor 过滤器执行指纹增强。

    【讨论】:

    • 如果您在答案中添加更多详细信息会更好
    【解决方案3】:

    好吧,我没有 python/opencv 答案,但我可以为您指出可以使用 Matlab 代码摆弄的资源。你可以在这里找到代码Simple Fingerprint Matcher 该代码基本上包含所有用于增强/细节提取/匹配的代码。虽然在匹配方面不是很健壮,但增强效果非常好。

    我在您上传的示例上运行了代码,结果如下。

    请注意,该代码使用两种不同的方法结合起来进行指纹增强。一种基于 Gabor 滤波器,另一种称为 STFT(短时傅里叶变换),但您可能只需要 Gabor 滤波器部分。实际上取决于图像质量。 如果需要Matlab中的Gabor滤波器代码,可以在这里找到http://www.peterkovesi.com/matlabfns/#fingerprints 但我确实修改了代码以显示图像并只处理一个手指。 以下是分步调用增强指纹提取的主文件。执行此操作的 matlab 函数是 f_enhance.m

    function [ binim, mask, cimg1, cimg2, oimg1, oimg2 ] = f_enhance( img )
    enhimg =  fft_enhance_cubs(img,6);             % Enhance with Blocks 6x6
    enhimg =  fft_enhance_cubs(enhimg,12);         % Enhance with Blocks 12x12
    [enhimg,cimg2] =  fft_enhance_cubs(enhimg,24); % Enhance with Blocks 24x24
    blksze = 5;   thresh = 0.085;                  
    normim = ridgesegment(enhimg, blksze, thresh);
    oimg1 = ridgeorient(normim, 1, 3, 3);                 
    [enhimg,cimg1] =  fft_enhance_cubs(img, -1);
    [normim, mask] = ridgesegment(enhimg, blksze, thresh);
    oimg2 = ridgeorient(normim, 1, 3, 3); 
    [freq, medfreq] = ridgefreq(normim, mask, oimg2, 32, 5, 5, 15);
    binim = ridgefilter(normim, oimg2, medfreq.*mask, 0.5, 0.5, 1);
    figure,imshow(binim,[]); % Normalize to grayscale
    binim = ridgefilter(normim, oimg2, medfreq.*mask, 0.5, 0.5, 1) > 0;
    figure;
    figure,imshow(binim);
    figure;
    end
    

    要么你恢复到 Matlab,要么你总是可以翻译代码 :) 祝你好运

    【讨论】:

    • 我已经尝试过这段代码,但是我的硬件不允许我运行 matlab 代码。我擅长 Matlab,但对 python 或 opencv 不太熟悉。
    • 哦,在这种情况下,您是否可以通过 Maltab 编码器从 Maltab 代码中构建一个 c++ exe?在任何情况下,我猜你都需要特定于硬件的翻译。
    猜你喜欢
    • 1970-01-01
    • 2017-02-28
    • 2021-07-07
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多