Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 实现正确性的图形测试_Python - Fatal编程技术网

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不用担心,我喜欢做它。这是我第一次做这样的问题。