A list,

Firstly, sample images of eleven number characters, 0 ~ 9 and X, are obtained from the ID card image as the character library samples for subsequent recognition. Secondly, the id card image to be tested is denoised, gray scale, binarization, horizontal projection cutting, vertical projection and cutting, and the ID card number to be tested is separated. Then compare the number picture and the character database sample to calculate, identify and judge, and finally determine the id number to be tested. The identification of id card number in this design is based on Matlab software. 1. Input id card picture; 2. Locate the ID card number and cut it according to the geometric information; 3. Cut characters using connected domain algorithm; 4. Use template matching algorithm for recognition

Mathematical morphology operations can be divided into binary morphology and gray morphology. Gray morphology is expanded from binary morphology. There are two basic operations of mathematical morphology, namely corrosion and expansion, and corrosion and expansion combine to form open and closed operations. Open operation is first corrosion and then expansion, closed operation is first expansion and then corrosion.

1 binary morphology

Roughly speaking, corrosion can “shrink” the target area, essentially shrinking the image’s boundaries, and can be used to eliminate small, meaningless objects. The formula is expressed as:



The formula says with structure corrosion. A, B need to be aware of is the need to define A B origin, [and the moving process of B are consistent with the process of convolution kernels mobile, with convolution kernels and image overlap again after calculation as 】 when B origin to image A translation like yuan (x, y), if B (x, y), fully contained in the image A overlapping area, (That is, all the corresponding image values of A at the position of element 1 in B are also 1) then the pixel (x,y) corresponding to the output image is assigned A value of 1, otherwise 0 is assigned.

Let’s look at a demo.



B moves on A in sequence (the same as the convolution kernel moves on the image, and then performs morphological operation on the coverage domain of B). When the coverage region of A is [1,1;1,1] or [1,0;1,1], (that is, ‘1’ in B is A subset of the coverage region), the position of the corresponding output image will be 1.

2 expansion

Roughly speaking, expansion “enlarges” the range of the target area, merging background points in contact with the target area into the target object, making the target boundary expand outwards. It can be used to fill some holes in the target area and eliminate the small particle noise contained in the target area.



In this formula, A is expanded by structure B, and the origin of structural element B is shifted to the position of image pixel (x,y). If the intersection of B and A at image pixel (x,y) is not empty (that is, at least one image value of A corresponding to the position of element 1 in B is 1), then the pixel (x,y) corresponding to the output image is assigned the value of 1; otherwise, it is assigned the value of 0.

Demo picture:



3 summary

In other words, no matter corrosion or expansion, structural element B is shifted on the image like convolution operation. The origin of structural element B is equivalent to the core center of the convolution kernel, and the result is also stored on the element at the corresponding position of the core center. However, corrosion means that B is completely contained in the area covered by it, and there is an intersection between B and the area covered by it during expansion.

Before telling the gray value morphology, we make A convention that the area of image A covered by structural element B is denoted as P (take Part meaning).

5. Corrosion of gray scale morphology

So corrosion in grayscale morphology is an operation similar to convolution. The small rectangle formed by subtracting structural element B from P can be assigned to the position of the corresponding origin by taking the minimum value.

Let’s look at an example to deepen our understanding of grayscale morphology.

Suppose we have the following image A and structural element B:



The process of gray morphological corrosion is as follows:



We specifically show the output result of the first element of the output image, that is, the position of 4 corresponding to the origin. The values of the other elements of the output image are also obtained in this way. We’ll see that the region that B first covers is the subtracted matrix, and then we take min in the difference matrix to be the value of the origin.



Expansion of grayscale morphology

According to the above description of corrosion, expansion is described in the same way. Expansion in grayscale morphology is an operation similar to convolution. P is added to B, and then the maximum value in this region is assigned to the position corresponding to the origin of structural element B.





Here is also the origin of the value of the first element of the output image.



The maximum value of the sum of the above matrices is 6, so assign 6 to the position corresponding to the origin of the structural element.

6 Summary Above introduced the concept of gray morphology, here to say their use. Compared with the original image, the corrosion results in smaller pixels than before, so it is suitable for removing peak noise. As a result of gray expansion, each pixel becomes larger than the previous one, so it is suitable for removing the trough noise.

Ii. Source code

function varargout = id_rec_gui(varargin)
% ID_REC_GUI MATLAB code for id_rec_gui.fig
%      ID_REC_GUI, by itself, creates a new ID_REC_GUI or raises the existing
%      singleton*.
%
%      H = ID_REC_GUI returns the handle to a new ID_REC_GUI or the handle to
%      the existing singleton*.
%
%      ID_REC_GUI('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in ID_REC_GUI.M with the given input arguments.
%
%      ID_REC_GUI('Property','Value',...) creates a new ID_REC_GUI or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before id_rec_gui_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to id_rec_gui_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help id_rec_gui

% Last Modified by GUIDE v2.5 28-May-2021 11:48:47

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
    'gui_Singleton',  gui_Singleton, ...
    'gui_OpeningFcn', @id_rec_gui_OpeningFcn, ...
    'gui_OutputFcn',  @id_rec_gui_OutputFcn, ...
    'gui_LayoutFcn',  [] , ...
    'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before id_rec_gui is made visible.
function id_rec_gui_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to id_rec_gui (see VARARGIN)

% Choose default command line output for id_rec_gui
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes id_rec_gui wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = id_rec_gui_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;


% --- Executes on button press in browse.
function browse_Callback(hObject, eventdata, handles)
% hObject    handle to browse (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global pathname filenames
[filenames,pathname]=uigetfile({'*.bmp;*.jpg;*.png;*.gif','All Image Files';'*.*','All Files' },'MultiSelect','on');
if ~isequal(filenames,0)
    init_controls(handles)
    preprocess(handles)
    process(handles)
end


function init_controls(handles)
global filenames current_select_idx
current_select_idx=1;
if ischar(filenames)
    filenames={filenames};
end
if ischar(filenames) || length(filenames)==1
    set(handles.img_idx,'String','')
    set(handles.img_idx_slider,'Visible','off')
else
    set(handles.img_idx_slider,'Visible','on')
    set(handles.img_idx_slider,'Min',0)
    set(handles.img_idx_slider,'Max',length(filenames)-1)
    set(handles.img_idx_slider,'SliderStep',ones(1,2)/(length(filenames)-1))
end
set(handles.validate,'Enable','on')


function [org_img,img_gray,thresh_value]=read_id_card(filename)
fileinfo=imfinfo(filename);
if strcmpi(fileinfo.ColorType,'indexed')
    [X,map]=imread(filename);
    org_img=ind2rgb(X,map);
else
    org_img=imread(filename);
end
r=size(org_img,1);
c=size(org_img,2);
size_thresh=2000;
if r>size_thresh
    org_img=imresize(org_img,size_thresh/r);
end
if c>size_thresh
    org_img=imresize(org_img,size_thresh/c);
end
org_img=im2double(org_img);
if ndims(org_img)==3
    img_gray=rgb2gray(org_img);
else
    img_gray=org_img;
end
img_gray=imresize(img_gray,[350 500]);
img_gray=img_gray(round(size(img_gray,1)*2/3):end,round(size(img_gray,2)/4):end);
thresh_value=.68*graythresh(img_gray);


function preprocess(handles)
global pathname filenames current_select_idx img_gray
if length(filenames)>1
    img_idx_str=sprintf('%d / %d',current_select_idx,length(filenames));
    set(handles.img_idx,'String',img_idx_str)
    set(handles.img_idx_slider,'Value',current_select_idx-1)
    set(handles.img_idx_slider,'TooltipString',img_idx_str)
end
try
    filename=fullfile(pathname,filenames{current_select_idx});
    [org_img,img_gray,thresh_value]=read_id_card(filename);
    axes(handles.img)
    imshow(org_img),title(filename,'Interpreter','None')
    set(handles.thresh_value,'Visible','on')
    set(handles.thresh_value,'value',thresh_value)
catch e
    msgbox(sprintf('Cannot read the image: %s.\n\n',filename,e.message),'Error','error')
    rethrow(e)
end


function process(handles)
global code_stats img_gray model filenames current_select_idx area_codes training_data_size
if isequal(filenames,0) || isempty(filenames)
    return
end

% init all controls
for i=1:18
    set(eval(sprintf('handles.result%d',i)),'BackgroundColor',[1 1 1])
    set(eval(sprintf('handles.result%d',i)),'Enable','Inactive')
    set(eval(sprintf('handles.result%d',i)),'String','')
end
set(handles.birthday,'BackgroundColor',[1 1 1])
set(handles.birthday,'String','')
set(handles.ID_code,'BackgroundColor',[1 1 1])
set(handles.ID_code,'String','')
set(handles.gender,'BackgroundColor',[1 1 1])
set(handles.gender,'String','')
set(handles.address,'BackgroundColor',[1 1 1])
set(handles.address,'String','')
set(handles.save_results,'Enable','off')

% process
thresh=get(handles.thresh_value,'value');
[id_codes,id_bw,code_stats,thresh,iteration]=id_rec_process(img_gray,model,thresh,training_data_size,1);
% if isempty(id_codes)
%     msgbox('Cannot recognize ID codes. You can try adjusting the threshold value.','Warning','warn','modal')
%     return
% end
Copy the code

3. Operation results