Улучшение отпечатков пальцев

Датчик отпечатков пальцев (Persona) используется для получения изображения отпечатка пальца. Я пытаюсь улучшить этот образ. Я использую OpenCV для этой цели. Вот мое исходное изображение:

Я применил к нему преобразование otsu и получил это изображение:

Теперь я применил фильтр Габора из OpenCV к ориентациям 0, 45, 90, 135. Я получил этот результат:

Вот мой код в Python OpenCV для применения фильтра Габора:

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()

Я хочу надежное распознавание отпечатков пальцев. Для этого я хочу, чтобы изображение этого уровня получало точные точки Minutiae:

введите здесь описание изображения

Как я могу получить такой большой результат от улучшения? Какие изменения необходимы в коде, чтобы получить улучшенный результат?


person Fouzan Javed    schedule 05.01.2017    source источник
comment
Ахмед - Вы не загрузили исходное изображение, как уже упоминалось. Пожалуйста, загрузите его.   -  person Jeru Luke    schedule 05.01.2017
comment
А пока взгляните на ЭТО.   -  person Jeru Luke    schedule 05.01.2017
comment
Извините, это мое исходное изображение... /   -  person Fouzan Javed    schedule 05.01.2017
comment
Перед применением вашего раздела кода проверьте ЭТОТ ОТВЕТ Я разместил в качестве дополнительного шага предварительной обработки.   -  person Jeru Luke    schedule 05.01.2017


Ответы (3)


Ну, у меня нет ответа на python/opencv, но я могу указать вам ресурс, где вы можете возиться с кодом Matlab. Вы можете найти код здесь Простой анализатор отпечатков пальцев Код в основном содержит весь код для улучшения/извлечения/сопоставления мелочей. Хотя и не очень надежный в сопоставлении, но улучшения довольно хороши.

Я запустил код на загруженном вами образце, который получился следующим образом. Binary введите здесь описание изображения

Обратите внимание, что код использует два разных подхода, объединенных для улучшения отпечатков пальцев. Один основан на фильтрах Габора, а другой называется STFT (кратковременное преобразование Фурье). Но вполне вероятно, что вам понадобится только часть фильтра Габора. На самом деле зависит от качества изображения. Если вам нужен код фильтра Габора в Matlab, вы можете найти его здесь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, либо вы всегда можете перевести код :) Удачи

person Wajih    schedule 05.01.2017
comment
Я уже пробовал этот код, но мое оборудование не позволяет мне запускать код Matlab. Я хорошо разбираюсь в Matlab, но не очень хорошо знаком с python или opencv. - person Fouzan Javed; 05.01.2017
comment
О, в таком случае, может быть, вы можете создать исполняемый файл C++ из кода Maltab с помощью кодировщика Maltab? В любом случае, я думаю, вам понадобится аппаратный перевод. - person Wajih; 05.01.2017

Я могу опоздать сюда. Но это может быть полезно для других людей позже.

Взгляните на этот отчет: https://github.com/Utkarsh-Deshmukh/Fingerprint-Enhancement-Python

Он выполняет улучшение отпечатков пальцев, используя ориентированные фильтры Габора в python.

person Utkarsh Deshmukh    schedule 01.11.2019
comment
было бы лучше, если бы вы добавили больше деталей в свой ответ - person Alex Filatov; 02.11.2019

установка:

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)

person Utkarsh Deshmukh    schedule 09.11.2020