Estou tentando contar eficientemente a entropia de Shannon (a fórmula -sum(pi * log pi)) de uma imagem no macOS/iOS com swift. Encontrei o framework Accelerate e as funções vImage, que parecem ser o que estou procurando, no entanto, a documentação é escassa e me perdi nela.
Estou criando um buffer vImage assim
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)
Minha ideia era então convertê-lo para buffer de escala de cinza de 1 canal ( vImage.PixelBuffer<vImage.Planar8>
) por buf.multiply()
, de acordo com esta página: https://developer.apple.com/documentation/accelerate/converting_color_images_to_grayscale . Então crie um histograma a partir dele e, então, itere manualmente sobre seus 256 valores e conte a soma. No entanto, parece que vImage.PixelBuffer<vImage.Planar8>
não tem histogram()
método algum... while vImage.PixelBuffer<vImage.Interleaved8x4>
tem.
Você pode me orientar sobre a maneira correta de fazer isso?
Pela minha experiência, sinto que seu pensamento está correto, mas podemos simplificar isso um pouco mais. Estas são algumas das etapas comuns que segui em ocasiões anteriores e obtive alguns insights do GPT também.
Passos
Exemplo
Notas
Esta é uma abordagem um tanto rudimentar, há algumas outras coisas que você pode adicionar e torná-la mais personalizada. Mas esta solução fornecerá as etapas e saídas necessárias para os casos de uso nas informações personalizadas selecionadas.
Sinta-se à vontade para entrar em contato conosco caso tenha alguma dúvida.