使用matlab计算得分

时间:2015-11-14 14:21:33

标签: matlab image-processing

我正在计算气步枪纸目标的分数。我能够计算从像素中心到子像素孔中心的距离。

这是我的代码:

"Execution of this application has stopped due to a run-time error. The application can't continue and will be shut down"

这是带有一个弹孔的原始图像。 enter image description here

这是我的结果。

enter image description here

这是我用来获得分数的论文目标。

enter image description here

任何人都可以建议我如何用这个来计算分数。

1 个答案:

答案 0 :(得分:1)

请参阅Python中的my walk through your problem

这是一个非常有趣的问题。 我假设你已经有了获得二元孔掩模的方法(因为你给了我们图像)

Sample image 由于给定图像中的目标居中问题,某些分数是错误的

给定空洞掩模,找到2D射击中心

我认为实际的图像会包含几个洞而不是一个洞。

通过计算二元孔图像的距离变换的局部最大值来提取的镜头位置。由于距离变换给出了从检查点到边界的距离作为强度输出,这允许我们将最中心像素计算为局部最大值。

我使用的局部最大技术是计算具有给定大小(对我而言为10)的图像的最大滤镜,并找到具有filtered == original的像素。 您必须删除0值"最大值"但除此之外,它是一个值得记住的好技巧,因为它通过使用N维最大滤波器在N维中工作。

给定镜头中心的2D位置,计算得分

您需要将坐标系从笛卡尔坐标系(X,Y)转换为极坐标(距离,角度)。

来自MathWorks的图像来说明数学。

Matlab image

要使用图像中心作为参考点,请使用图像中心矢量偏移每个位置。 丢弃角度,您的分数与距离中心的距离直接相关。

您的分数是您需要根据距离计算的整数: 据我了解,如果你在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

每当你想到问题的一个方面时,请考虑"我以像素或毫米为单位看待什么?"。尝试从概念上将使用像素的代码与以毫米为单位的代码分开。

编码最佳做法是尽可能避免这些假设,这样如果你从不同的相机获得一堆具有不同属性的图像,你可以"转换"所有内容都采用通用格式(毫米),然后对数据进行统一处理