Objective c 接缝雕刻–;访问cocoa中的像素数据

Objective c 接缝雕刻–;访问cocoa中的像素数据,objective-c,cocoa,image-processing,core-image,Objective C,Cocoa,Image Processing,Core Image,我想用Avidan/Shamir实现接缝雕刻算法。在能量计算阶段(可以使用核心图像过滤器实现)之后,我需要计算能量最低的接缝,这不能作为核心图像过滤器实现,因为它使用动态编程(并且您无法访问opengl着色语言中以前的计算) 因此,我需要一种在objective-c中高效访问图像像素数据的方法 省略边界检查的伪代码: for y in 0..lines(image) do: for x in 0..columns(image) do: output[x][y] = value(ima

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

因此,我需要一种在objective-c中高效访问图像像素数据的方法

省略边界检查的伪代码:

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] }

获取图像像素值的最佳方法是使用创建CGBitmapContextRef。其中重要的一点是,当您创建上下文时,您可以将指针传入其中,该指针将用作位图数据的备份存储。这意味着数据将保存像素值,您可以随时使用它们

因此,这些步骤应该是:

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

  • 你是如何计算能量数据的?你的算法是什么?这不会利用GPU,对吧?如果我正确理解了算法,那么这必须通过图像中的行数(很容易达到1024+次)来完成。对,最初的问题是关于访问要运行c代码的图像数据,因此答案显示了如何将图像数据转换为堆上定义良好的格式。