这篇主要是记录GitHub上找到的一份python写的图像增强代码,主要针对指纹图像。这里将这份代码转写为matlab版本,不过还是有很多代码不太理解,因此主要放我转写的代码,附带很少的解释。通过这篇指纹图像增强的代码,让我学到了很多,这份python的代码非常棒,鲁棒性很强,让我也学到了非常多的编程规范。GitHub地址为https://github.com/Utkarsh-Deshmukh/Fingerprint-Enhancement-Python
这个代码是主函数,如果要进行指纹图像增强就直接调用这个函数即可。
function newimim=imageEnhancement(gray)
% %对图像进行增强处理
%----------------------------------------------------------------------
%输入:
% gray: 图像
%----------------------------------------------------------------------
%输出:
% newimim: 增强后的图像
%----------------------------------------------------------------------
gray=rgb2gray(gray); %转灰度图像
[rows,cols] = size(gray);
aspect_ratio = double(rows)/double(cols);
new_rows = 350; % 设置一个新行值,这个值可以设置的稍大一些,大一些增强效果会好很多
%只设置行值,列值根据图像的比值设置非常高明,不用该别图像的长宽比
new_cols = new_rows/aspect_ratio; %依据原图比例得到新列值
gray=imresize(gray,[new_rows new_cols],'bilinear'); %改变图像大小
% figure();imshow(uint8(gray));
blksze = 16; %将图像分成若干块,每块大小16*16
thresh = 0.2; %固定阈值
[gray,Icc]=ridge_segment(gray,blksze,thresh); %图像分割函数,得到归一化后的图,以及指纹前景区域
gradientsigma = 1; %计算图像梯度的高斯导数
blocksigma = 5; %对梯度矩阵求和的高斯加权值
orientsmoothsigma = 5; %平滑最终方向向量场,可设为0
orientim = OrientationFilter(gray, gradientsigma, blocksigma, orientsmoothsigma); %计算指纹中脊线的局部方向
blksze = 40; %图像块大小
windsze = 5; %识别峰值的窗口长度,应该设为奇数
minWaveLength = 5; %最小脊波长
maxWaveLength = 15; %最大脊波长
[freq,meanfreq]=ridge_freq(gray, Icc, orientim, blksze, windsze,minWaveLength, maxWaveLength); %计算脊频率
freq = meanfreq*Icc;
kx = 0.65;ky = 0.65; %% 比例因子,指定相对于滤波器波长的滤波器sigma,可从0.5开始
newim = ridge_filter(gray, orientim, freq, kx, ky); %基于方向的Gabor滤波
newimim=newim < -2;
se=zeros(3,3);
se(2,:)=1;
se(:,2)=1;
newimim=imclose(newimim,se); %闭运算
end
图像分割,主要是为了确定前景和背景,避免背景对于指纹图像的干扰,有利于后面的识别。
function [normim,mask]= ridge_segment(im,blksze,thresh)
% %将图像归一化并分割图像
%----------------------------------------------------------------------
%输入:
% im: 待处理图像
% blksze: 块大小
% thresh: 阈值,决定前景还是背景
%----------------------------------------------------------------------
%输出:
% normim: 归一化后的图
% mask: