-3

コードと関数の処理方法を理解していません..

関数宣言を詳しく説明できますか

fun = @(img) susanFun(img);
map = nlfilter(img,maskSz,fun);

また、スーザンコーナー検出器には、「tとg」の2つのしきい値しかありません..しかし、ここには「thGeo、thGeo1、thGeo2、thT、thT1」があります

ここで採用されている方法を理解できません。

function [ map r c ] = susanCorner( img )
%SUSAN Corner detection using SUSAN method.
%   [R C] = SUSAN(IMG)  Rows and columns of corner points are returned.


maskSz = [7 7];
fun = @(img) susanFun(img);
map = nlfilter(img,maskSz,fun);
[r c] = find(map);

end

function res = susanFun(img)
% SUSANFUN  Determine if the center of the image patch IMG
%   is corner(res = 1) or not(res = 0)


mask = [...
    0 0 1 1 1 0 0
    0 1 1 1 1 1 0
    1 1 1 1 1 1 1
    1 1 1 1 1 1 1
    1 1 1 1 1 1 1
    0 1 1 1 1 1 0
    0 0 1 1 1 0 0];

% uses 2 thresholds to distinguish corners from edges
thGeo = (nnz(mask)-1)*.2;
thGeo1 = (nnz(mask)-1)*.4;
thGeo2 = (nnz(mask)-1)*.4;
thT = .07;
thT1 = .04;

sz = size(img,1);
usan = ones(sz)*img(round(sz/2),round(sz/2));

similar = (abs(usan-img)<thT);
similar = similar.*mask;
res = sum(similar(:));
if res < thGeo
    dark = nnz((img-usan<-thT1).*mask);
    bright = nnz((img-usan>thT1).*mask);
    res = min(dark,bright)<thGeo1 && max(dark,bright)>thGeo2;

else
    res = 0;
end

end
4

1 に答える 1

0
fun = @(img) susanFun(img);
map = nlfilter(img,maskSz,fun);

意味

  • fun関数へのハンドル (またはポインター) です。
  • @(img)sayfunは という引数を取りますimg
  • susanFun(img)の本体ですfun

nlfilter関数ハンドルが渡され、funそれを呼び出すことができます。実際には、画像の各 7x7 スライド ブロックとしてfunパラメーターを適用します。ここで名前がオーバーロードされていることに注意してください。これは、画像を保持する変数の名前であり、のパラメーターの名前です。imgimgimgfun

関数ハンドル (@)を参照

于 2013-11-03T13:55:49.477 に答える