【问题标题】:Seam Carving – Accessing pixel data in cocoaSeam Carving – 访问可可中的像素数据
【发布时间】:2011-05-25 03:02:37
【问题描述】:

我想实现 Avidan/Shamir 的接缝雕刻算法。在可以使用核心图像过滤器实现的能量计算阶段之后,我需要计算不能作为核心图像过滤器实现的最低能量的接缝,因为它使用动态编程(并且您无权访问以前在 opengl 着色语言中的计算)。

所以我需要一种在objective-c cocoa中有效访问图像像素数据的方法。

省略边界检查的伪代码:

for y in 0..lines(image) do:
  for x in 0..columns(image) do:
    output[x][y] = value(image, x, y) + 
                     min{ output[x-1][y-1]; output[x][y-1]; output[x+1][y-1] }

【问题讨论】:

  • 您是如何计算能源数据的?你的算法是什么?

标签: objective-c cocoa image-processing core-image


【解决方案1】:

获取图像像素值的最佳方法是使用CGBitmapContextCreate 创建一个CGBitmapContextRef。关于这一点的重要部分是,当您创建上下文时,您可以传递将用作位图数据的后备存储的指针。这意味着数据将保存像素值,您可以对它们做任何您想做的事情。

所以步骤应该是:

  1. 使用 malloc 或其他合适的分配器分配缓冲区。
  2. 将该缓冲区作为第一个参数传递给 CGBitmapContextCreate。
  3. 将图像绘制到返回的 CGBitmapContextRef 中。
  4. 释放上下文。
  5. 现在您有了原始数据指针,其中填充了在调用 CGBitmapContextCreate 时指定的格式的像素。

【讨论】:

  • 这不会利用 GPU 对吧?如果我正确理解算法,这将必须完成图像中的行数(很容易 1024 次以上)。
  • 对,最初的问题是关于访问图像数据以运行 c 代码,因此答案显示了如何在堆上将图像数据转换为明确定义的格式。
猜你喜欢
  • 2010-10-13
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
  • 2011-04-11
  • 2023-04-08
相关资源
最近更新 更多