使用带有 NodeJS 的图像像素阵列跟踪边界
Trace boundary using an image pixel array with NodeJS
我的这张图片是全黑的,除了中间有一个白色物体(它可以是任何东西,但它总是全白的)。我想用 nodeJs 做的是跟踪图像中对象的边界(我想找到黑色旁边的所有白点)(性能是关键!)
使用 pngjs 我可以读取一张图像,它为我提供了一个数组,其中每个像素都有 4 个值 (RGBA)。它是一个一维数组。所以,假设图像是 1000 x 1000 像素,它会给我一个 1000 x 1000 x 4 = 4000000 个条目的数组。
下面的表达式将 x
和 y
转换为数组索引
var idx = (1000 * y + x) << 2;
data[idx] = 243;
data[idx + 1] = 16;
data[idx + 2] = 16;
无论如何,我可以遍历整个数组并记录黑色变为白色的点,但正如我所说,性能非常重要。我可以想象存在某种可以以某种方式遵循边界的智能迭代搜索算法:)
也许有人知道可以提供帮助的图书馆,或者关于如何做到这一点的文章也很棒!!
查看像 Freeman Code 这样的链码。您需要 1 个轮廓点才能开始。所以只需遍历你的线条,直到你击中你的对象。然后你绕着你的物体走,直到你到达你的起点。您将获得一个代码,描述您每一步的方向。此代码可用于计算各种对象特征或仅绘制对象的轮廓。
顺便说一句,如果你的对象总是白色的,而你的背景总是黑色的,你就不必处理 4 个通道。红色、绿色或蓝色通道包含相同的信息。只需使用其中之一即可。
我的这张图片是全黑的,除了中间有一个白色物体(它可以是任何东西,但它总是全白的)。我想用 nodeJs 做的是跟踪图像中对象的边界(我想找到黑色旁边的所有白点)(性能是关键!)
使用 pngjs 我可以读取一张图像,它为我提供了一个数组,其中每个像素都有 4 个值 (RGBA)。它是一个一维数组。所以,假设图像是 1000 x 1000 像素,它会给我一个 1000 x 1000 x 4 = 4000000 个条目的数组。
下面的表达式将 x
和 y
转换为数组索引
var idx = (1000 * y + x) << 2;
data[idx] = 243;
data[idx + 1] = 16;
data[idx + 2] = 16;
无论如何,我可以遍历整个数组并记录黑色变为白色的点,但正如我所说,性能非常重要。我可以想象存在某种可以以某种方式遵循边界的智能迭代搜索算法:)
也许有人知道可以提供帮助的图书馆,或者关于如何做到这一点的文章也很棒!!
查看像 Freeman Code 这样的链码。您需要 1 个轮廓点才能开始。所以只需遍历你的线条,直到你击中你的对象。然后你绕着你的物体走,直到你到达你的起点。您将获得一个代码,描述您每一步的方向。此代码可用于计算各种对象特征或仅绘制对象的轮廓。
顺便说一句,如果你的对象总是白色的,而你的背景总是黑色的,你就不必处理 4 个通道。红色、绿色或蓝色通道包含相同的信息。只需使用其中之一即可。