gpt4 book ai didi

objective-c - 使用 CIFilter 和 CISpotColor 正确过滤 NSImage/CIImage

转载 作者:太空狗 更新时间:2023-10-30 03:54:43 25 4
gpt4 key购买 nike

请注意:这是针对在 Mac OSX 上运行的 Cocoa 命令行应用,不是 iOS 应用

我在理解 Limited Documentation 时遇到了一些问题Apple 为 CISpotColor 过滤器提供(使用 CIFilter )。


TL DR;

1) 关于 CIFilter,特别是 CISpotColor,我是否遗漏了更多文档?

2) 考虑到我想要实现的目标(如下图所示,但简要说明:用白色替换所有不“看起来像红色”的东西,并强制所有“看起来像红色”的东西变成纯红色,或者只是黑色),CISpotColor 是我应该使用的正确滤镜吗?

3) 如果不是,您建议使用什么过滤器(或者我应该尝试编写自定义过滤器?)

4) 如果 CISSpotColor 是正确的过滤器,我应该使用什么参数来实现我想要实现的目标。如果我需要多次使用 CISpotColor CIFilter,没关系,我不希望您为我编写代码,只需为我指出正确的方向即可。


上述问题的更多细节和背景:

link above给出了参数列表、一些默认值和图片前后的示例,但没有生成示例后图像的示例代码,也没有解释参数的实际含义或它们的有效范围。

老实说,我不完全确定 CISpotColor 是否是我想要的滤镜,除了它的名称和句子“用专色替换一个或多个颜色范围”,还有没有解释它是如何做的。

因为它似乎描述了我所追求的东西,所以我选择它作为起点,让我开始以这种方式使用过滤器。

输入图片(视频中的一帧) enter image description here

所需的输出(选项 1 - 纯红色 - 使用 GIMP 创建) enter image description here

所需的输出(选项 2 - 纯黑色 - 也是使用 GIMP 创建的) enter image description here

我的代码得到了什么(见下面的 list ) enter image description here

这接近我的需要,但似乎没有考虑到原始图像中灰色或“偏白”的区域将具有相似数量的红色、绿色和蓝色,而不是主要是红色,这会使它“看起来很红”。如果它过滤掉你在右下角看到的区域,我可以使用它,这显然只是被包括在内,因为那里有一些红色像素(以及一些绿色和蓝色,使得它在原始中通常是灰色的) .

这是 cocoa 命令行应用 (Mac OSX) 的完整“main.m”

#import <Foundation/Foundation.h>
#import <CoreGraphics/CoreGraphics.h>
#import <AppKit/AppKit.h>
#import <QuartzCore/QuartzCore.h>



@interface NSImage(saveAsJpegWithName)
- (void) saveAsPNGWithName:(NSString*) fileName;
- (NSImage*) filterEverythingButRed ;
@end

@implementation NSImage(saveAsJpegWithName)

- (void) saveAsPNGWithName:(NSString*) fileName
{
NSData *imageData = [self TIFFRepresentation];
NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:imageData];
NSDictionary *imageProps = nil;
imageData = [imageRep representationUsingType:NSPNGFileType properties:imageProps];
[imageData writeToFile:fileName atomically:NO];
}

-(NSImage*) filterEverythingButRed {

CIImage *inputImage = [[CIImage alloc] initWithData:[self TIFFRepresentation]];

CIFilter *hf = [CIFilter filterWithName:@"CISpotColor"];
[hf setDefaults];
[hf setValue:inputImage forKey:@"inputImage"];
[hf setValue:[CIColor colorWithRed:1.0 green:0.0 blue:0.0] forKey: @"inputCenterColor1"];
[hf setValue:[CIColor colorWithRed:1.0 green:0.0 blue:0.0] forKey: @"inputReplacementColor1"];
[hf setValue:[NSNumber numberWithFloat:0.1] forKey: @"inputCloseness1"];
[hf setValue:[NSNumber numberWithFloat:1.0] forKey: @"inputContrast1"];

CIImage *outputImage = [hf valueForKey: @"outputImage"];

NSImage *resultImage = [[NSImage alloc] initWithSize:[outputImage extent].size];
NSCIImageRep *rep = [NSCIImageRep imageRepWithCIImage:outputImage];
[resultImage addRepresentation:rep];

return resultImage;
}

@end


int main(int argc, const char * argv[]) {


NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

if (argc == 1) {

NSString * appname = [NSString stringWithFormat: @"%s", argv[0]];

NSLog(@"Usage: %@ filename", appname);

} else {

NSString * filename = [NSString stringWithFormat: @"%s", argv[1]];

NSFileManager *fm = [NSFileManager defaultManager];

if ([fm fileExistsAtPath:filename]) {

NSLog(@"opening file:%@", filename);


NSImage *img = [[NSImage alloc] initWithContentsOfFile:filename];

[[img filterEverythingButRed]
saveAsPNGWithName:[[filename stringByDeletingPathExtension] stringByAppendingString:@"-red.png"]];




} else {

NSLog(@"file not found:%@", filename);
}

}


[pool release];
return 0;
}

最佳答案

CISpotColor 基本上执行四种颜色操作:

  1. 将所有靠近 inputCenterColor1 的颜色替换为 inputReplacementColor1
  2. 将所有靠近 inputCenterColor2 的颜色替换为 inputReplacementColor2
  3. inputReplacementColor3 替换所有靠近 inputCenterColor3 的颜色。
  4. 用白色替换其他所有内容。

默认情况下,输入颜色设置为各种红色/粉红色调。您可以在构造代码并调用 setDefaults 后通过检查代码中的那些过滤器值来找到它们——但为了便于说明,这里是 Core Image Fun House 的屏幕截图中的所有默认值。示例代码应用:

CISpotColor defaults

使用默认选项应用过滤器可以得到:

filtered with defaults

请注意,红色环(您试图成为图像中唯一剩余元素的部分)看起来像默认的 inputReplacementColor3,而右下角的亮区看起来像默认 inputReplacementColor2...就像他们在 your output image 中所做的一样.那是因为您只配置了第一对中心/替换颜色,而其他两个保留了它们的红色/粉红色默认值。

如果您想禁用第二个和第三个颜色替换,请将它们的Closeness 参数调低至 0.0 和/或将它们的Contrast 参数调高至 1.0。为了安全起见,您还可以将它们的中心颜色 设置为您的图像中未显示的颜色。在您的测试图像中,我发现只需调低 Closeness 就足够了:

new settings

这会得到以下输出:

new output

顺便说一下,像这样的专色替换是颜色查找表 (CLUT) 操作的一种简单形式,由 CIColorCube 实现筛选。如果您希望能够在 CISpotColor 提供的范围之外微调颜色替换,颜色立方体选项可能是一个不错的选择。有一个使用它来实现绿屏效果的教程 in Apple's programming guide .

简单描述:

  1. 所有 过滤器参数设置适当的值,而不仅仅是前几个,否则其他默认值可能会做出您意想不到的事情。将 inputCloseness2inputCloseness3 设置为零并保留所有其他默认值(但对于您已经设置的 input...1 参数)似乎为您的测试图像工作。

  2. 为您的过滤器提供一个实时测试环境确实可以帮助您微调参数(并确保默认值符合您的预期)。 Core Image Fun House非常适合。

关于objective-c - 使用 CIFilter 和 CISpotColor 正确过滤 NSImage/CIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23851715/

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