我正在计算气步枪纸目标的分数。我能够计算从像素中心到子像素孔中心的距离。
这是我的代码:
"Execution of this application has stopped due to a run-time error. The application can't continue and will be shut down"
这是我的结果。
这是我用来获得分数的论文目标。
任何人都可以建议我如何用这个来计算分数。
答案 0 :(得分:1)
这是一个非常有趣的问题。 我假设你已经有了获得二元孔掩模的方法(因为你给了我们图像)
我认为实际的图像会包含几个洞而不是一个洞。
通过计算二元孔图像的距离变换的局部最大值来提取的镜头位置。由于距离变换给出了从检查点到边界的距离作为强度输出,这允许我们将最中心像素计算为局部最大值。
我使用的局部最大技术是计算具有给定大小(对我而言为10)的图像的最大滤镜,并找到具有filtered == original
的像素。
您必须删除0值"最大值"但除此之外,它是一个值得记住的好技巧,因为它通过使用N维最大滤波器在N维中工作。
您需要将坐标系从笛卡尔坐标系(X,Y)转换为极坐标(距离,角度)。
来自MathWorks的图像来说明数学。
要使用图像中心作为参考点,请使用图像中心矢量偏移每个位置。 丢弃角度,您的分数与距离中心的距离直接相关。
您的分数是您需要根据距离计算的整数: 据我了解,如果你在0距离并且减少到0分,你得分为10分。
这意味着评分功能
border_space = 10 px # distance between each circle, up to you to find it :)
score = 10 - (distance / border_space) # integer division though
添加约束,得分不能为负数:
score = max(10 - (distance / border_space),0)
真的看一下我的ipython notebook,它非常直观
修改:关于距离转换。
您的目标练习图像以像素为单位,但这些像素距离可以映射到毫米:您可能知道目标的大小是厘米(它的规则大小,对吧?),所以你可以设置转换率:
target_size_mm = 1000 # 1 meter = 1000 millimeters
target_size_px = 600 # to be measured for each image
px_to_mm_ratio = target_size_mm / target_size_px
object_size_px = 102 # any value you want to measure really
object_size_mm = object_size_px * px_to_mm_ratio
每当你想到问题的一个方面时,请考虑"我以像素或毫米为单位看待什么?"。尝试从概念上将使用像素的代码与以毫米为单位的代码分开。
编码最佳做法是尽可能避免这些假设,这样如果你从不同的相机获得一堆具有不同属性的图像,你可以"转换"所有内容都采用通用格式(毫米),然后对数据进行统一处理