3

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

Я применил Оцу на него и получил это изображение:

Теперь применили Габор фильтр из 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() 

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

enter image description here

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

+0

Ahmed - Вы не загрузили исходное изображение, как указано. Pls загрузите его. –

+0

В то же время посмотрите [ЭТО] (http://www.cse.iitk.ac.in/users/biometrics/pages/111.JPG). –

+0

Извините, это мое оригинальное изображение ... https://www.facebook.com/photo.php?fbid=401956756811517&set=a.401956773478182.1073741829.100009915888220&type=3&theater –

ответ

3

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

Я запустил код на загруженном образце, который вышел следующим образом. Binary enter image description here

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

+0

Я уже пробовал этот код, но мое оборудование не позволяет мне запускать код matlab. Я хорош в Matlab, но не очень хорошо знаком с python или opencv. –

+0

О, в таком случае, может быть, вы можете построить C++ exe из кода Maltab через кодер Maltab? В любом случае вам понадобится аппаратная специфическая трансляция, я думаю. – Wajih

Смежные вопросы