def process_FVC_markup_from_minutiae( pathname, data_path='/home/kaicao/Research/AutomatedLatentRecognition/Data/minutiae_cylinder/', num_channels=12): mat_files = glob.glob(pathname + '*.mat') mat_files.sort() for i, mat_file in enumerate(mat_files): fname = os.path.basename(mat_file) print i, fname x = loadmat(mat_file) img = x['img'] h, w = img.shape ROI = np.ones((h, w)) img, ROI, minutiae_cylinder = extract_minutiae_cylinder( img, x['minutiae'], ROI) img = LP.local_constrast_enhancement(img) img = (img + 1) * 128 img[img > 255] = 255 img = np.uint8(img) if num_channels < 3: minutiae_cylinder = (minutiae_cylinder + 1.0) / 2.0 minutiae_cylinder[minutiae_cylinder > 1] = 1. minutiae_cylinder[minutiae_cylinder < 0] = 0. minutiae_cylinder = np.uint8(minutiae_cylinder * 255) else: minutiae_cylinder[minutiae_cylinder > 1] = 1 minutiae_cylinder = np.uint8(minutiae_cylinder * 255) matrix = np.concatenate((np.expand_dims( img, axis=2), np.expand_dims(ROI, axis=2), minutiae_cylinder), 2) outfile = data_path + fname + '.npy' np.save(outfile, matrix)
def compare_AEM_with_MMM(model_path, img_path='/Data/Latent/NISTSD27/image/', output_path='/AutomatedLatentRecognition/Results/minutiae/NISTSD27_latents_Contrast/', minu_path='/Data/Latent/NISTSD27/ManMinu', processing=None, thr=0.01): minu_model = ImportGraph(model_path) img_files = glob.glob(img_path + '*.bmp') img_files.sort() manu_files = glob.glob(minu_path + '*.txt') manu_files.sort() for i, img_file in enumerate(img_files): img = misc.imread(img_file, mode='L') if processing == 'contrast': img = LP.local_constrast_enhancement(img) elif processing == 'STFT': img = LP.STFT(img) elif processing == 'texture': img = LP.FastCartoonTexture(img) elif processing == 'texture_STFT': img = LP.FastCartoonTexture(img) img = LP.STFT(img) mnt = minu_model.run_whole_image(img, minu_thr=thr) img_name = os.path.basename(img_file) fname = output_path + os.path.splitext(img_name)[0] + '_minu.jpeg' minutiae_set = [] minutiae_set.append(mnt) input_minu = np.loadtxt(manu_files[i]) input_minu[:, 2] = input_minu[:, 2] / 180.0 * np.pi minutiae_set.append(input_minu) print i show.show_minutiae_sets(img, minutiae_set, mask=None, block=False, fname=fname) print fname
def get_quality_map_intensity(img): img = img.astype(np.float32) nimg = preprocessing.local_constrast_enhancement(img) gy = np.gradient(nimg, axis=0) gx = np.gradient(nimg, axis=1) mag = np.abs(gx) + np.abs(gy) mag = cv2.GaussianBlur(mag, (21, 21), 7) mag = mag[::8, ::8] mask = mag > 0.3 * 127.5 mask = mask.astype(np.uint8) kernel = np.ones((5, 5), np.uint8) mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) mask = cv2.resize(mask, (0, 0), fx=8, fy=8) return mask
def get_quality_map_intensity(img): img = img.astype(np.float32) nimg = preprocessing.local_constrast_enhancement(img) gy = np.gradient(nimg, axis=0) gx = np.gradient(nimg, axis=1) mag = np.abs(gx) + np.abs(gy) sigma = 5 #mag[mag>1] = 1 mag = cv2.GaussianBlur(mag, (21, 21), 7) mask = mag > 0.25 * 127.5 mask = mask.astype(np.uint8) kernel = np.ones((20, 20), np.uint8) mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) # TODO: remove small area #plt.imshow(mask, cmap='gray') #plt.show() return mask
def feature_extraction_single_rolled(self, img_file, output_path=None, ppi=500): block_size = 16 if not os.path.exists(img_file): return None img = io.imread(img_file, s_grey=True) if ppi != 500: img = cv2.resize(img, (0, 0), fx=500.0 / ppi, fy=500.0 / ppi) img = preprocessing.adjust_image_size(img, block_size) if len(img.shape) > 2: img = rgb2gray(img) h, w = img.shape start = timeit.default_timer() mask = get_maps.get_quality_map_intensity(img) stop = timeit.default_timer() print('time for cropping : %f' % (stop - start)) start = timeit.default_timer() contrast_img = preprocessing.local_constrast_enhancement(img) mnt = self.minu_model.run_whole_image(contrast_img, minu_thr=0.1) stop = timeit.default_timer() minu_time = stop - start print('time for minutiae : %f' % (stop - start)) name = os.path.basename(img_file) show.show_minutiae(img, mnt, block=True) return None start = timeit.default_timer() des = descriptor.minutiae_descriptor_extraction( img, mnt, self.patch_types, self.des_models, self.patchIndexV, batch_size=256, patch_size=self.patch_size) stop = timeit.default_timer() print('time for descriptor : %f' % (stop - start)) dir_map, _ = get_maps.get_maps_STFT(img, patch_size=64, block_size=block_size, preprocess=True) blkH = h // block_size blkW = w // block_size minu_template = template.MinuTemplate(h=h, w=w, blkH=blkH, blkW=blkW, minutiae=mnt, des=des, oimg=dir_map, mask=mask) rolled_template = template.Template() rolled_template.add_minu_template(minu_template) start = timeit.default_timer() # texture templates stride = 16 x = np.arange(24, w - 24, stride) y = np.arange(24, h - 24, stride) virtual_minutiae = [] distFromBg = scipy.ndimage.morphology.distance_transform_edt(mask) for y_i in y: for x_i in x: if (distFromBg[y_i][x_i] <= 24): continue ofY = int(y_i / 16) ofX = int(x_i / 16) ori = -dir_map[ofY][ofX] virtual_minutiae.append([x_i, y_i, ori]) virtual_minutiae = np.asarray(virtual_minutiae) if len(virtual_minutiae) > 1000: virtual_minutiae = virtual_minutiae[:1000] print len(virtual_minutiae) if len(virtual_minutiae) > 3: virtual_des = descriptor.minutiae_descriptor_extraction( contrast_img, virtual_minutiae, self.patch_types, self.des_models, self.patchIndexV, batch_size=128) texture_template = template.TextureTemplate( h=h, w=w, minutiae=virtual_minutiae, des=virtual_des, mask=mask) rolled_template.add_texture_template(texture_template) stop = timeit.default_timer() print('time for texture : %f' % (stop - start)) return rolled_template
def process_kais_markup( pathname='/home/kaicao/Dropbox/Share/markup/data/selected_prints_templates_Kai/', data_path='/home/kaicao/Research/AutomatedLatentRecognition/Data/minutiae_cylinder/', num_channels=12): subjects = glob.glob(pathname + '*') for i, subject in enumerate(subjects): print i feature_file = subject + '/feature.mat' subjectID = subject.split('/')[-1] if os.path.isfile(feature_file): print feature_file x = loadmat(feature_file) if 'minutiae_rolled' in x.keys(): img, ROI, minutiae_cylinder = extract_minutiae_cylinder( x['img_rolled'], x['minutiae_rolled'], x['ROI_rolled_final']) img = np.uint8(img) if num_channels < 3: minutiae_cylinder = (minutiae_cylinder + 1.0) / 2.0 minutiae_cylinder[minutiae_cylinder > 1] = 1. minutiae_cylinder[minutiae_cylinder < 0] = 0. minutiae_cylinder = np.uint8(minutiae_cylinder * 255) else: minutiae_cylinder[minutiae_cylinder > 1] = 1 minutiae_cylinder = np.uint8(minutiae_cylinder * 255) matrix = np.concatenate( (np.expand_dims(img, axis=2), np.expand_dims( ROI, axis=2), minutiae_cylinder), 2) outfile = data_path + subjectID + '_rolled.npy' np.save(outfile, matrix) img, ROI, minutiae_cylinder = extract_minutiae_cylinder( x['img_latent'], x['minutiae_latent'], x['ROI_latent_final']) if num_channels < 3: minutiae_cylinder = (minutiae_cylinder + 1.0) / 2.0 minutiae_cylinder[minutiae_cylinder > 1] = 1. minutiae_cylinder[minutiae_cylinder < 0] = 0. minutiae_cylinder = np.uint8(minutiae_cylinder * 255) else: minutiae_cylinder[minutiae_cylinder > 1] = 1 minutiae_cylinder = np.uint8(minutiae_cylinder * 255) matrix = np.concatenate( (np.expand_dims(img, axis=2), np.expand_dims( ROI, axis=2), minutiae_cylinder), 2) outfile = data_path + subjectID + '_latent.npy' np.save(outfile, matrix) else: img, ROI, minutiae_cylinder = extract_minutiae_cylinder( x['img_rolled'], x['minutiae_rolled_final'], x['ROI_rolled_final']) img = LP.local_constrast_enhancement(img) img = (img + 1) * 128 img[img > 255] = 255 img = np.uint8(img) if num_channels < 3: minutiae_cylinder = (minutiae_cylinder + 1.0) / 2.0 minutiae_cylinder[minutiae_cylinder > 1] = 1. minutiae_cylinder[minutiae_cylinder < 0] = 0. minutiae_cylinder = np.uint8(minutiae_cylinder * 255) else: minutiae_cylinder[minutiae_cylinder > 1] = 1 minutiae_cylinder = np.uint8(minutiae_cylinder * 255) matrix = np.concatenate( (np.expand_dims(img, axis=2), np.expand_dims( ROI, axis=2), minutiae_cylinder), 2) outfile = data_path + subjectID + '_rolled.npy' np.save(outfile, matrix) img, ROI, minutiae_cylinder = extract_minutiae_cylinder( x['img_latent'], x['minutiae_latent_final'], x['ROI_latent_final']) if num_channels < 3: minutiae_cylinder = (minutiae_cylinder + 1.0) / 2.0 minutiae_cylinder[minutiae_cylinder > 1] = 1. minutiae_cylinder[minutiae_cylinder < 0] = 0. minutiae_cylinder = np.uint8(minutiae_cylinder * 255) else: minutiae_cylinder[minutiae_cylinder > 1] = 1 minutiae_cylinder = np.uint8(minutiae_cylinder * 255) matrix = np.concatenate( (np.expand_dims(img, axis=2), np.expand_dims( ROI, axis=2), minutiae_cylinder), 2) outfile = data_path + subjectID + '_latent.npy' np.save(outfile, matrix)
def extract_minutiae_cylinder(img_input, minutiae_input, ROI=None, num_ori=12, angle=None, processing=None): # for the latent or the low quality rolled print minutiae = minutiae_input.copy() img = img_input.copy() if processing == 'STFT': img = LP.STFT(img) elif processing == 'contrast': img = LP.local_constrast_enhancement(img) elif processing == 'texture': img = LP.FastCartoonTexture(img) sigma = 5**2 if ROI is not None: h, w = ROI.shape for i in range(h): for j in range(w): if ROI[i, j] == 0: img[i, j] = 255 h, w = ROI.shape col_sum = np.sum(ROI, axis=0) ind = [x for x in range(len(col_sum)) if col_sum[x] > 0] min_x = np.max([np.min(ind) - 32, 0]) max_x = np.min([np.max(ind) + 32, w]) row_sum = np.sum(ROI, axis=1) ind = [x for x in range(len(row_sum)) if row_sum[x] > 0] min_y = np.max([np.min(ind) - 32, 0]) max_y = np.min([np.max(ind) + 32, h]) ROI = ROI[min_y:max_y, min_x:max_x] img = img[min_y:max_y, min_x:max_x] minutiae[:, 0] = minutiae[:, 0] - min_x minutiae[:, 1] = minutiae[:, 1] - min_y else: h, w = img.shape[0:2] ROI = np.ones((h, w)) # rotate the image and ROI, and also update minutiae points h0, w0 = ROI.shape if angle is not None: h02 = (h0 + 1) / 2 w02 = (w0 + 1) / 2 img = rotate(img, angle) ROI = rotate(ROI, angle) h, w = ROI.shape h2 = (h + 1) / 2 w2 = (w + 1) / 2 angle = -angle / 180.0 * math.pi cosTheta = math.cos(angle) sinTheta = math.sin(angle) xx = (minutiae[:, 0] - w02) * cosTheta - (minutiae[:, 1] - h02) * sinTheta + w2 yy = (minutiae[:, 0] - w02) * sinTheta + (minutiae[:, 1] - h02) * cosTheta + h2 ori = minutiae[:, 2] - angle # minutiae[:, 0] = xx minutiae[:, 1] = yy minutiae[:, 2] = ori show = 0 if show: minu_num = minutiae.shape[0] fig, ax = plt.subplots(1) ax.set_aspect('equal') R = 10 arrow_len = 15 ax.imshow(img, cmap='gray') for i in range(0, minu_num): xx = minutiae[i, 0] yy = minutiae[i, 1] circ = Circle((xx, yy), R, color='r', fill=False) ax.add_patch(circ) ori = -minutiae[i, 2] dx = math.cos(ori) * arrow_len dy = math.sin(ori) * arrow_len ax.arrow(xx, yy, dx, dy, head_width=0.05, head_length=0.1, fc='r', ec='r') plt.show() h, w = ROI.shape minutiae_cylinder = np.zeros((h, w, num_ori), dtype=float) cylinder_ori = np.asarray(range(num_ori)) * math.pi * 2 / num_ori Y, X = np.mgrid[0:h, 0:w] minu_num = minutiae.shape[0] for i in range(0, minu_num): xx = minutiae[i, 0] yy = minutiae[i, 1] if yy < 0 or xx < 0: continue print xx, yy minu_num = minutiae.shape[0] fig, ax = plt.subplots(1) ax.set_aspect('equal') R = 10 arrow_len = 15 ax.imshow(img, cmap='gray') for i in range(0, minu_num): xx = minutiae[i, 0] yy = minutiae[i, 1] circ = Circle((xx, yy), R, color='r', fill=False) ax.add_patch(circ) ori = -minutiae[i, 2] dx = math.cos(ori) * arrow_len dy = math.sin(ori) * arrow_len ax.arrow(xx, yy, dx, dy, head_width=0.05, head_length=0.1, fc='r', ec='r') plt.show() weight = np.exp(-((X - xx) * (X - xx) + (Y - yy) * (Y - yy)) / sigma) ori = minutiae[i, 2] if ori < 0: ori += np.pi * 2 if ori > np.pi * 2: ori -= np.pi * 2 for j in range(num_ori): ori_diff = np.fabs(ori - cylinder_ori[j]) if ori_diff > np.pi * 2: ori_diff = ori_diff - np.pi * 2 ori_diff = np.min([ori_diff, np.pi * 2 - ori_diff]) minutiae_cylinder[:, :, j] += weight * np.exp(-ori_diff / np.pi * 6) show = 0 if show: fig, ax = plt.subplots(1) ax.set_aspect('equal') R = 10 arrow_len = 15 ax.imshow(img, cmap='gray') for i in range(0, minu_num): xx = minutiae[i, 0] yy = minutiae[i, 1] circ = Circle((xx, yy), R, color='r', fill=False) ax.add_patch(circ) ori = -minutiae[i, 2] dx = math.cos(ori) * arrow_len dy = math.sin(ori) * arrow_len ax.arrow(xx, yy, dx, dy, head_width=0.05, head_length=0.1, fc='r', ec='r') plt.show() return img, ROI, minutiae_cylinder
def feature_extraction_single_latent_evaluation(self,img_file, mask_file, AEC_img_file,output_path = None ): img = io.imread(img_file) name = os.path.basename(img_file) AEC_img = io.imread(AEC_img_file) mask = io.imread(mask_file) h,w = mask.shape #mask = mask_dilation(mask, block_size=16) latent_template = template.Template() block = False minu_thr = 0.3 contrast_img = preprocessing.local_constrast_enhancement(img) # Two ways for orientation field estimation # Use the AEC_img and STFT on texture image dir_map_sets = [] texture_img = preprocessing.FastCartoonTexture(img, sigma=2.5, show=False) dir_map, fre_map = get_maps.get_maps_STFT(texture_img, patch_size=64, block_size=16, preprocess=True) dir_map_sets.append(dir_map) blkH, blkW = dir_map.shape dir_map, fre_map = get_maps.get_maps_STFT(AEC_img, patch_size=64, block_size=16, preprocess=True) dir_map_sets.append(dir_map) #dir_map, fre_map = get_maps.get_maps_STFT(contrast_img, patch_size=64, block_size=16, preprocess=True) #dir_map_sets.append(dir_map) # based on the OF, we can use texture image and AEC image for frequency field estimation fre_map_sets = [] quality_map, fre_map = get_maps.get_quality_map_ori_dict(AEC_img, self.dict, self.spacing, dir_map=dir_map_sets[0], block_size=16) fre_map_sets.append(fre_map) quality_map, fre_map = get_maps.get_quality_map_ori_dict(contrast_img, self.dict, self.spacing, dir_map=dir_map_sets[1], block_size=16) fre_map_sets.append(fre_map) descriptor_imgs = [texture_img] descriptor_imgs.append(contrast_img) enh_texture_img = filtering.gabor_filtering_pixel(texture_img, dir_map + math.pi / 2, fre_map_sets[0], mask=mask, block_size=16, angle_inc=3) descriptor_imgs.append(enh_texture_img) enh_contrast_img = filtering.gabor_filtering_pixel(contrast_img, dir_map + math.pi / 2, fre_map_sets[1], mask=mask, block_size=16, angle_inc=3) descriptor_imgs.append(enh_contrast_img) minutiae_sets = [] mnt = self.minu_model.run(texture_img, minu_thr=0.1) mnt = self.remove_spurious_minutiae(mnt, mask) minutiae_sets.append(mnt) fname = output_path + os.path.splitext(name)[0] + '_texture_img.jpeg' show.show_minutiae(texture_img, mnt, block=block, fname=fname) mnt = self.minu_model.run(contrast_img, minu_thr=0.1) mnt = self.remove_spurious_minutiae(mnt, mask) minutiae_sets.append(mnt) fname = output_path + os.path.splitext(name)[0] + '_contrast_img.jpeg' show.show_minutiae(contrast_img, mnt, block=block, fname=fname) mnt = self.minu_model.run(enh_texture_img, minu_thr=minu_thr) mnt = self.remove_spurious_minutiae(mnt, mask) minutiae_sets.append(mnt) fname = output_path + os.path.splitext(name)[0] + '_enh_texture_img.jpeg' show.show_minutiae(enh_texture_img, mnt, block=block, fname=fname) mnt = self.minu_model.run(enh_contrast_img, minu_thr=minu_thr) mnt = self.remove_spurious_minutiae(mnt, mask) minutiae_sets.append(mnt) fname = output_path + os.path.splitext(name)[0] + '_enh_contrast_img.jpeg' show.show_minutiae(enh_contrast_img, mnt, block=block, fname=fname) mnt = self.minu_model.run(AEC_img, minu_thr=minu_thr) mnt = self.remove_spurious_minutiae(mnt, mask) minutiae_sets.append(mnt) fname = output_path + os.path.splitext(name)[0] + '_AEC_img.jpeg' show.show_minutiae(AEC_img, mnt, block=block, fname=fname) for mnt in minutiae_sets: for des_img in descriptor_imgs: des = descriptor.minutiae_descriptor_extraction(des_img, mnt, self.patch_types, self.des_models, self.patchIndexV,batch_size=128) minu_template = template.MinuTemplate(h=h, w=w, blkH=blkH, blkW=blkW, minutiae=mnt, des=des, oimg=dir_map_sets[1], mask=mask) latent_template.add_minu_template(minu_template) return latent_template
def feature_extraction_single_latent_demo(self,img_file, output_path = None ): block = True img = io.imread(img_file) plt.imshow(img, cmap='gray') plt.show(block=block) plt.close() name = os.path.basename(img_file) #AEC_img = io.imread(AEC_img_file) #mask_CNN = io.imread(mask_file) mask_CNN,_ = self.ROI_model.run(img) h,w = mask_CNN.shape #mask = mask_dilation(mask, block_size=16) latent_template = template.Template() minu_thr = 0.3 # template set 1: no ROI and enhancement are required # texture image is used for coase segmentation descriptor_imgs = [] texture_img = preprocessing.FastCartoonTexture(img, sigma=2.5, show=False) descriptor_imgs.append(texture_img) contrast_img_mean = preprocessing.local_constrast_enhancement(img) contrast_img_guassian = preprocessing.local_constrast_enhancement_gaussian(img) quality_map, _, _ = get_maps.get_quality_map_dict(texture_img, self.dict_all, self.dict_ori, self.dict_spacing, block_size=16, process=False) quality_map_pixel = cv2.resize(quality_map, (0, 0), fx=16, fy=16) plt.imshow(quality_map_pixel,cmap='gray') plt.show() mask_coarse = quality_map_pixel > 0.3 mask_coarse = mask_coarse.astype(np.int) mask = mask_coarse * mask_CNN show.show_mask(mask_CNN, img, fname='mask_RCNN.jpeg',block=block) show.show_mask(mask_coarse,img,fname = 'mask_coarse.jpeg',block=block) show.show_mask(mask, img, fname='mask.jpeg',block=block) #show.show_mask(mask, AEC_img, fname='mask_AEC.jpeg',block=block) # plt.imshow(AEC_img,cmap = 'gray') # plt.show(block=block) # plt.close() show.show_mask(mask_CNN, img, fname='mask_RCNN.jpeg',block=block) # AEC_img[mask == 0] = 128 # plt.imshow(AEC_img, cmap='gray') # plt.show(block=block) # plt.close() AEC_img = self.enhancement_model.run(texture_img) quality_map, dir_map, fre_map = get_maps.get_quality_map_dict(AEC_img, self.dict_all, self.dict_ori,self.dict_spacing, block_size=16, process=False) show.show_orientation_field(img, dir_map,mask = mask,fname='OF.jpeg') # mnt = self.minu_model.run(contrast_img_mean, minu_thr=0.1) # mnt = self.remove_spurious_minutiae(mnt, mask) # minutiae_sets.append(mnt) # # fname = output_path + os.path.splitext(name)[0] + '_contrast_img_mean.jpeg' # show.show_minutiae(contrast_img_mean, mnt, block=block, fname=fname) start = timer() enh_contrast_img = filtering.gabor_filtering_pixel(contrast_img_guassian, dir_map + math.pi / 2, fre_map, mask=mask, block_size=16, angle_inc=3) bin_img = binarization.binarization(enh_contrast_img,dir_map,mask=mask) thin_img = skeletonize(bin_img) plt.imshow(thin_img,cmap='gray') plt.show(block=True) dt = timer() - start print(dt) show.show_image(texture_img, mask=mask, block=True, fname='cropped_texture_image.jpeg') show.show_image(AEC_img, mask=mask, block=True, fname='cropped_AEC_image.jpeg') show.show_image(enh_contrast_img, mask=mask, block=True, fname='cropped_enh_image.jpeg') #np.ones((h, w), np.int) descriptor_imgs.append(enh_contrast_img) quality_map2, _ , _ = get_maps.get_quality_map_dict(enh_contrast_img, self.dict_all,self.dict_ori,self.dict_spacing, block_size=16, process=False) quality_map_pixel2 = cv2.resize(quality_map2, (0, 0), fx=16, fy=16) mask2 = quality_map_pixel2 > 0.55 minutiae_sets = [] mnt = self.minu_model.run(texture_img, minu_thr=0.1) mnt = self.remove_spurious_minutiae(mnt, mask2) minutiae_sets.append(mnt) fname = 'minutiae_texture_img.jpeg' show.show_minutiae(texture_img, mnt, mask=mask,block=block, fname=fname) mnt = self.minu_model.run(AEC_img, minu_thr=0.3) mnt = self.remove_spurious_minutiae(mnt, mask2) minutiae_sets.append(mnt) fname = 'minutiae_AEC_img.jpeg' show.show_minutiae(AEC_img, mnt, mask=mask, block=block, fname=fname) mnt = self.minu_model.run(enh_contrast_img, minu_thr=0.3) mnt = self.remove_spurious_minutiae(mnt, mask2) minutiae_sets.append(mnt) fname = 'minutiae_enh_contrast_img.jpeg' show.show_minutiae(img, mnt, mask=np.ones((h,w)), block=block, fname=fname) #show.show_minutiae(img, mnt, mask=mask,block=block, fname=fname) fname = 'minutiae_skeleton.jpeg' show.show_minutiae(img, mnt, mask=mask, block=block, fname=fname) # # mnt = self.minu_model.run(enh_constrast_img, minu_thr=0.3) # mnt = self.remove_spurious_minutiae(mnt, mask) # minutiae_sets.append(mnt) # fname = output_path + os.path.splitext(name)[0] + '_enh_constrast_img.jpeg' # show.show_minutiae(enh_constrast_img, mnt, block=block, fname=fname) # blkH, blkW = dir_map.shape # for mnt in minutiae_sets: # for des_img in descriptor_imgs: # des = descriptor.minutiae_descriptor_extraction(des_img, mnt, self.patch_types, self.des_models, # self.patchIndexV, batch_size=128) # minu_template = template.MinuTemplate(h=h, w=w, blkH=blkH, blkW=blkW, minutiae=mnt, # des=des, oimg=dir_map, mask=mask) # latent_template.add_minu_template(minu_template) return None
def feature_extraction_single_latent_evaluation_AEM18T(self,img_file, mask_file, AEC_img_file,output_path = None ): img = io.imread(img_file) name = os.path.basename(img_file) AEC_img = io.imread(AEC_img_file) mask_CNN = io.imread(mask_file) h,w = mask_CNN.shape #mask = mask_dilation(mask, block_size=16) latent_template = template.Template() block = False minu_thr = 0.3 # template set 1: no ROI and enhancement are required # texture image is used for coase segmentation descriptor_imgs = [] texture_img = preprocessing.FastCartoonTexture(img, sigma=2.5, show=False) descriptor_imgs.append(texture_img) contrast_img_mean = preprocessing.local_constrast_enhancement(img) contrast_img_guassian = preprocessing.local_constrast_enhancement_gaussian(img) quality_map, dir_map, fre_map = get_maps.get_quality_map_dict(texture_img, self.dict_all, self.dict_ori, self.dict_spacing, block_size=16, process=False) quality_map_pixel = cv2.resize(quality_map, (0, 0), fx=16, fy=16) mask_coarse = quality_map_pixel > 0.3 mask_coarse = mask_coarse.astype(np.int) quality_map, dir_map, fre_map = get_maps.get_quality_map_dict(AEC_img, self.dict_all, self.dict_ori,self.dict_spacing, block_size=16, process=False) minutiae_sets = [] mnt = self.minu_model.run(texture_img, minu_thr=0.1) mnt = self.remove_spurious_minutiae(mnt, mask_coarse) minutiae_sets.append(mnt) fname = output_path + os.path.splitext(name)[0] + '_texture_img.jpeg' show.show_minutiae(texture_img, mnt, block=block, fname=fname) mnt = self.minu_model.run(contrast_img_mean, minu_thr=0.1) mnt = self.remove_spurious_minutiae(mnt, mask_coarse) minutiae_sets.append(mnt) fname = output_path + os.path.splitext(name)[0] + '_contrast_img_mean.jpeg' show.show_minutiae(contrast_img_mean, mnt, block=block, fname=fname) mnt = self.minu_model.run(contrast_img_guassian, minu_thr=0.1) mnt = self.remove_spurious_minutiae(mnt, mask_coarse) minutiae_sets.append(mnt) fname = output_path + os.path.splitext(name)[0] + '_contrast_img_guassian.jpeg' show.show_minutiae(contrast_img_guassian, mnt, block=block, fname=fname) #show.show_orientation_field(AEC_img,dir_map) enh_texture_img = filtering.gabor_filtering_pixel(texture_img, dir_map + math.pi / 2, fre_map, mask=np.ones((h, w), np.int), block_size=16, angle_inc=3) descriptor_imgs.append(enh_texture_img) enh_constrast_img = filtering.gabor_filtering_pixel(contrast_img_guassian, dir_map + math.pi / 2, fre_map, mask=np.ones((h,w),np.int), block_size=16, angle_inc=3) descriptor_imgs.append(enh_constrast_img) quality_map2, _ , _ = get_maps.get_quality_map_dict(enh_texture_img, self.dict_all,self.dict_ori,self.dict_spacing, block_size=16, process=False) quality_map_pixel2 = cv2.resize(quality_map2, (0, 0), fx=16, fy=16) mask = quality_map_pixel2 > 0.55 mask = mask.astype(np.int) mask = mask_coarse * mask mask = mask * mask_CNN mnt = self.minu_model.run(AEC_img, minu_thr=0.3) mnt = self.remove_spurious_minutiae(mnt, mask) minutiae_sets.append(mnt) fname = output_path + os.path.splitext(name)[0] + '_AEC_img.jpeg' show.show_minutiae(AEC_img, mnt, block=block, fname=fname) mnt = self.minu_model.run(enh_texture_img, minu_thr=0.3) mnt = self.remove_spurious_minutiae(mnt, mask) minutiae_sets.append(mnt) fname = output_path + os.path.splitext(name)[0] + '_enh_texture_img.jpeg' show.show_minutiae(enh_texture_img, mnt, block=block, fname=fname) mnt = self.minu_model.run(enh_constrast_img, minu_thr=0.3) mnt = self.remove_spurious_minutiae(mnt, mask) minutiae_sets.append(mnt) fname = output_path + os.path.splitext(name)[0] + '_enh_constrast_img.jpeg' show.show_minutiae(enh_constrast_img, mnt, block=block, fname=fname) blkH, blkW = dir_map.shape for mnt in minutiae_sets: for des_img in descriptor_imgs: des = descriptor.minutiae_descriptor_extraction(des_img, mnt, self.patch_types, self.des_models, self.patchIndexV, batch_size=128) minu_template = template.MinuTemplate(h=h, w=w, blkH=blkH, blkW=blkW, minutiae=mnt, des=des, oimg=dir_map, mask=mask) latent_template.add_minu_template(minu_template) return latent_template