我正在尝试使用 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>
有。
你能指导我正确的方法吗?
根据我的经验,我觉得你的想法是正确的,但我们可以进一步简化这一点。这些是我之前遵循的一些常见步骤,并且也从 GPT 中获得了一些见解。
您可以使用
方法将
convert(to: )
从交错颜色格式转换为单通道。vImage.PixelBuffer
使用
计算直方图信息。vImageHistogramCalculation_Planr8
−Σ(p 我 ⋅log(p 我 ))
这在某种程度上是一种基本方法,您可以添加一些其他内容并使其更加自定义。但此解决方案将为所选自定义信息中的用例提供必要的步骤和输出。
如有任何疑问,请随时联系。