我有兴趣在高斯金字塔(我最终想要创建拉普拉斯金字塔)中为我输出一个功能,用于图像处理. (链接参考https://en.wikipedia.org/wiki/Pyramid_(image_processing)#Gaussian_pyramid)
下采样问题
现在,简单的一部分是当您下/上采样时,5抽头滤波器在调整大小之前与图像进行卷积.
然而,关于制作图像金字塔的有趣部分是,您必须按照0.5或2的因子对图像进行下采样和上采样,具体取决于您要去的方向. Swift有几种方法,例如使用CIAffineTransform和CILanczosTransform,但是我想知道是否有办法更加天真地做,因为我不在乎调整大小的图像的质量.对于这篇文章,我将使用Lenna(512×512)作为示例,如下所示:
如果我们想要将图像下采样一个二分之一,我们将采取所有奇数像素数据形成一个新的图像.在MATLAB中,这样执行如下(高斯模糊之后):
如果我是您的输入图像,并且大小为NxM,则为P(512x512x3矩阵)存储3种颜色的映射,则以.5的比例缩放图像
R = I(1:2:结束,1:2:结束:)
所有新图像都是以前的奇数编号的列和图像的行.这产生了以下,256×256照片是高斯金字塔的第一级:
这样的事情是否存在于迅速?是否可以在Core Image或OpenGL自定义过滤器中执行?
上采样问题:
实际上只有在创建拉普拉斯金字塔时才使用上采样.然而,这样做的天真想法是做以下事情:
初始化R,您要上传的大小的空白图像上下文.在这种情况下,我们将对上采样的Lenna照片进行上采样,因此R必须是512×512空白图像.
接下来,将下采样图像的像素值乘以4.这可以通过使用3×3矩阵[0,0; 0,4,0; 0,0]卷积图像来快速完成.然后可以将图像的像素均匀分布到较大的空白图像R中.这看起来像:
最后,可以对该图像采用相同的5点高斯模糊来恢复上采样图像:
我想知道是否可以采用类似的上采样方法.
我不确定的另一件事是,如果在高斯/拉普拉斯筛选中调整图像大小的技术非常重要.如果没有,那么当然我可以使用最快的内置方法,而不是试图让我自己.
解决方法
pod’GPUImage’
夏普UPSAMPLING:
UIImage *inputImage = [UIImage imageNamed:@"cutelady"]; GPUImagePicture *stillImageSource = [[GPUImagePicture alloc]initWithImage:inputImage]; GPUImageSharpenFilter *stillImageFilter = [[GPUImageSharpenFilter alloc] init]; [stillImageSource addTarget:stillImageFilter]; [stillImageFilter useNextFrameForImageCapture]; [stillImageSource processImage]; UIImage *currentFilteredVideoFrame = [stillImageFilter imageFromCurrentFramebuffer];
LANCZOS UPSAMPLING:
UIImage *inputImage = [UIImage imageNamed:@"cutelady"]; GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage]; GPUImageLanczosResamplingFilter *stillImageFilter = [[GPUImageLanczosResamplingFilter alloc] init]; [stillImageSource addTarget:stillImageFilter]; [stillImageFilter useNextFrameForImageCapture]; [stillImageSource processImage]; [stillImageSource forceProcessingAtSizeRespectingAspectRatio:CGSizeMake(200,200)]; UIImage *currentFilteredVideoFrame = [stillImageFilter imageFromCurrentFramebuffer]; cell.imageView.image = currentFilteredVideoFrame;