⚠️ 这是一个非官方翻译网站,与 ImageMagick Studio LLC 无关。准确信息请参阅原文(https://imagemagick.org/convex-hull/)

凸包与最小外接矩形

凸包 • 最小外接矩形 • 图像旋转校正

凸包(convex hull)是包含其内部点集的最小面积凸多边形。凸包可以形象地理解为用一根橡皮筋绕住点集后所围成的形状。

convex-hull 字符串格式会返回一个列表,其中包含构成凸包多边形的各顶点的 x,y 坐标,该多边形包含其内部所有的非黑色像素。

magick [-fuzz value%] [-background background-color] -format "%[convex-hull]" info:

若只需返回上、右、下、左的极值点,请使用 %[convex-hull:extreme-points]。

其中,该字符串格式会响应可选的 -fuzz 值,以及通过 define 指定的可选背景色。除非已定义背景色,否则上述命令会根据 fuzz 值自动确定背景色。未指定时,fuzz 值默认为 0。

例如,考虑下面这个黑色背景上的白色矩形:

[Convex Hull]

凸包点集可按如下方式计算:

magick rect.png -format "%[convex-hull]" info:
190,121 193,122 281,154 377,189 378,190 377,193 345,281 310,377 309,378 306,377 218,345 122,310 121,309 122,306 154,218 189,122 190,121

凸包也可以使用 -draw 绘制为多边形(填充或不填充),如下所示:

magick rect.png -set option:hull "%[convex-hull]" -fill none -stroke red -strokewidth 1 -draw "polygon %[hull]" blocks_hull.png

下面是一个使用黑色背景上非凸形状图像的示例:

[Convex Hull Blocks]

magick blocks_black.png -set option:hull "%[convex-hull]" -fill none -stroke red -strokewidth 1 -draw "polygon %[hull]" blocks_hull.png

[Convex Hull Blocks Closure]

最后,下面是一个使用 -fuzz 判定背景色、背景非恒定且非黑色的示例:

[Convex Hull Barn]

现在,我们来高亮显示图像前景对象的凸包:

magick barn_rot20.png -fuzz 10% -set hull "%[convex-hull]" -fill none -stroke red -strokewidth 1 -draw "polygon %[hull]" barn_rot20_hull.png

[Convex Hull Barn Closure]

最小外接矩形

与图像前景对象的凸包相似的是最小外接矩形(minimum bounding box)。若要返回构成外接矩形的点,请使用 %[minimum-bounding-box]。此外,还会设置以下属性:minimum-bounding-box:area, minimum-bounding-box:width, minimum-bounding-box:height, minimum-bounding-box:angle。

magick barn_rot20.png -fuzz 10% -background gray25 -set MBR "%[minimum-bounding-box]" -fill none -stroke red -strokewidth 1 -draw "polygon %[MBR]" barn-mbr.png

图像旋转校正

若要校正图像可能存在的旋转,请使用 %[minimum-bounding-box:unrotate]。除非指定图像的方向,否则对于小于等于 45 度的角度,该旋转校正角应能将图像正确对齐到正确的坐标轴。对于大于 45 度的角度,图像将对齐到错误的坐标轴。请设置正确的图像方向,以确保返回正确的旋转校正角。使用 -define minimum-bounding-box:orientation={landscape,portrait} 来设置图像方向。请注意,与 convex-hull 一样,该字符串格式会响应可选的 -fuzz 值和可选的 -background 色。

上面的谷仓图像旋转了 20 度。下面演示如何自动校正其旋转,并将其恢复为原始的横向(landscape)方向:

magick barn_rotate20.jpg -fuzz 15% -set option:angle "%[minimum-bounding-box:unrotate]" -background gray -rotate "%[angle]" -trim barn_unrotate.jpg