資源簡介
SIFT基于特征點配準算法的matlab實現,可以直接運行,運行方法參見run_demo; SIFT是一種經典算法,原理可查看wiki

代碼片段和文件信息
function?descriptors?=?do_descriptor(octave?...?%?一組的高斯尺度空間
??????????????????????????????????????oframes?...??%?frames?包含關鍵點相關的尺度和主方向
??????????????????????????????????????sigma0?...???%?基本?sigma?值
??????????????????????????????????????S?...????????%?該組的尺度層數
??????????????????????????????????????smin?...?????
??????????????????????????????????????varargin)
for?k=1:2:length(varargin)
switch?lower(varargin{k})
??????case?‘magnif‘
????????magnif?=?varargin{k+1}?;
????????
??????case?‘numspatialbins‘
????????NBP?=?varargin{k+1}?;??
????????
??????case??‘numorientbins‘
????????NBO?=?varargin{k+1}?;???
????????
??????otherwise
????????error([‘Unknown?parameter?‘?varargin{k}?‘.‘])?;
?????end
end?
??????
???????????????????????????????
num_spacialBins?=?NBP;
num_orientBins?=?NBO;
key_num?=?size(oframes?2);
%?計算該圖的向量和方向
[M?N?s_num]?=?size(octave);?%?M?是圖像的高度?N?是圖像的寬度;?num_level?is?the?number?of?scale?level?of?the?octave
descriptors?=?[];
magnitudes?=?zeros(M?N?s_num);
angles?=?zeros(M?N?s_num);
%?compute?image?gradients
for?si?=?1:?s_num
????img?=?octave(::si);
????dx_filter?=?[-0.5?0?0.5];
????dy_filter?=?dx_filter‘;
????gradient_x?=?imfilter(img?dx_filter);
????gradient_y?=?imfilter(img?dy_filter);
????magnitudes(::si)?=sqrt(?gradient_x.^2?+?gradient_y.^2);
%?????if?sum(?gradient_x?==?0)?>?0
%?????????fprintf(‘00‘);
%?????end
????angles(::si)?=?mod(atan(gradient_y?./?(eps?+?gradient_x))?+?2*pi?2*pi);
end
x?=?oframes(1:);
y?=?oframes(2:);
s?=?oframes(3:);
%?round?off
x_round?=?floor(oframes(1:)?+?0.5);
y_round?=?floor(oframes(2:)?+?0.5);
scales?=??floor(oframes(3:)?+?0.5)?-?smin;
for?p?=?1:?key_num??%對各個關鍵點處理
????s?=?scales(p);
????xp=?x_round(p);
????yp=?y_round(p);
????theta0?=?oframes(4p);%關鍵點的主方向
????sinth0?=?sin(theta0)?;
????costh0?=?cos(theta0)?;
????sigma?=?sigma0?*?2^(double?(s?/?S))?;
????SBP?=?magnif?*?sigma;
????%W?=??floor(?sqrt(2.0)?*?SBP?*?(NBP?+?1)?/?2.0?+?0.5);
????W?=???floor(?0.8?*?SBP?*?(NBP?+?1)?/?2.0?+?0.5);
????
????descriptor?=?zeros(NBP?NBP?NBO);
????
????%?within?the?big?square?select?the?pixels?with?the?circle?and?put?into
????%?the?histogram.?no?need?to?do?rotation?which?is?very?expensive
????%在大正方形中用高斯加權圓選擇像素點放入方向直方圖中,不需要做昂貴的圖像旋轉
????for?dxi?=?max(-W?1-xp):?min(W?N?-2?-?xp)
????????for?dyi?=?max(-W?1-yp)?:?min(+W?M-2-yp)
????????????mag?=?magnitudes(yp?+?dyi?xp?+?dxi?s);?%?當前點(yp?+?dyi?xp?+?dxi)的梯度幅值
????????????angle?=?angles(yp?+?dyi?xp?+?dxi?s)?;??%?當前點(yp?+?dyi?xp?+?dxi)的梯度幅角
%???????????angle?=?mod(-angle?+?theta0?2*pi);??????%?用關鍵點的主方向調整角度?并且?mod?it?with?2*pi
????????????angle?=?mod(angle?-?theta0?2*pi);
?????????????dx?=?double(xp?+?dxi?-?x(p));????????????%?x(p)?是關鍵點的精確位置?(浮點數).?dx?相對于該關鍵點當前像素的位置
????????????dy?=?double(yp?+?dyi?-?y(p));????????????%?dy?相對于該關鍵點當前像素的位置
????????????
????????????nx?=?(?costh0?*?dx?+?sinth0?*?dy)?/?SBP?;?%?nx?是旋轉(dx?dy)后的規格化位置?with?the?major?orientation?angle.?this?tells?which?x-axis?spatial?bin?the?pixel?falls?in?
????????????ny?=?(-sint
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2019-02-17?18:18??dosift\
?????文件????????5412??2013-03-14?16:27??dosift\do_desc
?????文件?????????464??2013-03-14?16:27??dosift\do_diffofg.m
?????文件????????4322??2013-03-14?16:27??dosift\do_extrefine.m
?????文件????????2964??2013-03-14?16:27??dosift\do_gaussian.m
?????文件????????2133??2013-03-14?16:27??dosift\do_localmax.m
?????文件????????2505??2013-03-14?16:27??dosift\do_orientation.m
?????文件????????3838??2013-03-14?16:27??dosift\do_sift.m
?????文件?????????378??2019-02-17?18:24??dosift\run_demo.m
?????文件?????????215??2013-03-14?16:27??dosift\smooth.m
- 上一篇:數字圖像處理圖像壓縮MATLAB程序及仿真
- 下一篇:matlab解N維方程組的代碼
評論
共有 條評論