4

我正在编写一个 Objective-C 算法来比较两个图像并输出差异。

偶尔会传入两个相同的图像。有没有办法从生成的 CGImageRef 中立即判断它不包含数据?(即只有透明像素)。

该算法以 > 20 fps 的速度运行,因此性能是重中之重。

4

3 回答 3

2

你应该在这里使用 CoreImage。看看“CIArea*”过滤器。

请参阅此处的核心图像过滤器参考:http: //developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CoreImageFilterReference/Reference/reference.html

这将比以前的任何方法都快很多。让我们知道这是否适合您。

于 2013-07-08T16:18:52.970 回答
2

从性能的角度来看,您应该将此检查合并到您的比较算法中。处理图像时最昂贵的操作是大部分时间将一小部分图像加载到缓存中。一旦你得到它,有很多方法可以非常快速地处理数据(SIMD),但问题是你需要一直用新数据驱逐和重新加载缓存,这在计算上是昂贵的。现在,如果您已经在算法中遍历过两个图像的每个像素,那么在缓存中仍然有数据的同时计算SAD是有意义的。所以在伪代码中:

int total_sad = 0
for y = 0; y < heigth; y++
  for x = 0; x < width; x+=16
    xmm0 = load_data (image0 + y * width + x)
    xmm1 = load_data (image1 + y * width + x)

    /* this stores the differences (your algorithm) */
    store_data (result_image + y * width + x, diff (xmm0, xmm1))
    /* this does the SAD at the same time */
    total_sad += sad (xmm0, xmm1)
if (total_sad == 0)
  print "the images are identical!"

希望有帮助。

于 2013-07-07T21:35:31.737 回答
1

对此不确定,但如果您可以拥有一个完全空白图像的示例图像,那么,

UIImage *image = [UIImage imageWithCGImage:imgRef]; //imgRef is your CGImageRef
if(blankImageData == nil)
{
    UIImage *blankImage = [UIImage imageNamed:@"BlankImage.png"]; 
    blankImageData = UIImagePNGRepresentation(blankImage); //blankImageData some global for cache
}

// Now comparison
imageData = UIImagePNGRepresentation(image);// Image from CGImageRef
if([imageData isEqualToData:blankImageData])
{
   // Your image is blank
}
else
{
   // There are some colourful pixel :)
}
于 2013-07-02T12:54:57.663 回答