Python 实现正确性的图形测试
我正在测试一个计算两个省略号重叠区域的算法的实现 测试的目的是目视检查椭圆的交点(如果有)是否计算正确。如果不是这种情况,则计算的面积不可能正确 编辑:我的实现的输出是一个带有交点的文件。我绘制椭圆和交点,然后Python 实现正确性的图形测试,python,Python,我正在测试一个计算两个省略号重叠区域的算法的实现 测试的目的是目视检查椭圆的交点(如果有)是否计算正确。如果不是这种情况,则计算的面积不可能正确 编辑:我的实现的输出是一个带有交点的文件。我绘制椭圆和交点,然后savefig。我目测检查结果并说服自己交点是否正确 以下是一个例子: 我的问题是,这种可视化方法不能随着测试数量的增加而扩展(比如说1000个案例) 有没有办法让这个测试自动化 编辑:对不起,我想我误解了这个问题。 为此,需要找到2 elipse函数之间的交点 或者你可以使用Symph
savefig
。我目测检查结果并说服自己交点是否正确
以下是一个例子:
我的问题是,这种可视化方法不能随着测试数量的增加而扩展(比如说1000个案例)
有没有办法让这个测试自动化 编辑:对不起,我想我误解了这个问题。 为此,需要找到2 elipse函数之间的交点
或者你可以使用Symphy,所以我做了一些研究,这就是我推荐的。您可以使用另一个python库来计算两个椭圆的交点,然后将这两个椭圆与您的实现返回的值进行比较。这两个测试应该是相同的,如果不是,你可以让测试失败,并调查哪一个是错误的。该库可以计算多个受支持实体(椭圆、圆、多边形、规则多边形、三角形)之间的交点。我建议使用标准库来执行实际测试。然后您可以运行一个测试运行,创建几千个随机椭圆,并检查每个椭圆的交点
您可以查看这一点,其中包括交点计算。他们的文档中有这一惊人的功能,您可以单击示例旁边Symphy Live链接中的运行代码块,它将在浏览器中打开python会话,并在他们的google app engine服务器上运行该示例。这样,您就可以使用他们的库进行试驾,而无需将其安装到您的计算机上。看看他们的方法,它真的很整洁。方法 我决定把这个作为另一个答案,因为我采取了全新的方法。我在不同的图像上用红色和绿色画了两个椭圆。然后我混合了两幅图像,并计算了图像中黄色像素的数量,黄色是绿色和红色的组合,将成为相交区域的颜色。第一个椭圆的颜色为红色,第二个为绿色,它们的交点为黄色。为了演示的目的,我把第二个椭圆做成了一个圆,并把它完全包含在第一个椭圆中,这样就可以显示出它的面积应该是这个大小的圆的面积。由于像素被计数,因此无法获得精确答案,但在本例中,分辨率为500x500的像素计数区域与正确值相差0.42%。当然,如果你提高分辨率,你可以期望得到更高的精度,但出于测试目的,我只接受+/-1%的公差。您可以注释掉保存的行,并显示我刚刚包含的图像,以帮助进行初始调试 性能
from PIL import Image, ImageDraw
from math import pi
RED, GREEN, YELLOW = (255, 0, 0), (0, 255, 0), (127, 127, 0)
SIZE = (500, 500)
def overlap(ellipse1, ellipse2):
im1 = Image.new("RGB", SIZE)
ImageDraw.Draw(im1).ellipse(ellipse1, fill=RED)
im2 = Image.new("RGB", SIZE)
ImageDraw.Draw(im2).ellipse(ellipse2, fill=GREEN)
im3 = Image.blend(im1, im2, 0.5)
im3.show()
im3.save('test.png', "png")
return [count for count, color in im3.getcolors() if color == YELLOW][0]
area1 = overlap((0, 50, 500, 450), (50, 50, 450, 450))
area2 = pi * (200**2)
print "overlap calc:" , area1
print "exact area: " , area2
print "percent diff:" , ((area1 - area2)/area2)*100
我运行了1000次调用函数的测试运行,结果在13.4秒内完成。因此,创建这三幅图像并进行像素计数大约需要13毫秒,这对于手头的任务来说性能不错
代码
from PIL import Image, ImageDraw
from math import pi
RED, GREEN, YELLOW = (255, 0, 0), (0, 255, 0), (127, 127, 0)
SIZE = (500, 500)
def overlap(ellipse1, ellipse2):
im1 = Image.new("RGB", SIZE)
ImageDraw.Draw(im1).ellipse(ellipse1, fill=RED)
im2 = Image.new("RGB", SIZE)
ImageDraw.Draw(im2).ellipse(ellipse2, fill=GREEN)
im3 = Image.blend(im1, im2, 0.5)
im3.show()
im3.save('test.png', "png")
return [count for count, color in im3.getcolors() if color == YELLOW][0]
area1 = overlap((0, 50, 500, 450), (50, 50, 450, 450))
area2 = pi * (200**2)
print "overlap calc:" , area1
print "exact area: " , area2
print "percent diff:" , ((area1 - area2)/area2)*100
输出
overlap calc: 126196
exact area: 125663.706144
percent diff: 0.423585992124
图像
是的,测试是用python实现的。我不明白
xlim
和ylim
的意思。我想检查图中的绿色o是否真的是交点。我与最大值和最小值无关。请多解释一下你的意思。谢谢我懂了。对不起,我不太明白这个问题:(也许这会有帮助:我实际上使用了boost geometry来检查结果。sympy很酷,但不成熟(正如他们所说的).所以我不确定我是否能相信他们的常规。也许你可以用boost geometry尝试同样的方法,那就是使用单元测试和随机生成的椭圆。使用boost geometry,我比较两个多边形的重叠区域(20边~椭圆).因此,原则上,这应该能告诉我是否在代码中出错,但决不能告诉我的结果是否是elope()
获取边界框的坐标。因此,我会直观地问,是否可以转换(x,y,a,b,phi)
此图像坐标中真实世界坐标的元组。不确定如何传递参数phi
。在帮助中,您只需获得以下标题定义椭圆(self,xy,fill=None,outline=None)
,但是xy
是如何定义的?这是正确的坐标是以像素为单位的。文档有点稀疏,但社区中大量使用python图像库,因此您可以在google上找到许多示例,并很容易在stackoverflow上获得答案。它接受的框坐标是x1、y1、x2、y2,用于定义左上角和右上角包含框的右下角坐标。现在,如果你想在椭圆上应用φ,你可以调用图像上的旋转方法,精确到你想应用的角度。你也可以在stackoverflow上发布一个问题,说明如何实现(x,y,a,b,φ)使用PIL。谢谢!我找到了一些答案。在询问社区之前,我会做一些研究。再次感谢你的好主意。@Tengis不用担心,我喜欢做它。这是我第一次做这样的问题。