Skip to content

Commit 82d6833

Browse files
author
cristy
committed
git-svn-id: https://subversion.imagemagick.org/subversion/ImageMagick@14248 aa41f4f7-0bf4-0310-aa73-e5a19afd5a74
1 parent 8e50a4c commit 82d6833

File tree

1 file changed

+39
-35
lines changed

1 file changed

+39
-35
lines changed

branches/ImageMagick-6/magick/statistic.c

+39-35
Original file line numberDiff line numberDiff line change
@@ -1486,8 +1486,6 @@ MagickExport ChannelMoments *GetImageChannelMoments(const Image *image,
14861486
*channel_moments;
14871487

14881488
double
1489-
cx,
1490-
cy,
14911489
M00,
14921490
M01,
14931491
M02,
@@ -1500,6 +1498,12 @@ MagickExport ChannelMoments *GetImageChannelMoments(const Image *image,
15001498
M22,
15011499
M30;
15021500

1501+
MagickPixelPacket
1502+
pixel;
1503+
1504+
PointInfo
1505+
centroid;
1506+
15031507
ssize_t
15041508
y;
15051509

@@ -1527,6 +1531,7 @@ MagickExport ChannelMoments *GetImageChannelMoments(const Image *image,
15271531
M21=0.0;
15281532
M22=0.0;
15291533
M30=0.0;
1534+
GetMagickPixelPacket(image,&pixel);
15301535
/*
15311536
Compute center of mass (centroid).
15321537
*/
@@ -1547,19 +1552,15 @@ MagickExport ChannelMoments *GetImageChannelMoments(const Image *image,
15471552
indexes=GetVirtualIndexQueue(image);
15481553
for (x=0; x < (ssize_t) image->columns; x++)
15491554
{
1550-
MagickPixelPacket
1551-
pixel;
1552-
1553-
GetMagickPixelPacket(image,&pixel);
15541555
SetMagickPixelPacket(image,p,indexes+x,&pixel);
15551556
M00+=QuantumScale*pixel.red;
15561557
M10+=x*QuantumScale*pixel.red;
15571558
M01+=y*QuantumScale*pixel.red;
15581559
p++;
15591560
}
15601561
}
1561-
cx=M10/M00;
1562-
cy=M01/M00;
1562+
centroid.x=M10/M00;
1563+
centroid.y=M01/M00;
15631564
/*
15641565
Compute the image moments.
15651566
*/
@@ -1580,19 +1581,16 @@ MagickExport ChannelMoments *GetImageChannelMoments(const Image *image,
15801581
indexes=GetVirtualIndexQueue(image);
15811582
for (x=0; x < (ssize_t) image->columns; x++)
15821583
{
1583-
MagickPixelPacket
1584-
pixel;
1585-
1586-
GetMagickPixelPacket(image,&pixel);
15871584
SetMagickPixelPacket(image,p,indexes+x,&pixel);
1588-
M11+=(x-cx)*(y-cy)*QuantumScale*pixel.red;
1589-
M20+=(x-cx)*(x-cx)*QuantumScale*pixel.red;
1590-
M02+=(y-cy)*(y-cy)*QuantumScale*pixel.red;
1591-
M21+=(x-cx)*(x-cx)*(y-cy)*QuantumScale*pixel.red;
1592-
M12+=(x-cx)*(y-cy)*(y-cy)*QuantumScale*pixel.red;
1593-
M22+=(x-cx)*(x-cx)*(y-cy)*(y-cy)*QuantumScale*pixel.red;
1594-
M30+=(x-cx)*(x-cx)*(x-cx)*QuantumScale*pixel.red;
1595-
M03+=(y-cy)*(y-cy)*(y-cy)*QuantumScale*pixel.red;
1585+
M11+=(x-centroid.x)*(y-centroid.y)*QuantumScale*pixel.red;
1586+
M20+=(x-centroid.x)*(x-centroid.x)*QuantumScale*pixel.red;
1587+
M02+=(y-centroid.y)*(y-centroid.y)*QuantumScale*pixel.red;
1588+
M21+=(x-centroid.x)*(x-centroid.x)*(y-centroid.y)*QuantumScale*pixel.red;
1589+
M12+=(x-centroid.x)*(y-centroid.y)*(y-centroid.y)*QuantumScale*pixel.red;
1590+
M22+=(x-centroid.x)*(x-centroid.x)*(y-centroid.y)*(y-centroid.y)*
1591+
QuantumScale*pixel.red;
1592+
M30+=(x-centroid.x)*(x-centroid.x)*(x-centroid.x)*QuantumScale*pixel.red;
1593+
M03+=(y-centroid.y)*(y-centroid.y)*(y-centroid.y)*QuantumScale*pixel.red;
15961594
p++;
15971595
}
15981596
}
@@ -1612,26 +1610,32 @@ MagickExport ChannelMoments *GetImageChannelMoments(const Image *image,
16121610
*/
16131611
channel_moments[RedChannel].I[0]=M20+M02;
16141612
channel_moments[RedChannel].I[1]=(M20-M02)*(M20-M02)+4.0*M11*M11;
1615-
channel_moments[RedChannel].I[2]=(M30-3.0*M12)*(M30-3.0*M12)+(3.0*M21-M03)*
1616-
(3.0*M21-M03);
1613+
channel_moments[RedChannel].I[2]=(M30-3.0*M12)*(M30-3.0*M12)+
1614+
(3.0*M21-M03)*(3.0*M21-M03);
16171615
channel_moments[RedChannel].I[3]=(M30+M12)*(M30+M12)+(M21+M03)*(M21+M03);
16181616
channel_moments[RedChannel].I[4]=(M30-3.0*M12)*(M30+M12)*((M30+M12)*
1619-
(M30+M12)-3.0*(M21+M03)*(M21+M03))+(3.0*M21-M03)*(M21+M03)*(3.0*(M30+M12)*
1620-
(M30+M12)-(M21+M03)*(M21+M03));
1621-
channel_moments[RedChannel].I[5]=(M20-M02)*((M30+M12)*(M30+M12)-(M21+M03)*
1622-
(M21+M03))+4.0*M11*(M30+M12)*(M21+M03);
1617+
(M30+M12)-3.0*(M21+M03)*(M21+M03))+(3.0*M21-M03)*(M21+M03)*
1618+
(3.0*(M30+M12)*(M30+M12)-(M21+M03)*(M21+M03));
1619+
channel_moments[RedChannel].I[5]=(M20-M02)*((M30+M12)*(M30+M12)-
1620+
(M21+M03)*(M21+M03))+4.0*M11*(M30+M12)*(M21+M03);
16231621
channel_moments[RedChannel].I[6]=(3.0*M21-M03)*(M30+M12)*((M30+M12)*
1624-
(M30+M12)-3.0*(M21+M03)*(M21+M03))-(M30-3*M12)*(M21+M03)*(3.0*(M30+M12)*
1625-
(M30+M12)-(M21+M03)*(M21+M03));
1622+
(M30+M12)-3.0*(M21+M03)*(M21+M03))-(M30-3*M12)*(M21+M03)*
1623+
(3.0*(M30+M12)*(M30+M12)-(M21+M03)*(M21+M03));
16261624
channel_moments[RedChannel].I[7]=M11*((M30+M12)*(M30+M12)-(M03+M21)*
16271625
(M03+M21))-(M20-M02)*(M30+M12)*(M03+M21);
1628-
channel_moments[RedChannel].centroid.x=cx;
1629-
channel_moments[RedChannel].centroid.y=cy;
1630-
channel_moments[RedChannel].ellipse_axis.x=0.0;
1631-
channel_moments[RedChannel].ellipse_axis.y=0.0;
1632-
channel_moments[RedChannel].ellipse_angle=0.0;
1633-
channel_moments[RedChannel].ellipse_eccentricity=0.0;
1634-
channel_moments[RedChannel].ellipse_intensity=0.0;
1626+
channel_moments[RedChannel].centroid=centroid;
1627+
channel_moments[RedChannel].ellipse_axis.x=sqrt((2.0/M00)*((M20+M02)+
1628+
sqrt(4.0*M11*M11+(M20-M02)*(M20-M02))));
1629+
channel_moments[RedChannel].ellipse_axis.y=sqrt((2.0/M00)*((M20+M02)-
1630+
sqrt(4.0*M11*M11+(M20-M02)*(M20-M02))));
1631+
channel_moments[RedChannel].ellipse_angle=RadiansToDegrees(0.5*atan(2.0*M11/
1632+
(M20-M02)));
1633+
channel_moments[RedChannel].ellipse_eccentricity=sqrt(1.0-(
1634+
channel_moments[RedChannel].ellipse_axis.y/
1635+
channel_moments[RedChannel].ellipse_axis.x));
1636+
channel_moments[RedChannel].ellipse_intensity=M00/(MagickPI*
1637+
channel_moments[RedChannel].ellipse_axis.x*
1638+
channel_moments[RedChannel].ellipse_axis.y);
16351639
if (y < image->rows)
16361640
channel_moments=(ChannelMoments *) RelinquishMagickMemory(channel_moments);
16371641
return(channel_moments);

0 commit comments

Comments
 (0)