我需要找到图像的中心时刻。中心时刻由下式给出:
其中x
和y
是空间图像坐标,和是平均值x
和y
(或质心坐标,p
和q
是整数,f(x,y)
是图像。
此外,我想了解如何处理f(x,y)
因为它将保留所有像素值。
答案 0 :(得分:3)
使用bsxfun
sz = size( img ); %// assuming image is gray scale - 2D array
x = ( 1:sz(2) );
y = ( 1:sz(1) ).'; %'
x = x - mean(x);
y = y - mean(y);
Mpq = sum( reshape( bsxfun( @times, bsxfun( @times, img, x.^p ), y.^q ), [], 1 ) ); %// computing the p-q moment
基准:
disp('Solution of rayryeng')
tic
[rows, cols] = size(img);
[X, Y] = meshgrid(1:cols, 1:rows);
X = X(:);
Y = Y(:);
Mpq = sum((X - mean(X)).^p .* (Y - mean(Y)).^q .* img(:));
toc
disp('rayryeng with dot product');
tic
[rows, cols] = size(img);
[X, Y] = meshgrid(1:cols, 1:rows);
X = X(:);
Y = Y(:);
Mpq = ((X.' - mean(X)).^p )* ((Y - mean(Y)).^q .* img(:));
toc
disp('this solution - using bsxfun');
tic
sz = size( img ); %// assuming image is gray scale - 2D array
x = ( 1:sz(2) );
y = ( 1:sz(1) ).'; %'
x = x - mean(x);
y = y - mean(y);
Mpq = sum( reshape( bsxfun( @times, bsxfun( @times, img, x.^p ), y.^q ), [], 1 ) );
toc
导致
Solution of rayryeng
Elapsed time is 0.009426 seconds.
rayryeng with dot product
Elapsed time is 0.008374 seconds.
this solution - using bsxfun
Elapsed time is 0.001404 seconds.
正如您所看到的,bsxfun
明显快于基于meshgrid
的解决方案。此外,使用点积而不是使用sum
的elem-wise产品更快。
答案 1 :(得分:3)
f(x,y)
只是每个列位置y
和每个行位置x
的图像强度。如果你想计算你的图像的p-q时刻,你可以做Shai suggested,这可能会更快。但是,如果您想要更具可读性且不使用bsxfun的内容,则可以假设您的图片为灰度并存储在im
中,这样做就可以了:
[rows, cols] = size(im);
im = double(im); %// For precision
[X, Y] = meshgrid(1:cols, 1:rows);
X = X(:);
Y = Y(:);
Mpq = sum((X - mean(X)).^p .* (Y - mean(Y)).^q .* im(:));
首先,我们将图像转换为double
,以确保我们获得最佳精度。您的图像可能是uint8
类型,任何超过255的计算值都将被剪裁。您可能会获得超出此值的值,因此建议使用double
。然后,我们使用meshgrid
生成具有相同图像大小的空间坐标网格,然后将坐标展开为单个向量。这样可以更轻松地计算时刻。最后一行代码最终按照等式计算我们的时刻。我们还需要以相同的方式展开图像,以便元素正确排列。