如果我有一个凸多边形顶点,那么我的图像面积计算就不会由标准公式得出准确的结果。
(为简单起见)如果我有3x3的正方形,并且顶点为(1,1)(1,3)(3,3)(3,1)
通过此处描述的多边形面积计算方法
然后将总和除以2得到面积。
因此,对于上述3 x 3数据,我们将面积设为4而不是9。
发生这种情况是因为顶点不是点而是像素。
这是相应的代码。坐标是循环的。
int X[] = { 1, 1, 3, 3, 1};
int Y[] = { 1, 3, 3, 1, 1};
double Sum1 = 0;
double Sum2 = 0;
int numElements = 5;
for (int k = 0; k < numElements-1; k++)
{
Sum1 += X[k] * Y[k + 1];
Sum2 += Y[k] * X[k + 1];
}
double area = std::abs((double)(Sum1 - Sum2))/2;
对于正方形,我们可以对宽度和高度进行+1并获得正确的面积。但是图像中的不规则多边形呢?我希望这个问题有意义。
可以通过以下步骤计算面积:
1)获取顶点之间的像素
2)按x坐标(或y坐标)对像素进行排序
3)取特定x (或y)值的最小和最大y坐标(或x)之间的差并将其加一
4)总结总差异
注意:该区域可能会有所不同(如果多边形中有倾斜的边缘),具体取决于所选择的线条绘制方法
int compare(const void * a, const void * b)
{
return (((Point*)a)->x() - ((Point*)b)->x());
}
double CalculateConvexHullArea(vector<int> ConvexHullX, vector<int> ConvexHullY)
{
float Sum1 = 0;
float Sum2 = 0;
std::vector<Point> FillPoints;
for (int k = 0; k < ConvexHullX.size() - 1; k++)
{
drawLine(ConvexHullX[k], ConvexHullX[k+1], ConvexHullY[k], ConvexHullY[k+1], FillPoints);
}
//sorting coordinates
qsort(FillPoints.data(), FillPoints.size(), sizeof(Point), compare);
double area = 0;
int startY = FillPoints[0].y(), endY = FillPoints[0].y();
int currX = FillPoints[0].x();
// traversing x and summing up diff of min and max Y
for (int cnt = 0; cnt < FillPoints.size(); cnt++)
{
if (FillPoints[cnt].x() == currX)
{
startY = startY > FillPoints[cnt].y() ? FillPoints[cnt].y() : startY;
endY = endY < FillPoints[cnt].y() ? FillPoints[cnt].y() : endY;
}
else
{
int diffY = endY - startY + 1;
area += diffY;
currX = FillPoints[cnt].x();
startY = endY = FillPoints[cnt].y();
}
}
return area + endY - startY + 1;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句