如果需要,您可以参考this article中的 4.3.1 部分。
如果pI
是此图片上的任何像素/强度,并且dS
是Hough Space中该行的(rho, theta)
,则以下语句的含义是什么吗
以下是正确的实施吗?
function val = gaussC(pI, sigma, dS)
x = pI(1);
y = pI(2);
rho = dS(1);
theta = dS(2);
exponent = ((x-rho).^2 + (y-theta).^2)./(2*sigma);
val = (exp(-exponent));
end
修改
我的第二个提案,
I = gray_imread('Scratch1.png');
dimesnsion = 5;
sigma = 1;
pI = [22, 114];
dS = [-108, -80];
J = get_matrix_from_image(I, pI, dimension);
var = normpdf(J(:), dS(2), sigma);
get_matrix_from_image.m
function mat = get_matrix_from_image(input_image, ctr_point, dimension)
[height, width] = size(input_image);
col_count = width;
row_count = height;
xxx = col_count;
yyy = row_count;
if(ctr_point(1) < 1 && ctr_point(2) < 1)
mat = zeros(dimension, dimension);
else
x = ctr_point(1);
y = ctr_point(2);
start_x = x - floor(dimension/2);
end_x = start_x + dimension - 1;
start_y = y - floor(dimension/2);
end_y = start_y + dimension - 1;
if(start_x > xxx || end_x>xxx || start_y > yyy || end_y>yyy || ...
start_x < 1 || end_x<1 || start_y <1 || end_y<1)
mat = zeros(dimension, dimension);
else
mat = input_image(start_x:end_x, start_y:end_y);
end
end
end
答案 0 :(得分:16)
不完全。基本上你是从here手动编码公式(9)。然后:
...
exponent = ((x-rho).^2 + (y-theta).^2)./(2*sigma^2); % sigma is also squared
val = exp(-exponent); % superfluous bracket removed
val = val./(2*pi*sigma^2); % you also forgot the denominator part
end
当然,你可以把整个事情写得更有效率。但除非你真的想在很多数据上使用这个公式,否则我会保持这样(它非常易读)。
如果您重视性能,只需使用内置函数:
val = normpdf(pI,dS,sigma)
对于这个问题的新读者:OP在重新编辑之后重新打开了这个问题,完全改变了问题的本质。因此,这个答案现在看起来有点过时了。
答案 1 :(得分:9)
您的代码是正态分发的PDF的错误实现。正态分布的PDF是:
IMO pI
由x
和y
定义,pI(x,y)
,dS
由rho
和{{1}定义},即theta
,您不能简单地从dS(rho,theta)
和rho
中x
减去theta
。你必须将其中一个转换为另一个。在我的代码中,我已将y
转换为dS(rho,theta)
,然后在PDF的公式中将其用作dS(x,y)
。
此外,我认为μ
将是一个包含5行和2列(带有x和y值的5个像素)的矩阵,根据下图显示这一点,这是图6 链接研究:
现在来到声明,
g(p i ,d s )是一个高斯函数,经过评估 在p i 中,具有与检测到的对应的峰值 划痕方向d s 和恒定的标准偏差。
IMO该论文的作者建议采用5个像素,计算PDF并找出峰值的位置。
根据我的理解,其实施应该是:
pI
计算PDF后,找到峰值。