Restructured
This commit is contained in:
parent
420c2f8dcc
commit
ae61544630
|
@ -1,12 +0,0 @@
|
||||||
from FingerCode_final import *
|
|
||||||
from fingercode import *
|
|
||||||
|
|
||||||
imaage = "2/106_5.tif"
|
|
||||||
imaage2 = "2/101_1.tif"
|
|
||||||
|
|
||||||
i1 = FingerCode(imaage).result
|
|
||||||
i2 = FingerCode(imaage2).result
|
|
||||||
|
|
||||||
if i1 and i2:
|
|
||||||
res = cal_euler_distance(i1, i2)
|
|
||||||
print(res)
|
|
|
@ -2,12 +2,16 @@ import cv2
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
import math
|
import math
|
||||||
from Sector import *
|
|
||||||
from Gabor import *
|
from .sector import cal_mean, divide_sector, normalize_img
|
||||||
|
from .gabor import get_gabor
|
||||||
|
|
||||||
|
|
||||||
class FingerCode:
|
class FingerCode:
|
||||||
def Get_central_point(self, img):
|
def __init__(self, image):
|
||||||
|
self.result = self.extract_fingercode(image)
|
||||||
|
|
||||||
|
def get_central_point(self, img):
|
||||||
img1 = img.copy()
|
img1 = img.copy()
|
||||||
img = cv2.GaussianBlur(img, (3, 3), 0)
|
img = cv2.GaussianBlur(img, (3, 3), 0)
|
||||||
img = cv2.blur(img, (5, 5))
|
img = cv2.blur(img, (5, 5))
|
||||||
|
@ -15,12 +19,11 @@ class FingerCode:
|
||||||
|
|
||||||
sobelx1 = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
|
sobelx1 = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
|
||||||
|
|
||||||
|
|
||||||
A = sobelx.copy()
|
A = sobelx.copy()
|
||||||
B = sobelx1 + A
|
B = sobelx1 + A
|
||||||
gh = cv2.Sobel(B, cv2.CV_16S, 1, 1, ksize=3)
|
gh = cv2.Sobel(B, cv2.CV_16S, 1, 1, ksize=3)
|
||||||
gh_blur = cv2.GaussianBlur(gh, (15, 15), 0)
|
gh_blur = cv2.GaussianBlur(gh, (15, 15), 0)
|
||||||
gh_blur = cv2.convertScaleAbs(gh_blur,gh_blur)
|
gh_blur = cv2.convertScaleAbs(gh_blur, gh_blur)
|
||||||
gh_media = cv2.medianBlur(gh_blur, 5)
|
gh_media = cv2.medianBlur(gh_blur, 5)
|
||||||
gh_media = cv2.medianBlur(gh_media, 5)
|
gh_media = cv2.medianBlur(gh_media, 5)
|
||||||
gh_media = cv2.medianBlur(gh_media, 3)
|
gh_media = cv2.medianBlur(gh_media, 3)
|
||||||
|
@ -56,11 +59,12 @@ class FingerCode:
|
||||||
|
|
||||||
return col, row
|
return col, row
|
||||||
|
|
||||||
def Get_core_img(self, img, core_x, core_y):
|
def get_core_img(self, img, core_x, core_y):
|
||||||
radius = 75
|
radius = 75
|
||||||
core_img = img[core_y-radius:core_y+radius, core_x-radius:core_x+radius]
|
core_img = img[
|
||||||
|
core_y - radius : core_y + radius, core_x - radius : core_x + radius
|
||||||
|
]
|
||||||
return core_img
|
return core_img
|
||||||
|
|
||||||
|
|
||||||
def cal_standar(self, points, mean):
|
def cal_standar(self, points, mean):
|
||||||
total = 0
|
total = 0
|
||||||
|
@ -73,7 +77,7 @@ class FingerCode:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
def fingercode(self, img):
|
def fingercode(self, img):
|
||||||
sectors = Divide_sector(img)
|
sectors = divide_sector(img)
|
||||||
result = []
|
result = []
|
||||||
Mean = []
|
Mean = []
|
||||||
for i in range(len(sectors)):
|
for i in range(len(sectors)):
|
||||||
|
@ -85,36 +89,31 @@ class FingerCode:
|
||||||
|
|
||||||
for i in range(len(sectors)):
|
for i in range(len(sectors)):
|
||||||
temp = round(math.sqrt(Variance[i]), 0)
|
temp = round(math.sqrt(Variance[i]), 0)
|
||||||
#print temp
|
# print temp
|
||||||
result.append(int(temp))
|
result.append(int(temp))
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def extract_fingercode(self, image):
|
def extract_fingercode(self, image):
|
||||||
img = cv2.imread(image)
|
img = cv2.imread(image)
|
||||||
rows, cols = img.shape[:2]
|
rows, cols = img.shape[:2]
|
||||||
# get the reference point
|
# get the reference point
|
||||||
core_x, core_y = self.Get_central_point(img)
|
core_x, core_y = self.get_central_point(img)
|
||||||
|
|
||||||
if core_x != 0:
|
if core_x != 0:
|
||||||
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
||||||
|
|
||||||
core_img = self.Get_core_img(img, core_x, core_y)
|
core_img = self.get_core_img(img, core_x, core_y)
|
||||||
|
|
||||||
|
|
||||||
# divide the img sector
|
# divide the img sector
|
||||||
sectors = Divide_sector(core_img)
|
sectors = divide_sector(core_img)
|
||||||
|
|
||||||
core_img = Normalize_img(core_img, sectors)
|
core_img = normalize_img(core_img, sectors)
|
||||||
|
|
||||||
result = getGabor(core_img) # 8
|
result = get_gabor(core_img) # 8
|
||||||
|
|
||||||
ADD = []
|
ADD = []
|
||||||
for i in result:
|
for i in result:
|
||||||
fingercodetemp = self.fingercode(i)
|
fingercodetemp = self.fingercode(i)
|
||||||
ADD.extend(fingercodetemp)
|
ADD.extend(fingercodetemp)
|
||||||
|
|
||||||
return ADD
|
return ADD
|
||||||
|
|
||||||
|
|
||||||
def __init__(self,image):
|
|
||||||
self.result = self.extract_fingercode(image)
|
|
|
@ -10,34 +10,36 @@ import numpy as np
|
||||||
# so from the Gabor source code sigma_y = sigma_x / gamma
|
# so from the Gabor source code sigma_y = sigma_x / gamma
|
||||||
# the gamma should be 1.0
|
# the gamma should be 1.0
|
||||||
# lamba = 0.1
|
# lamba = 0.1
|
||||||
|
|
||||||
|
|
||||||
def build_filters():
|
def build_filters():
|
||||||
filters = []
|
filters = []
|
||||||
sigma = 4
|
sigma = 4
|
||||||
gamma = 1.0
|
gamma = 1.0
|
||||||
ksize = 33
|
ksize = 33
|
||||||
lamba = 10
|
lamba = 10
|
||||||
ps = (90-180)*np.pi/180.0
|
ps = (90 - 180) * np.pi / 180.0
|
||||||
for theta in np.arange(0, np.pi, np.pi / 8):
|
for theta in np.arange(0, np.pi, np.pi / 8):
|
||||||
kernel = cv2.getGaborKernel((ksize, ksize), sigma, theta, lamba, gamma, ps)
|
kernel = cv2.getGaborKernel((ksize, ksize), sigma, theta, lamba, gamma, ps)
|
||||||
#kern = kern/2 + 0.5
|
# kern = kern/2 + 0.5
|
||||||
filters.append(kernel)
|
filters.append(kernel)
|
||||||
return filters
|
return filters
|
||||||
|
|
||||||
|
|
||||||
# processing the img
|
# processing the img
|
||||||
def process(img, kernel):
|
def process(img, kernel):
|
||||||
#img = np.array(img, dtype=np.float32)
|
# img = np.array(img, dtype=np.float32)
|
||||||
#img /= 255.
|
# img /= 255.
|
||||||
dest = cv2.filter2D(img, -1, kernel)
|
dest = cv2.filter2D(img, -1, kernel)
|
||||||
return dest
|
return dest
|
||||||
|
|
||||||
|
|
||||||
# get the image's result after the Gabor filtering - returns 8 filters most likely based on rotatiom
|
# get the image's result after the Gabor filtering - returns 8 filters most likely
|
||||||
def getGabor(img):
|
# based on rotatiom
|
||||||
|
def get_gabor(img):
|
||||||
filters = build_filters()
|
filters = build_filters()
|
||||||
res = []
|
res = []
|
||||||
for i in filters:
|
for i in filters:
|
||||||
res1 = process(img, i)
|
res1 = process(img, i)
|
||||||
res.append(res1)
|
res.append(res1)
|
||||||
return res
|
return res
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
# _*_ coding:utf-8 _*_
|
|
||||||
|
|
||||||
# description: the Sector Class
|
# description: the Sector Class
|
||||||
|
|
||||||
import math
|
import math
|
||||||
|
@ -30,17 +28,17 @@ def cal_mean(points):
|
||||||
return total / num
|
return total / num
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# calculate the variance of the sector's points
|
# calculate the variance of the sector's points
|
||||||
def cal_variance(points, mean):
|
def cal_variance(points, mean):
|
||||||
total = 0
|
total = 0
|
||||||
for i in range(len(points)):
|
for i in range(len(points)):
|
||||||
point = points[i]
|
point = points[i]
|
||||||
total += math.pow(point.Gray - mean, 2)
|
total += math.pow(point.Gray - mean, 2)
|
||||||
return total / (len(points)-1)
|
return total / (len(points) - 1)
|
||||||
|
|
||||||
|
|
||||||
# divide the core image into 80 sectors - returns 80
|
# divide the core image into 80 sectors - returns 80
|
||||||
def Divide_sector(img):
|
def divide_sector(img):
|
||||||
k = 16
|
k = 16
|
||||||
b = 10
|
b = 10
|
||||||
T = []
|
T = []
|
||||||
|
@ -59,12 +57,12 @@ def Divide_sector(img):
|
||||||
y = 1
|
y = 1
|
||||||
sector = []
|
sector = []
|
||||||
for x in range(cols):
|
for x in range(cols):
|
||||||
#print x
|
# print x
|
||||||
for y in range(rows):
|
for y in range(rows):
|
||||||
x0 = x - core_x
|
x0 = x - core_x
|
||||||
y0 = y - core_y
|
y0 = y - core_y
|
||||||
r = math.sqrt(pow(x0, 2) + pow(y0, 2))
|
r = math.sqrt(pow(x0, 2) + pow(y0, 2))
|
||||||
#print r
|
# print r
|
||||||
if x0 == 0.0:
|
if x0 == 0.0:
|
||||||
if y0 > 0:
|
if y0 > 0:
|
||||||
point_angle = 270.0
|
point_angle = 270.0
|
||||||
|
@ -77,33 +75,45 @@ def Divide_sector(img):
|
||||||
else:
|
else:
|
||||||
point_angle = 180.0
|
point_angle = 180.0
|
||||||
# in 1 district
|
# in 1 district
|
||||||
if(y0 < 0.0)&(x0 > 0.0):
|
if (y0 < 0.0) & (x0 > 0.0):
|
||||||
point_angle = abs(math.degrees(math.atan(y0 / x0)))
|
point_angle = abs(math.degrees(math.atan(y0 / x0)))
|
||||||
# in 2 district
|
# in 2 district
|
||||||
if(y0 < 0.0)&(x0 < 0.0):
|
if (y0 < 0.0) & (x0 < 0.0):
|
||||||
point_angle = abs(math.degrees(math.atan(x0 / y0))) + 90.0
|
point_angle = abs(math.degrees(math.atan(x0 / y0))) + 90.0
|
||||||
# in 3 district
|
# in 3 district
|
||||||
if(y0 > 0.0)&(x0 < 0.0):
|
if (y0 > 0.0) & (x0 < 0.0):
|
||||||
point_angle = abs(math.degrees(math.atan(y0 / x0))) + 180.0
|
point_angle = abs(math.degrees(math.atan(y0 / x0))) + 180.0
|
||||||
# in 4 district
|
# in 4 district
|
||||||
if (y0 > 0.0)&(x0 > 0.0):
|
if (y0 > 0.0) & (x0 > 0.0):
|
||||||
point_angle = abs(math.degrees(math.atan(x0 / y0))) + 270.0
|
point_angle = abs(math.degrees(math.atan(x0 / y0))) + 270.0
|
||||||
#point_angle = math.degrees(math.atan((y - core_y) / (x - core_x)))
|
# point_angle = math.degrees(math.atan((y - core_y) / (x - core_x)))
|
||||||
#print point_angle, r
|
# print point_angle, r
|
||||||
if (point_angle <= 337.5)&(b * (T[i] + 1) <= r)&(b * (T[i] + 2) > r)&(angle[i] <= point_angle)&(angle[i+1] > point_angle):
|
if (
|
||||||
|
(point_angle <= 337.5)
|
||||||
|
& (b * (T[i] + 1) <= r)
|
||||||
|
& (b * (T[i] + 2) > r)
|
||||||
|
& (angle[i] <= point_angle)
|
||||||
|
& (angle[i + 1] > point_angle)
|
||||||
|
):
|
||||||
point = Point(y, x, img[y][x])
|
point = Point(y, x, img[y][x])
|
||||||
sector.append(point)
|
sector.append(point)
|
||||||
if (point_angle > 337.5)&(b * (T[i] + 1) <= r)&(b * (T[i] + 2) > r)&(angle[i] <= point_angle)&(360.0 > point_angle):
|
if (
|
||||||
|
(point_angle > 337.5)
|
||||||
|
& (b * (T[i] + 1) <= r)
|
||||||
|
& (b * (T[i] + 2) > r)
|
||||||
|
& (angle[i] <= point_angle)
|
||||||
|
& (360.0 > point_angle)
|
||||||
|
):
|
||||||
point = Point(y, x, img[y][x])
|
point = Point(y, x, img[y][x])
|
||||||
sector.append(point)
|
sector.append(point)
|
||||||
#print len(sector)
|
# print len(sector)
|
||||||
sectors.append(sector)
|
sectors.append(sector)
|
||||||
|
|
||||||
return sectors
|
return sectors
|
||||||
|
|
||||||
|
|
||||||
# normalize the image after divide into sectors
|
# normalize the image after divide into sectors
|
||||||
def Normalize_img(img, sectors):
|
def normalize_img(img, sectors):
|
||||||
M0 = 100
|
M0 = 100
|
||||||
V0 = 100
|
V0 = 100
|
||||||
Mean = []
|
Mean = []
|
|
@ -0,0 +1,24 @@
|
||||||
|
from .fingercode import FingerCode
|
||||||
|
import math
|
||||||
|
|
||||||
|
imaage = "/mnt/D/Linux/Works/secure-fp-auth/dataset/106_5.tif"
|
||||||
|
imaage2 = "/mnt/D/Linux/Works/secure-fp-auth/dataset/106_6.tif"
|
||||||
|
|
||||||
|
i1 = FingerCode(imaage).result
|
||||||
|
i2 = FingerCode(imaage2).result
|
||||||
|
|
||||||
|
|
||||||
|
print(i1, i2)
|
||||||
|
|
||||||
|
|
||||||
|
def cal_euler_distance(result1, result2):
|
||||||
|
distance = 0
|
||||||
|
for i in range(len(result1)):
|
||||||
|
distance += math.pow(result1[i] - result2[i], 2)
|
||||||
|
|
||||||
|
return distance
|
||||||
|
|
||||||
|
|
||||||
|
if i1 and i2:
|
||||||
|
res = cal_euler_distance(i1, i2)
|
||||||
|
print(res)
|
|
@ -1,2 +1,4 @@
|
||||||
phe==1.4.0
|
phe==1.4.0
|
||||||
python-dotenv==0.15.0
|
python-dotenv==0.15.0
|
||||||
|
numpy
|
||||||
|
matplotlib
|
9
run.py
9
run.py
|
@ -15,6 +15,8 @@ random_fp = "wct4rywzkxdpca1ktds46i8izwgneauujtqk9o2jhlz101pcbr5935vgnw1hfuby84h
|
||||||
print(random_fp, len(random_fp))
|
print(random_fp, len(random_fp))
|
||||||
random_fp_ascii = [ord(ele) for ele in random_fp]
|
random_fp_ascii = [ord(ele) for ele in random_fp]
|
||||||
|
|
||||||
|
print(random_fp_ascii)
|
||||||
|
|
||||||
print(random_fp)
|
print(random_fp)
|
||||||
random_regno = "B170003CS"
|
random_regno = "B170003CS"
|
||||||
|
|
||||||
|
@ -56,7 +58,7 @@ def enroll():
|
||||||
print(resp)
|
print(resp)
|
||||||
|
|
||||||
|
|
||||||
def validate():
|
def validate(new_fp):
|
||||||
data = {"encr_regno": sha256(random_regno)}
|
data = {"encr_regno": sha256(random_regno)}
|
||||||
|
|
||||||
s = requests.Session()
|
s = requests.Session()
|
||||||
|
@ -79,7 +81,7 @@ def validate():
|
||||||
# print(encr_fp_orig)
|
# print(encr_fp_orig)
|
||||||
# print(encr_fp_sqr)
|
# print(encr_fp_sqr)
|
||||||
|
|
||||||
print(paillier.get_alt_euclidean_dist(encr_fp_orig, encr_fp_sqr, random_fp_ascii))
|
print(paillier.get_alt_euclidean_dist(encr_fp_orig, encr_fp_sqr, new_fp))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
@ -93,4 +95,5 @@ if __name__ == "__main__":
|
||||||
print("Paillier working!")
|
print("Paillier working!")
|
||||||
|
|
||||||
# enroll()
|
# enroll()
|
||||||
# validate()
|
random_fp_ascii[0] = 247
|
||||||
|
validate(random_fp_ascii)
|
||||||
|
|
10
src/utils.py
10
src/utils.py
|
@ -22,4 +22,12 @@ def decode_regno(ascii_regno_undiv):
|
||||||
|
|
||||||
|
|
||||||
def sha256(plaintext):
|
def sha256(plaintext):
|
||||||
return hashlib.sha256(plaintext.encode()).hexdigest()
|
return hashlib.sha256(plaintext.encode()).hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
def cal_euler_distance(result1, result2):
|
||||||
|
distance = 0
|
||||||
|
for i in range(len(result1)):
|
||||||
|
distance += math.pow(result1[i] - result2[i], 2)
|
||||||
|
|
||||||
|
return distance
|
Loading…
Reference in New Issue