问题很简单:我有以下图片。
我的点列表是白色像素,我将它们存储在纹理中。确定它们定义的梯形的最佳方法可能是最有效的方法? (具有4个角的凸形状,不一定具有90度角)。
纹理很小(800x600),因此绝对不值得使用CUDA / CL(如果可能,我宁愿遍历像素)。
答案 0 :(得分:3)
您应该能够执行所需的操作,即使用Hough Transform从不完整的信息中检测行。
CImg附带的示例中有一个很酷的演示,它本身是一个相当不错的,简单的,仅标头的C ++图像处理库。我在此处制作了一个视频,展示了当我首先沿着笼子的水平条然后向垂直条向下移动鼠标时,如何更新右侧的累加器空间。您可以看到累积器中的投票数,累积器中的点逐渐累积到亮白色的峰值:
您也可以在命令行上使用 ImageMagick 进行实验,而无需编写或编译任何代码,请参见示例here。 ImageMagick 已安装在大多数Linux发行版中,并且可用于macOS和Windows。
因此,使用您的图片:
magick trapezoid.png -background black -fill red -hough-lines 9x9+10 result.png
或者,如果您想要标识4行的基础信息:
magick trapezoid.png -threshold 50% -hough-lines 9x9+10 mvg:
# Hough line transform: 9x9+10
viewbox 0 0 784 561
# x1,y1 x2,y2 # count angle distance
line 208.393,0 78.8759,561 # 14 13 312
line 0,101.078 784,267.722 # 28 102 460
line 0,355.907 784,551.38 # 14 104 722
line 680.493,0 550.976,561 # 12 13 772
如果您看一下紧跟在井号(#
)之后的数字,即14、28、14、12,则它们是票数,它们对应于点中的点数/点数您沿这条线的原始图像。这就是为什么我在threshold
部分将9x9+10
设置为10的原因-而不是在链接的 ImageMagick 示例中使用40。我的意思是每行上的点相对较少,因此需要较低的阈值。
请注意,霍夫变换也可以在其他软件包中使用,例如OpenCV。