第一次使用不同的GPUImage过滤器时,我看到奇怪的表现,其中GPUImage在实时预览和输出的照片之间显示出相当大的差异。
我目前正在使用GPUImageSobelEdgeDetectionFilter进行此操作,如下所示;
在左侧,我有设备屏幕的屏幕截图,右边是输出的照片。它似乎显着降低了检测到的线条的厚度和清晰度,从而输出了非常不同的图像。
我尝试过打开和关闭SmoothlyScaleOutput,但由于我目前没有缩放图像,因此不应该影响它。
过滤器设置如此;
filterforphoto = [[GPUImageSobelEdgeDetectionFilter alloc] init];
[(GPUImageSobelEdgeDetectionFilter *)filterforphoto setShouldSmoothlyScaleOutput:NO];
[stillCamera addTarget:filterforphoto];
[filterforphoto addTarget:primaryView];
[stillCamera startCameraCapture];
[(GPUImageSobelEdgeDetectionFilter *)filterforphoto setEdgeStrength:1.0];
这张照片是这样的;
[stillCamera capturePhotoAsImageProcessedUpToFilter:filterforphoto withCompletionHandler:^(UIImage *processedImage, NSError *error){
有谁知道为什么GPUImage正在解释实时相机与输出的照片有什么不同?仅仅是因为预览的质量远低于最终图像,因此在全分辨率图像上看起来会有所不同吗?
谢谢,
(请注意,请忽略左右图像上略有不同的尺寸,我没有尽可能地照亮它们)
答案 0 :(得分:1)
原因确实是因为实时预览和照片之间的分辨率不同。
边缘检测滤波器(以及其他类似滤波器)工作的方式是它们立即对当前正在处理的像素两侧的像素进行采样。当您以照片的形式提供更高分辨率的输入时,这意味着边缘检测发生在图像的小得多的相对区域上。这也是为什么当应用于静态照片与实时预览时,某个像素半径的高斯模糊显得更弱的原因。
要将边缘检测锁定为某个相对大小,您可以在过滤器上手动设置texelWidth
和texelHeight
属性。这些值分别是目标图像的1 /宽度和1 /高度。如果您根据实时预览的大小设置这些值,则应在最终照片中看到一致的边缘大小。由于分辨率较高,一些细节可能略有不同,但它应该大致相同。