从这张图片开始,随着年龄变黄,右边缘有一条白色的细条:
我应用过滤器,如下所示:
NScolor *whiteSample = // Chosen from the speech bubble's backgroundCIcolor *whiteinputcolor = [[CIcolor alloc] initWithcolor:whiteSample];layer.filters = @[ [CIFilter filterWithname:@"CIWhitePointAdjust" withinputParameters:@{kCIinputcolorKey: whiteinputcolor}]];
并获取此图像:
请注意,它看起来比原始颜色更暗更黄(与我想要的效果相反)。我一直期待一种效果更像是在Photoshop中使用自动颜色,如下所示:
我错误地使用CIWhitePointAdjust,还是这个工作的错误工具?如果另一个过滤器或过滤器组合可以更好地工作,我很想知道。
由于我正在 *** 作CALayer对象中已经存在的图像,因此Core Image过滤器看起来确实是正确的选择,但如果这只能通过其他方式实现,我对此持开放态度。
更新
信号处理站点上的helpful answer给出了我正在尝试实现的名称。从广义上讲,它被称为直方图均衡。我试图找出是否有办法使用Core Image过滤器执行该过程,到目前为止,它看起来并不太有希望(没有我自己编写)。
解决方法 好的,所以我想我已经钉了它!这是我从 https://stackoverflow.com/a/30447041/734860和几个胶水位上拼凑而成的东西:@import Accelerator;// I haven't yet found a way to do it within Core Image// use this when you need to CIImage* -> CGImageRefCIImage *ciImage = [CIImage imageWithCGImage:cgImage];...// use this when you need to CGImageRef -> CIImage*CIContext* context = [[CIContext alloc] init];CGImageRef cgImage = [context createCGImage:ciImage fromrect:ciImage.extent];...// the algorithm itself,which uses vImage and has to convert to/from it via CGImageCGImageRef CreateEqualisedCGImageFromCGImage(CGImageRef original){ vImage_Error err; vImage_Buffer _img; vImage_CGImageFormat format = { .bitsPerComponent = 8,.bitsPerPixel = 32,.colorSpace = NulL,.bitmAPInfo = (CGBitmAPInfo)kCGImageAlphaFirst,.version = 0,.decode = NulL,.renderingIntent = kCGRenderingIntentDefault,}; CGfloat wIDth = CGImageGetWIDth(original); CGfloat height = CGImageGetHeight(original); vImage_Buffer _dstA,_dstR,_dstG,_dstB; err = vImageBuffer_InitWithCGImage(&_img,&format,NulL,original,kvImageNoFlags); if (err != kvImageNoError) NSLog(@"vImageBuffer_InitWithCGImage error: %ld",err); err = vImageBuffer_Init( &_dstA,height,wIDth,8 * sizeof( uint8_t ),kvImageNoFlags); if (err != kvImageNoError) NSLog(@"vImageBuffer_Init (Alpha) error: %ld",err); err = vImageBuffer_Init( &_dstR,kvImageNoFlags); if (err != kvImageNoError) NSLog(@"vImageBuffer_Init (red) error: %ld",err); err = vImageBuffer_Init( &_dstG,kvImageNoFlags); if (err != kvImageNoError) NSLog(@"vImageBuffer_Init (green) error: %ld",err); err = vImageBuffer_Init( &_dstB,kvImageNoFlags); if (err != kvImageNoError) NSLog(@"vImageBuffer_Init (blue) error: %ld",err); err = vImageConvert_ARGB8888toplanar8(&_img,&_dstA,&_dstR,&_dstG,&_dstB,kvImageNoFlags); if (err != kvImageNoError) NSLog(@"vImageConvert_ARGB8888toplanar8 error: %ld",err); err = vImageEqualization_Planar8(&_dstR,kvImageNoFlags); if (err != kvImageNoError) NSLog(@"vImageEqualization_Planar8 (red) error: %ld",err); err = vImageEqualization_Planar8(&_dstG,kvImageNoFlags); if (err != kvImageNoError) NSLog(@"vImageEqualization_Planar8 (green) error: %ld",err); err = vImageEqualization_Planar8(&_dstB,kvImageNoFlags); if (err != kvImageNoError) NSLog(@"vImageEqualization_Planar8 (blue) error: %ld",err); err = vImageConvert_Planar8toARGB8888(&_dstA,&_img,kvImageNoFlags); if (err != kvImageNoError) NSLog(@"vImageConvert_Planar8toARGB8888 error: %ld",err); err = vImageContrastStretch_ARGB8888( &_img,kvImageNoError ); if (err != kvImageNoError) NSLog(@"vImageContrastStretch_ARGB8888 error: %ld",err); free(_dstA.data); free(_dstR.data); free(_dstG.data); free(_dstB.data); CGImageRef result = vImageCreateCGImageFromBuffer(&_img,kvImageNoFlags,&err); if (err != kvImageNoError) NSLog(@"vImageCreateCGImageFromBuffer error: %ld",err); free(_img.data); return result;}
该解决方案的优点全部到了https://stackoverflow.com/users/4735340/james-bush,但我看起来很长时间没有成功的面向图像的解决方案(与该问题中讨论的视频处理相反),我认为这样的现成回复是这样的相关。在OS X或iOS上寻找’autoLevels’让我无处可去,我希望这可能对其他人有用。
总结以上是内存溢出为你收集整理的可可 – 如何使用Core Image滤镜有效地平衡图像?全部内容,希望文章能够帮你解决可可 – 如何使用Core Image滤镜有效地平衡图像?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)