#image #scanner #buffer #detecting #width #scan #image-scanning

topcodes

用于检测图像缓冲区中TopCodes的扫描器

1个不稳定版本

0.1.0 2022年10月21日

#2335 in 算法

每月21次下载
tangibl中使用

GPL-2.0许可证

32KB
619

Rust中的TopCodes

Build

这是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而降低精度或性能。

Density function

Average iteration time

计划

此包的目标是尽可能与平台无关。所有非显式需要的依赖都将通过功能门控来确保,以确保此项目的默认依赖尽可能接近零。理想情况下,此版本的项目应该能够在Rust支持的几乎所有平台上运行。

我计划从该源创建一个单独的仓库,用于提供动态库,以便可以从其他语言中拉取。

依赖关系

~0–0.8MB
~11K SLoC