BRIEF特征全稱:Binary Robust Independent Elementary Features。是一種能夠快速計算圖像特征描述符的方法,同樣能夠降低特征匹配的時間。
算法計算步驟如下:
1.首先對一張圖像計算其特征點,這里就用matlab自帶的harris角點檢測了,harris代碼細節可以參考這一篇博客。
2.對圖像進行高斯濾波,這里選用9*9矩陣,主要是為了去除隨機噪點。
3.以特征點為中心,取SxS的鄰域窗口。在窗口內隨機選取一對(兩個)點,比較二者像素的大小,進行如下二進制賦值。
其中,p(x),p(y)分別是隨機點x=(u1,v1),y=(u2,v2)的像素值。
4.選窗口內隨機點對的策略有以下五種方法,推薦第二種:
對應的鄰域隨機點對圖像如下(一條線段的兩個端點是一對):
5.最終就得到了多組二進制編碼,后續匹配可以利用編碼距離來確定特征點的相似度。
一定要注意的是后續匹配要選用相同的點對,所以這組點對是要保留的。
matlab代碼如下:
clear all; close all; clc; R = 48; %特征鄰域窗口直徑 K = 9; %高斯濾波半徑 N = 256; %特征位數 img=imread('lena.jpg'); imshow(img) [h,w]=size(img); p = detectHarrisFeatures(img); %系統自帶的檢測harris角點 p = p.Location; p = p(p(:,1)>R & p(:,1)<h-R & ... %將太靠近邊界的特征點去掉,避免鄰域隨機點越界 p(:,2)>R & p(:,2)<w-R,:); H=fspecial('gaussian',[K K],2); %高斯平滑 img=imfilter(img,H,'replicate'); s = normrnd(0,R/5,N,4); %生成鄰域中隨機點對GII figure; %顯示一下 for i=1:N plot(s(i,1:2),s(i,3:4)); hold on; end tao = zeros(length(p),N); for i=1:length(p) %生成所有特征點的brief描述子 px = floor(p(i,:) + s(:,1:2)); %懶得插值提亞像素值了,直接最鄰近 py = floor(p(i,:) + s(:,3:4)); for j=1:N if img(px(j,2),px(j,1)) < img(py(j,2),py(j,1)) tao(i,j) = 1; else tao(i,j) = 0; end end img(floor(p(i,2)),floor(p(i,1))) = 255; end figure; %顯示harris角點 imshow(img,[]) figure; %顯示一下描述子 imshow(tao,[])
結果如下:
原圖:
Harris特征點:
鄰域隨機點對,這里使用GII:
BRIEF描述子,這里可視化了:
參考:https://blog.csdn.net/hujingshuang/article/details/46910259