如何计算图像中的中心矩?

时间:2014-12-29 06:39:02

标签: matlab image-processing

我需要找到图像的中心时刻。中心时刻由下式给出:

其中xy是空间图像坐标,是平均值xy(或质心坐标,pq是整数,f(x,y)是图像。

此外,我想了解如何处理f(x,y)因为它将保留所有像素值。

2 个答案:

答案 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,这可能会更快。但是,如果您想要更具可读性且不使用的内容,则可以假设您的图片为灰度并存储在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生成具有相同图像大小的空间坐标网格,然后将坐标展开为单个向量。这样可以更轻松地计算时刻。最后一行代码最终按照等式计算我们的时刻。我们还需要以相同的方式展开图像,以便元素正确排列。