gpt4 book ai didi

cocoa - 如何使用 Core Image 滤镜有效地平衡图像的色彩?

转载 作者:行者123 更新时间:2023-12-03 16:01:24 25 4
gpt4 key购买 nike

我正在尝试使用 Core Image 滤镜为我的 Mac 应用程序中的图像添加一些颜色校正。首先,我正在考虑允许自定义白平衡,以消除图像中的色偏。看起来 CIWhitePointAdjust 正是我正在寻找的,但是在尝试之后,我不确定我是否使用了它错误,或者它是否没有按照我的想法做.

从这张图片开始,随着时间的推移泛黄,并且右边缘有一条细细的白色 strip :

Original image

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

NSColor *whiteSample = // Chosen from the speech bubble's background
CIColor *whiteInputColor = [[CIColor alloc] initWithColor:whiteSample];

layer.filters = @[
[CIFilter filterWithName:@"CIWhitePointAdjust"
withInputParameters:@{kCIInputColorKey: whiteInputColor}]
];

并取回此图像:

Image after applying CIFilter

请注意,它看起来比原来的更暗、更黄(与我想要的效果相反)。我一直期待一种更像在 Photoshop 中执行自动颜色的效果,如下所示:

Photoshopped color balance

我是否错误地使用了CIWhitePointAdjust,或者它是否适合这项工作?如果其他过滤器或过滤器组合效果更好,我很想知道。

由于我正在操作 CALayer 对象中已有的图像,因此 Core Image 过滤器看起来绝对是正确的选择,但如果这只能通过其他方式实现,我愿意那个。

更新

一个helpful answer在信号处理网站上给我我想要实现的名称。从广义上讲,它称为直方图均衡化。我试图弄清楚是否有一种方法可以使用核心图像过滤器来执行该过程,到目前为止,它看起来不太有希望(没有我自己编写)。

最佳答案

好吧,我想我已经成功了!这是我从 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* -> CGImageRef
CIImage *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 CGImage
CGImageRef 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, height, width, 8 * sizeof( uint8_t ), kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageBuffer_Init (red) error: %ld", err);

err = vImageBuffer_Init( &_dstG, height, width, 8 * sizeof( uint8_t ), kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageBuffer_Init (green) error: %ld", err);

err = vImageBuffer_Init( &_dstB, height, width, 8 * sizeof( uint8_t ), 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, &_dstR, kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageEqualization_Planar8 (red) error: %ld", err);

err = vImageEqualization_Planar8(&_dstG, &_dstG, kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageEqualization_Planar8 (green) error: %ld", err);

err = vImageEqualization_Planar8(&_dstB, &_dstB, kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageEqualization_Planar8 (blue) error: %ld", err);

err = vImageConvert_Planar8toARGB8888(&_dstA, &_dstR, &_dstG, &_dstB, &_img, kvImageNoFlags);
if (err != kvImageNoError)
NSLog(@"vImageConvert_Planar8toARGB8888 error: %ld", err);

err = vImageContrastStretch_ARGB8888( &_img, &_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, &format, NULL, NULL, 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 上寻找“自动级别”却一无所获,我希望这对其他人可能有用。

关于cocoa - 如何使用 Core Image 滤镜有效地平衡图像的色彩?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30362906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com