1个不稳定版本
0.1.0 | 2022年10月21日 |
---|
#2335 in 算法
每月21次下载
在tangibl中使用
32KB
619 行
Rust中的TopCodes
这是TopCodes在Rust中的直接重实现。原始源代码由Michael Horn提供,可在此处找到。
用法示例
use image::io::Reader as ImageReader;
let (mut scanner, buffer) = {
let img = ImageReader::open("assets/photo.png")
.unwrap()
.decode()
.unwrap();
let (width, height) = (img.width() as usize, img.height() as usize);
let buffer = img.into_rgb8().into_raw();
(Scanner::new(width, height), buffer)
};
let topcodes = scanner
.scan(&buffer, |buffer, index| {
(
buffer[index * 3] as u32,
buffer[index * 3 + 1] as u32,
buffer[index * 3 + 2] as u32,
)
});
您可以使用任何抽象,只要您能向扫描器提供原始图像缓冲区的引用(目前假设是RGB [u8]切片)。
示例
使用此库在WASM中的示例可以在topcodes-wasm-rs仓库中找到。
阈值处理
为了深入了解扫描器的工作原理,我们从如下所示的图像开始
它运行阈值算法,在alpha通道产生以下数据(以灰度图像的形式可视化)
扫描
在阈值处理之后,从这张黑白地图中确定TopCodes。首先确保候选TopCode不会与现有的TopCodes重叠(这为BVH或类似的数据结构提供了快速确定冲突的机会),然后确定单元大小(环的宽度),最后确定实际的代码。有一个校验和来确保代码中1的位数等于五个,以减少有效TopCodes的数量(从而降低错误率)。
性能
以下基准测试使用assets/photo.png
图像,并在以下配置的计算机上执行
CPU: Intel Core i7-9700K @ 3.60 GHz RAM: 16.0 GB
虽然性能基准测试并不完全可靠,但这将有助于未来的开发,因为我希望不要因为改进API而降低精度或性能。
计划
此包的目标是尽可能与平台无关。所有非显式需要的依赖都将通过功能门控来确保,以确保此项目的默认依赖尽可能接近零。理想情况下,此版本的项目应该能够在Rust支持的几乎所有平台上运行。
我计划从该源创建一个单独的仓库,用于提供动态库,以便可以从其他语言中拉取。
依赖关系
~0–0.8MB
~11K SLoC