我正在编写一个Objective-C算法,用于比较两个图像并输出差异。
偶尔会传入两个相同的图像。有没有办法从生成的CGImageRef中立即告知它不包含任何数据? (即只有透明像素)。
算法运行于> 20 fps所以表现是首要任务。
答案 0 :(得分: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!"
希望有所帮助。
答案 1 :(得分:2)
你应该在这里使用CoreImage。 看看“CIArea *”过滤器。
请参阅此处的核心图像过滤器参考:http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CoreImageFilterReference/Reference/reference.html
这比以前任何一种方法都要快得多。 如果这对您有用,请告诉我们。
答案 2 :(得分: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 :)
}