假设我有一个 RGB 位图图像 I。 我想获得多个顶点为 A、B 和 C 的随机三角形的平均颜色。 A、B和C都保证在图像I的范围内,但不保证是整数值。 如何有效地获取该区域的平均颜色?
获得近似估计的一个非常简单的方法是获取三角形的边界框,然后迭代每一行,保持彩色像素数量和每个通道总和的运行计数,然后在最后除以。 (这还有一个优点,可以让您预先计算各个行的总和,这在您有大量三角形 T 需要计算时非常有用。)但是,这对于非常大的三角形来说是最准确的;三角形越小,三角形中的最小角度越小,我们遇到的仅部分位于三角形内的像素被低估或高估的问题就越多。
一种不太简单的方法是采用相同的边界框;然后对于边界框中的每个像素,计算也包含在三角形内的每个像素的面积;然后,将像素面积和平均颜色乘以像素面积相加到总和中。 然而,这太慢了,不切实际。
虽然我专门寻找 Pythonic 答案和可能有方法实现它的库,但其中大约 90% 将找到正确的算法,10% 将实现它。
根据定义,三角形是包含在由相互相交的三个部分包围的度量空间内的点的集合。直线的一部分由如下方程之一定义:
如果在矩形中循环点,您可以通过检查该点是否位于任何部分上或位于所有部分的正确一侧来确定该点是否在三角形内部。以下是一些实现:
https://www.geeksforgeeks.org/check-whether-a-given-point-lies-inside-a-triangle-or-not/
# A utility function to calculate area
# of triangle formed by (x1, y1),
# (x2, y2) and (x3, y3)
def area(x1, y1, x2, y2, x3, y3):
return abs((x1 * (y2 - y3) + x2 * (y3 - y1)
+ x3 * (y1 - y2)) / 2.0)
# A function to check whether point P(x, y)
# lies inside the triangle formed by
# A(x1, y1), B(x2, y2) and C(x3, y3)
def isInside(x1, y1, x2, y2, x3, y3, x, y):
# Calculate area of triangle ABC
A = area (x1, y1, x2, y2, x3, y3)
# Calculate area of triangle PBC
A1 = area (x, y, x2, y2, x3, y3)
# Calculate area of triangle PAC
A2 = area (x1, y1, x, y, x3, y3)
# Calculate area of triangle PAB
A3 = area (x1, y1, x2, y2, x, y)
# Check if sum of A1, A2 and A3
# is same as A
if(A == A1 + A2 + A3):
return True
else:
return False
# Driver program to test above function
# Let us check whether the point P(10, 15)
# lies inside the triangle formed by
# A(0, 0), B(20, 0) and C(10, 30)
if (isInside(0, 0, 20, 0, 10, 30, 10, 15)):
print('Inside')
else:
print('Not Inside')
# This code is contributed by Danish Raza
如果您想减少要考虑的点数,则获取三角形的外接矩形并循环每一行,求解该行的线段方程,找到两个解(或边缘的一个解)并循环该行的右小节。