首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS GPUImage - chroma-keying GPUImageChromaKeyBlendFilter不适用于用白色替换图像上的黑色/灰色

iOS GPUImage - chroma-keying GPUImageChromaKeyBlendFilter不适用于用白色替换图像上的黑色/灰色
EN

Stack Overflow用户
提问于 2018-07-20 15:11:06
回答 1查看 586关注 0票数 0

我试图用GPUImageChromaKeyBlendFilter将图片中的黑色/深灰色替换为纯黑色图像,但它似乎也在替换白色图像:

下面是我的代码:

代码语言:javascript
复制
stillImageSource = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"head.jpg"]];
blackImageSource = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"black.jpg"]];

filter = [[GPUImageChromaKeyBlendFilter alloc] init];

 [(GPUImageChromaKeyBlendFilter *)filter setColorToReplaceRed:0.27 green:1.0 blue:1.0];
[(GPUImageChromaKeyBlendFilter *)filter setThresholdSensitivity:self.myslider.value];

[stillImageSource addTarget:filter];
[blackImageSource addTarget:filter];


[filter addTarget:self.mygpuimageview];
[stillImageSource processImage];
[blackImageSource processImage];

我怎么才能让它工作呢?

我注意到在这篇文章中,Brad提到这个问题是由于删除亮度造成的:

https://github.com/BradLarson/GPUImage/issues/2256

“这与色度键控滤镜中的颜色匹配计算有关。它试图删除亮度分量,仅根据色度进行匹配,因此对于白色或黑色,由于色度不足,它很难匹配目标颜色。您可以尝试深入色度键控着色器,看看您可以改进其中的颜色匹配算法。”

有没有办法在键控时也考虑到亮度?一般来说,我对GPUImage和图像操作非常陌生,所以我甚至不知道如何修改亮度的代码。

EN

回答 1

Stack Overflow用户

发布于 2018-09-26 18:53:43

嘿Pranoy C我在GPUImageChromaKeyBlendFilter上也有同样的问题,所以我做了一个自定义函数来从背景中删除特殊的像素,这些特殊的像素可以由你在RGBA的基础上定义,你可以使用它们,我附上了下面的代码,

代码-

代码语言:javascript
复制
#import "UIImage+BackgroundRemove.h"

#define Mask8(x) ( (x) & 0xFF )
#define R(x) ( Mask8(x) )
#define G(x) ( Mask8(x >> 8 ) )
#define B(x) ( Mask8(x >> 16) )
#define A(x) ( Mask8(x >> 24) )
#define RGBAMake(r, g, b, a) ( Mask8(r) | Mask8(g) << 8 | Mask8(b) << 16 | Mask8(a) << 24 )

@implementation UIImage (BackgroundRemoval)


- (UIImage *)removeBlackBackGroundFromImage {


    CGImageRef inputCGImage = self.CGImage;

    UInt32 * inputPixels;

    NSUInteger inputWidth = CGImageGetWidth(inputCGImage);
    NSUInteger inputHeight = CGImageGetHeight(inputCGImage);

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    NSUInteger bytesPerPixel = 4;
    NSUInteger bitsPerComponent = 8;

    NSUInteger inputBytesPerRow = bytesPerPixel * inputWidth;

    inputPixels = (UInt32 *)calloc(inputHeight * inputWidth, sizeof(UInt32));

    CGContextRef context = CGBitmapContextCreate(inputPixels, inputWidth, inputHeight,
                                                 bitsPerComponent, inputBytesPerRow, colorSpace,
                                                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

    CGContextDrawImage(context, CGRectMake(0, 0, inputWidth, inputHeight), inputCGImage);

    for (NSUInteger j = 0; j < inputHeight; j++) {


        for (NSUInteger i = 0; i < inputWidth; i++) {
            UInt32 * currentPixel = inputPixels + (j * inputWidth) + i;
            UInt32 color = *currentPixel;

            if (R(color) == 0 &&
                G(color) == 0 &&
                B(color) == 0)  {
                *currentPixel = RGBAMake(0,0,0, A(0));
            }else{
                continue;
            }
        }
    }

    CGImageRef newCGImage = CGBitmapContextCreateImage(context);
    UIImage * imageToReturn = [UIImage imageWithCGImage:newCGImage];
    CGImageRelease(newCGImage);

    CGColorSpaceRelease(colorSpace);
    CGContextRelease(context);
    free(inputPixels);
    return imageToReturn;

}

这里我从背景中删除了黑色,但在你的例子中,你可以将黑色添加到那些特定颜色的像素中,这是我使用的:P

希望能有所帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51437007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档