2014-02-27 26 views
1

我有他们周围有白色边框的图像。我想在运行时摆脱边界。检测图像周围的修剪单色框架

一个简单而缓慢的算法来做到这一点会是这样的:

  1. 扫描每一行从上往下,停止,如果行中的像素不是白色。
  2. 对所有4条边做同样的事情。

这样,我学会了每边的白色边框的宽度,并可以相应地修剪它。

上面的方法相当慢,我想。有没有更有效的方法来实现这一点?即,iOS是否提供了帮助完成此任务的任何功能?

+0

您可能可以配对阈值操作所有不是白色的),打开或关闭操作(去除不是来自边界的小特征)以及哈里斯角点检测:http://stackoverflow.com/questions/10530846/determine-the-corners-一张纸与 - ios-5-av-foundation-and-core-imag/10623563#10623563。我在GPUImage中执行所有这些操作,就像我在链接的答案中显示的一样,但结果可能取决于图像的细节。 –

回答

1

它可能不是最好的解决方案,但正如你所说,你可以检查颜色,然后修剪。下面是图像中获得像素的颜色的方法:即修剪

- (UIColor)colorOfPixelAtLocation:(CGPoint)position inImage:(UIImage *)image 
{ 
    CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage)); 
    const UInt8* data = CFDataGetBytePtr(pixelData); 

    int pixelInfo = ((image.size.width * position.y) + position.x) * 4; // PNG 

    UInt8 red = data[pixelInfo]; 
    UInt8 green = data[(pixelInfo + 1)]; 
    UInt8 blue = data[pixelInfo + 2]; 

    CFRelease(pixelData); 

    return [UIColor colorWithRed:red/255.0f green:green/255.0f blue:blue/255.0f alpha:alpha/255.0f]; 
} 

和代码:

CGImageRef imageRef = CGImageCreateWithImageInRect([largeImage CGImage], cropRect); 

// Use the image 

CGImageRelease(imageRef); 

我希望它能帮助。

+1

是的,很好。这是我已经知道的部分,我认为这是不好的选择。我也只是在这里找到了类似的答案:http://stackoverflow.com/questions/20056870/trim-uiimage-border –

-1

我只是作弊。假设您的图像周围有一个10像素的白色边框,并且图像为200x 200,则将其显示在尺寸为180x180的UIImageView中,并将其居中放大:P

+0

我不能这样做,因为我不知道我要去的图像边框的尺寸展示。这就是为什么我需要在运行时检测它们的原因。 –