【问题标题】:How to tell if CGImageRef is completely blank?如何判断 CGImageRef 是否完全空白?
【发布时间】:2013-07-02 11:09:38
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您希望它快速运行,请务必查看 Accelerate 框架。里面有很多 DSP 和矢量处理功能,而且速度非常快。

标签: objective-c core-graphics opacity cgimage


【解决方案1】:

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

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

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

【讨论】:

  • 天哪,这太不可思议了! CIAreaMaximumAlpha 正是我们所需要的。非常感谢!
  • 如果您关注性能,This 仍然会快很多。
【解决方案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!"

希望对您有所帮助。

【讨论】:

    【解决方案3】:

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

    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 :)
    }
    

    【讨论】:

    • 听起来是个好主意。由于我们正在与空白图像进行比较,我想知道循环并与零比较是否更快。 (也是为 OSX 编写的,所以 UIImage 不可用,但我明白了!)
    • 不确定你有多少时间,但我很想看看通过基准测试哪个会更快:)。循环通过也应该工作。是否有机会在图像上有一个特定区域,如果不是空的,像素将被 100% 绘制?您也可以开发这种启发式方法来加快循环。
    • 比如生成的图像不是全息的。然后检查exat中心的像素。如果绘制了图片,则中心像素中具有颜色的概率更高。但这很危险……您必须检查边缘情况。
    • 好主意。对于我的用例,透明/不透明位将完全随机并分布在图像周围。不过,您的想法可能会帮助下一个人!感谢您的周到反馈。
    • 酷我已经抛出 100 代表赏金以获得更多反馈。谢谢克里斯
    猜你喜欢
    • 2011-11-19
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    相关资源
    最近更新 更多