可可 – 如何使用Core Image滤镜有效地平衡图像?

可可 – 如何使用Core Image滤镜有效地平衡图像?,第1张

概述我正在尝试使用Core Image过滤器在Mac应用程序中为图像添加一些颜色校正。首先,我正在考虑允许自定义白平衡,从图像中删除一个演员。看起来CIWhitePointAdjust正是我正在寻找的东西,但在尝试之后,我不确定我是否使用它错了,或者它是否做不到我想的。 从这张图片开始,随着年龄变黄,右边缘有一条白色的细条: 我应用过滤器,如下所示: NSColor *whiteSample = // 我正在尝试使用Core Image过滤器在Mac应用程序中为图像添加一些颜色校正。首先,我正在考虑允许自定义白平衡,从图像中删除一个演员。看起来CIWhitePointAdjust正是我正在寻找的东西,但在尝试之后,我不确定我是否使用它错了,或者它是否做不到我想的。

从这张图片开始,随着年龄变黄,右边缘有一条白色的细条:

我应用过滤器,如下所示:

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滤镜有效地平衡图像?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1035504.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存