CI过滤器创建黑白图像?

Ada*_*dam 9 cocoa objective-c

我有一个CIImage我需要在我的Cocoa/Objective C程序中从颜色转换为Black和White.Peter H.之前向我指出了这个链接http://www.codingadventures.com/2008/06/threshold-filter-in-glsl/作为一种潜在的解决方案...但是我在那里编译内核例程时遇到了麻烦(参见单独的线程,如果感兴趣).

所以我想知道其他一个内置的CIFilter是否会完成我想要做的事情.我不想要灰度图像...我希望结果图像中的每个像素都是黑色或白色 - 我只需要能够告诉过滤器如何确定哪些像素应该变成黑色哪个像素应该变成白色.Photoshop中的"阈值"滤镜就是这样 - 它让我指定"阈值"然后它使用此值来决定哪些像素变为白色而哪些像素变为黑色.这就是我试图通过我的Xcode项目中的代码"复制".

如果其中一个内置过滤器可以用于此任何想法?谢谢.

Jos*_*zzi 10

您可以使用CIColorMap过滤器.给它一个20(w)乘1(h)的jpg,其中左半部分是白色,右半部分是黑色(或者相反),并将其用作颜色图渐变.这似乎很好地打破了颜色.我最初尝试使用1个白色像素和一个黑色的2x1图像,但看起来它有点内插.我上升到20x1,它工作正常.

提示:我使用Core Image Funhouse(不是Quartz Composer)进行实验.


Jim*_*rue 6

花了一些时间来弄清楚CIColorMap的代码所以我想发布这个.约书亚有上面的答案.这只是实施的一个例子......

CIImage *beginImage = [CIImage imageWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"wedding" ofType:@"jpg"]]];
CIImage *inputGradientImage = [CIImage imageWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"grad" ofType:@"png"]]];
CIContext *context = [CIContext contextWithOptions:nil];
CIFilter *filter = [CIFilter filterWithName:@"CIColorMap" keysAndValues:kCIInputImageKey, beginImage, @"inputGradientImage",inputGradientImage, nil];
CIImage *outputImage = [filter outputImage];
CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
UIImage *newImage = [UIImage imageWithCGImage:cgimg];
self.imageView.image = newImage;
CGImageRelease(cgimg);
Run Code Online (Sandbox Code Playgroud)


Mar*_*k H 5

互联网上的许多解决方案都会创建灰度值.不需要过滤器.如果你需要使用这样的代码,比如

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
CGImageRef greyImage = CGImageCreateCopyWithColorSpace(backingImage, colorSpace);
CGColorSpaceRelease(colorSpace);
Run Code Online (Sandbox Code Playgroud)

正确的阈值过滤器如下:inputThreshold可以是从0.0f到0.5f的浮点值

https://gist.github.com/xhruso00/a3f8a9c8ae7e33b8b23d

详细的食谱可以在https://developer.apple.com/library/ios/documentation/graphicsimaging/Conceptual/CoreImaging/ci_custom_filters/ci_custom_filters.html#//apple_ref/doc/uid/TP30001185-CH6-CJBEDHHH找到

#include <metal_stdlib>
using namespace metal;

//https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_palettes

//https://en.wikipedia.org/wiki/Relative_luminance
//https://en.wikipedia.org/wiki/Grayscale
constant half3 kRec709Luma  = half3(0.2126, 0.7152, 0.0722);
constant half3 kRec601Luma  = half3(0.299 , 0.587 , 0.114);
//constant float3 kRec2100Luma = float3(0.2627, 0.6780, 0.0593);

#include <CoreImage/CoreImage.h>

extern "C" { namespace coreimage {

    half lumin601(half3 p)
    {
        return dot(p.rgb, kRec601Luma);
    }

    half lumin709(half3 p)
    {
        return dot(p.rgb, kRec709Luma);
    }

    half4 thresholdFilter(sample_h image, half threshold)
    {
        half4 pix = unpremultiply(image);
        half luma = lumin601(pix.rgb);
        pix.rgb = half3(step(threshold, luma));
        return premultiply(pix);
    }
}}
Run Code Online (Sandbox Code Playgroud)

更新了黑白(左)和灰度(右)之间的视觉差异

在此输入图像描述