在 iOS/macOS 上使用 vImage 快速计算图像熵

问题描述 投票:0回答:1

我正在尝试使用 swift 有效地计算 macOS/iOS 上图像的香农熵(-sum(pi * log pi) 公式)。我找到了 Accelerate 框架和 vImage 函数,它们看起来像我正在寻找的东西,但是文档很少,我迷失在其中。

我正在像这样创建 vImage 缓冲区

   var format = vImage_CGImageFormat(
        bitsPerComponent: 8,
        bitsPerPixel: 8 * 4,
        colorSpace: CGColorSpace(name: CGColorSpace.displayP3)!,
        bitmapInfo: .init(rawValue: CGImageAlphaInfo.noneSkipFirst.rawValue))!

    let buf = try vImage.PixelBuffer(
        cgImage: cg,
        cgImageFormat: &format,
        pixelFormat: vImage.Interleaved8x4.self)

我的想法是根据此页面,通过

vImage.PixelBuffer<vImage.Planar8>
将其转换为1通道灰度缓冲区(
buf.multiply()
):https://developer.apple.com/documentation/accelerate/converting_color_images_to_grayscale。然后从中创建直方图,然后手动迭代其 256 个值并计算总和。然而,似乎
vImage.PixelBuffer<vImage.Planar8>
根本没有
histogram()
方法...而
vImage.PixelBuffer<vImage.Interleaved8x4>
有。

你能指导我正确的方法吗?

ios macos entropy vimage
1个回答
0
投票

根据我的经验,我觉得你的想法是正确的,但我们可以进一步简化这一点。这些是我之前遵循的一些常见步骤,并且也从 GPT 中获得了一些见解。

步骤

  1. 将图像转换为灰度

您可以使用

convert(to: )
方法将
vImage.PixelBuffer
从交错颜色格式转换为单通道。

  1. 计算直方图

使用

vImageHistogramCalculation_Planr8
计算直方图信息。

  1. 计算熵

−Σ(p 我 ⋅log(p 我 ))

示例

Code example image

注释

  • 确保您插入的图像位于正确的色彩空间中。

这在某种程度上是一种基本方法,您可以添加一些其他内容并使其更加自定义。但此解决方案将为所选自定义信息中的用例提供必要的步骤和输出。

如有任何疑问,请随时联系。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.