如何找到矩形的角像素?

SeP*_*läm 5 java geometry bitmap geometry-surface

给定一个简单的单色位图,其中包含一个随机旋转的矩形。如何在位图中找到矩形的左/上、左/下、右/下和右/上角位置?

例如,这是位图的外观,其中 X 标记有问题的像素:

......... ......... ......... .........
.X11111X. ....X.... ..X11.... ....11X..
.1111111. ...111... ..11111X. X111111..
.1111111. ..X111X.. ..111111. .111111..
.X11111X. ...111... .1111111. .1111111.
......... ....X.... .111111.. ..111111.
......... ......... .X11111.. ..11111X.
......... ......... ....11X.. ..X11....
......... ......... ......... .........
Run Code Online (Sandbox Code Playgroud)

请原谅糟糕的 ascii 艺术。对于第二个示例,顶部的角像素可以是矩形左/上角或右/上角。哪个都好。

需要哪些步骤来确定上述示例中的角点像素/位置?

Tat*_*ize 3

角像素是相距最远的像素。找到最上面的行和最下面的行。其中总会有一个角像素。

角像素只能是最上面一行中的第一个或最后一个像素(如果只有一个,则可以是两者)。

因此,比较最顶行中的第一个像素和最底行中最后一个像素之间的距离。最后一个像素位于最顶部,第一个像素位于最底部。那里的角是相距最远的角。

由于它们在 Y 轴上的距离都相同,因此您需要在 X 轴位置方面差异最大的像素。角点是abs(x0-x1) 最大的像素,其中x0 位于最上面一行,x1 位于最下面一行。

对最右边和最左边的行重复此操作。

如果最顶角在左边,那么最左边的角在底部,最底角在右边,最右边的角在顶部。一旦你有了顶部、底部、左侧和右侧的行,实际上就只有两种可能性可以在 if 语句中解决。但是,由于边缘条件是最上面一行有一个像素,最右边一行有两个像素,您最好再次运行该算法并转置 x 和 ys 来求解其他两个角,而不是试图省掉自己if 语句。