一、簡介
1.模板匹配基本原理概述
當我們比較兩幅影像的時候,首先面對的基本問題是:什么時候兩幅影像才是一樣或比較相似的,這兩幅影像的相似程度如何衡量?當然,比較一般的方法是,當兩幅影像的所有像素灰度值一樣的時候,我們認為這樣幅圖是一樣的,這種比較方法在某些特定的應用領域是可行的,比如在恒定光斬訓境和相機內部環境下,檢測連續兩幀影像的變化,簡單的比較像素之間的差值在大多數應用場合下是不太合適的,噪聲、量化誤差、微小的光照變化、極小的平移或旋轉在兩幅影像像素簡單差值的時候將產生較大的像素差值,但是人眼觀察看來,兩幅影像仍然是一樣的,顯然,人類知覺能夠感應更為廣泛的相似性內容,即使在單個像素差值較大的情況下,也能夠利用諸如結構和影像內容來識別兩幅影像的相似性,在結構或語意層面比較影像是一個比較困難的問題,同時也是一個比較有趣的研究領域,
在這我們介紹的是一種在像素層面相對簡單的影像比較方法,即在一幅較大影像定位一幅給定的子影像-----模板影像,即通常所說的模板匹配,這種情況經常發生,比如在一個影像場景中定位一個特定的物體,或者是在影像序列中追蹤最某些特定模式,模板匹配的基本原理很簡單:在待搜尋的影像中,移動模板影像,在每一個位置測量待搜尋影像的子影像和模板影像的差值,當相似度達到最大時,記錄其相應的位置,但實際情況卻不是這么簡單,如何選取合適的距離測量方法?當亮度或對比度改變時應該如何處理?匹配中總的距離差值為多少才可以被認為是相似度比較高?這些問題都需要根據實用情況加以考慮,
以上影像都“相同”嗎?在原始影像(a)和其他五幅影像(b-f)中,簡單的比較影像像素間的差值將會得到較大的距離值,
模板匹配的基本原理,以兩幅影像的原點為參考點,參考影像R在待搜尋的影像I中平移(r,s)個單位,待搜尋影像的大小和模板影像的大小確定的最大的搜尋區域,
2.灰度影像中的模板匹配
灰度影像中的模板匹配,主要是找到模板影像R和搜尋影像I中的子影像相同或最相似的位置,以下式子表示模板在原始影像偏移(r,s)單位,
參考影像R分別在水平方法和豎直方向平移r和s個單位,那么模板匹配的問題可以概述為:
給定搜尋影像I和模板影像R,找到平移后的參考影像以及搜尋影像中所對應的子影像相似度最大的位置,
2.1影像匹配中的距離函式
模板匹配中最重要的是找到一種對灰度和對比度變化具有較好魯棒性的相似度測量函式,
為了測量影像間的相似度程度,我們計算每一次平移(r,s)后的參考影像和搜尋影像中所對應的子影像的“距離”d(r,s)(如下圖所示),二維灰度影像中的測量函式有如下基本的幾種:
二維影像中距離測量函式的表示
Sum ofabsolute differences:
Maximumdifference:
Sum ofsquared differences:
由于SSD函式的特性,在統計和最優化領域被經常用到,為了找到參考影像在搜尋影像中的最佳匹配位置,只要使得SSD函式取得最小值即可,即
上式中的B是參考影像中所有像素灰度值的平方和,是一個常量(獨立于r,s)因此在計算其最小值的時候可以忽略,A(r,s)表示的是搜尋影像在(r,s)的子影像中所有像素灰度值的平方和,C(r,s)即稱為搜尋影像和參考影像的線性互相關函式,通常可以表示為:
當R 和I超出邊界時,其值為零,故上式亦可表示為:
如果我們假設A(r,s)在搜尋影像中是一個常量,那么SSD中計算其最佳匹配位置的時候,其值是可以忽略的,且當C(r,s)取得最大值的時候,參考影像和搜尋影像中的子影像最相似,這種情況下,SSD的最小值可以通過計算C(r,s)的最大值獲得,
2.2歸一化的互相關
實際應用當中,上述假定A(r,s)為一常量并不總是成立,因此,上述的互相關的結果將隨著搜尋影像中像素灰度值的改變而產生較大變化,歸一化的互相關把參考影像和當前的子影像的能量考慮進去:
當參考影像和搜尋影像子影像灰度值都是正數的時候,Cn(r,s)的值總是為[0,1]范圍內,與影像其他像素灰度值無關,當Cn(r,s)等于1時,表明在平移位置(r,s),參考影像和子影像達到最大相似度;相反,當Cn(r,s)等于0時,表明在平移位置(r,s),參考影像和子影像完全不匹配,當子影像中的所有灰度值改變時,歸一化的互相關Cn(r,s)也會極大的改變,
2.2相關系數
為了解決上述問題,我們引入子影像和模板影像中的灰度平均值,上述歸一化函式可以改寫為:
子影像和參考影像平均值分別定義為:
其中,K表示參考影像中像素的數量,在統計學中,上述運算式被稱為相關系數,然而,與統計學中作為全域測量方法不同的是,CL(r,s)被定義是一個區域的測量函式,CL(r,s)的值域范圍為[-1,1],當CL(r,s)等于1時,表明在平移位置(r,s),參考影像和子影像達到最大相似度;相反,當CL(r,s)等于0時,表明在平移位置(r,s),參考影像和子影像完全不匹配,運算式:
表示的是K倍模板影像R中像素灰度值方差,這是一個常量,只需要計算一次即可,由于方差存在如下關系:(具體可參考http://imagej.net/Integral_Image_Filters)
具體推到如下所示:
因此,可以SR改寫為
帶入到CL(r,s),可得:
由此,可得到一個高效的計算相關系數的方法,
二、源代碼
% clear
addpath(genpath(pwd)); %添加子檔案夾下的所有檔案
%%加載影像
start=6212;
% state=num+1;
% start=6540;
state=1;
% for num = state:294
close all
num = 1 ; %讀取檔案夾下的第num張圖片
% 20
%
fname=['樣本庫\IMG_',num2str(start+num),'.jpg'];
% 有三個車牌檔案夾:'PlateImages/%d.jpg' 或者'PlateImages/Image1/%d.jpg' 或'PlateImages/Image2/%d.jpg'
filename = fullfile(pwd, fname);
Img = imread(filename);
%{
figure(5);
subplot(2,2,1);imshow(Img);title('原圖');I1=rgb2gray(Img);
subplot(2,2,2);imshow(I1);title('灰度圖');
subplot(2,2,3);imhist(I1);title('灰度圖直方圖');I2=edge(I1,'roberts',0.15,'both');
subplot(2,2,4);imshow(I2);title('roberts算子邊緣檢測')
se=[1;1;1];
I3=imerode(I2,se);
figure(6);
subplot(2,2,1);imshow(I3);title('腐蝕后影像');se=strel('rectangle',[25,25]);I4=imclose(I3,se);
subplot(2,2,2);imshow(I4);title('平滑影像的輪廓');I5=bwareaopen(I4,2000);
subplot(2,2,3);imshow(I5);title('從物件中移除小物件');
%}
GetDB;
%% 定位車牌
% 定位車牌:找出車牌在原始圖片中的位置
% 輸入引數Img: 讀取的原始真彩色影像資訊
% 輸出引數plate:經過定位處理后,從原始真彩色影像(會進行壓縮處理)截取到的車牌位置處的真彩色影像資訊
plate = Pre_Process(Img);
%% 傾斜校正
% 傾斜校正:對待識別數字的傾斜校正,分別使用Radon變換和仿射函式處理水平傾斜校正和垂直傾斜校正
% 輸入引數:plate為定位截取的真彩色車牌影像資訊
% 輸出引數:
plate = radon_repair(plate);
%% 車牌濾波
% 車牌濾波:剔除(像素值置0)車牌圖片的邊界影像資訊
% 輸入引數:plate為定位截取的真彩色車牌影像資訊
% 輸出引數:d為原始車牌影像濾波(即剔除上下邊界外(和使用多邊形區域剔除))后的圖片,p為真彩色原始車牌影像plate逆時針旋轉后的圖片
[d, p] = Plate_Process(plate,fname);
%% 分割車牌
% 分割車牌:裁掉(洗掉)車牌影像資訊的邊界
% 輸入引數:d為原始車牌影像濾波(即剔除上下邊界外(和使用多邊形區域剔除))后的圖片,p為真彩色原始車牌影像plate逆時針旋轉后的圖片
% 輸出引數:根據影像d的非0邊界,裁剪出的輸入圖片:輸入圖片d裁剪后輸出圖片e,輸入圖片p裁剪后輸出圖片p
[e, p] = Segmation(d, p);
%% 去除噪聲
function [result, plate] = Plate_Process(plate, fname, flag)
% 分割步驟
if nargin < 3
flag = 1;
end
% n = ndims(A) returns the number of dimensions in the array A.
if ndims(plate) == 3
% I = rgb2gray(RGB) converts the truecolor image RGB to the grayscale intensity image I.
% rgb2gray converts RGB images to grayscale by eliminating the hue and saturation information while retaining the luminance.
plate1 = rgb2gray(plate); % 將車牌原始圖片資訊轉換成grayscale intensity image(灰度影像?為方便,下面都稱為灰度影像)
else
plate1 = plate;
end
Im = plate1; % Im為灰度影像
plate = double(plate);
% B = mean2(A) computes the mean of the values in A.
% b = std2(A) computes the standard deviation of the values in A.
% 求出當前圖片的[均值 標準差]矩陣,用于和資料庫的[均值 標準差]矩陣進行計算,然后找出最適合用于處理當前圖片的資料庫引數資訊
m = [mean2(plate(:,:,1)) mean2(plate(:,:,2)) mean2(plate(:,:,3)) std2(plate(:,:,1)) std2(plate(:,:,2)) std2(plate(:,:,3))];
% f = fullfile(filepart1,...,filepartN) builds a full file specification, f, from the folders and file names specified.
% f = fullfile('myfolder','mysubfolder','myfile.m') ===> f = myfolder\mysubfolder\myfile.m
load('model.mat');
ms = cat(1, M.m); % 資料庫中的[均值 標準差]矩陣
% B = repmat(A,m,n) creates a large matrix B consisting of an m-by-n tiling of copies of A.
% The size of B is [size(A,1)*m, (size(A,2)*n]. The statement repmat(A,n) creates an n-by-n tiling.
m = repmat(m, size(ms, 1), 1); % 將當前圖片的[均值 標準差]矩陣進行拓展,以便進行與資料庫[均值 標準差]矩陣運算
% B = sum(A,dim) sums along the dimension of A specified by scalar dim. The dim input is an integer value from 1 to N,
% where N is the number of dimensions in A. Set dim to 1 to compute the sum of each column, 2 to sum rows, etc.
% 按行求和
dis = sum((m - ms).^2, 2); % 當前圖片[均值 標準差]矩陣與資料庫[均值 標準差]矩陣的方差
[~, id] = min(dis); % 找出方差最小的那個,也就是說,找出最適合用于處理當前圖片的資料庫引數
if fname(6)=='s'
ro = M(id).ro; % 圖片旋轉的角度引數,單位為度
else
ro=0;
end
th = M(id).th; % 將灰度影像轉換為二進制影像的門限,灰度影像中的值大于該門限則轉換為1,否則轉換為0
pts = M(id).pts; % 定義圖片的頂點
% B = imrotate(A,angle,method) rotates image A by angle degrees in a counterclockwise direction around its
% center point, using the interpolation method specified by method.
Im = imrotate(Im, ro, 'bilinear'); % 將灰度圖片Im按照逆時針方向,旋轉ro度,插值方法選擇雙線性插值
plate = imrotate(plate, ro, 'bilinear'); % 將車牌原始影像,也按照逆時針方向,旋轉ro度,插值方法選擇雙線性插值
% BW = im2bw(I, level) converts the grayscale image I to a binary image.
% The output image BW replaces all pixels in the input image with luminance(亮度) greater than level with the value 1 (white)
% and replaces all other pixels with the value 0 (black). Specify level in the range [0,1]. This range is relative to
% the signal levels possible for the image's class. Therefore, a level value of 0.5 is midway between black and white, regardless of class.
bw = im2bw(Im, th); % 將灰度影像Im轉換成二進制影像,轉換門限為th
% h = fspecial('average', hsize) returns an averaging filter h of size hsize.
% The argument hsize can be a vector specifying the number of rows and columns in h, or it can be a scalar, in which case h is a square matrix.
h = fspecial('average', 2); % 定義一個多維均值濾波器h,維度為2 x 2
% B = imfilter(A,h) filters the multidimensional array A with the multidimensional filter h.
% The array A can be logical or a nonsparse numeric array of any class and dimension. The result B has the same size and class as A.
% ___= imfilter(___,options,...) performs multidimensional filtering according to the specified options.
% 'replicate' ===> Input array values outside the bounds of the array are assumed to equal the nearest array border value.
bw1 = imfilter(bw, h, 'replicate'); % 使用多維均值濾波器h,對二進制影像bw進行濾波,濾波選項為replicate
% mask = Mask_Process(bw1); % 此方法功能是去除bw1影像的上下雜線,即使用特定演算法,剔除二進制影像bw1的上下邊界處的資訊(這些行的像素值全設為0)
% 此處的mask可理解為:如果影像像素點在雜線上邊界與車牌上邊界之間或雜線下邊界與車牌下邊界之間,則這個像素點的值為0,
% 否則,如果影像像素點在雜線上邊界和雜線下邊界之間,則這個像素點的值為1
% bw2 = bw1 .* mask; % 這個.*操作可理解為:與運算,這樣bw2就是利用mask矩陣剔除二進制影像bw1中干擾后的結果
bw2 = bw1;
% 除了通過Mask_Process()函式剔除雜線外,如果有定義車牌邊界資訊,則可進一步使用車牌邊界資訊進行影像處理
% if ~isempty(pts) % 如果pts不空(即,有外部邊界頂點定義),則執行
% % BW = roipoly(I, c, r) returns the region of interest(ROI) specified by the polygon(多邊形) described by vectors c and r,
% % which specify the column and row indices of each vertex(頂點), respectively. c and r must be the same size.
% % 根據二進制圖片bw2,以及多邊形的頂點pts(:, 1), pts(:, 2),得到二進制影像mask,頂點圍起來的區域的值全為1,
% % 其它區域的值全為0,這樣做的目的是剔除車牌邊界的干擾
% mask = roipoly(bw2, pts(:, 1), pts(:, 2)); % 得到一個由pts頂點(可組成多邊形)指定的二進制邊界影像
% bw1 = bw1 .* mask; % bw1是只使用多邊形剔除干擾后的二進制影像
% bw2 = bw2 .* mask; % bw2是使用Mask_Process()演算法和多邊形兩種方法剔除干擾后的二進制影像
% end
三、運行結果






轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/292389.html
標籤:其他
上一篇:函式堆疊幀 :區域變數的創建與銷毀? 函式的呼叫? 傳參的形式?
下一篇:2021華數杯數學建模B題思路
