0

我正在尝试使用 GPUImageChromaKeyBlendFilter 在此图像中用纯黑色图像替换黑色/深灰色,但它似乎也在替换白色:

在此处输入图像描述

在此处输入图像描述

这是我的代码:

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];

我怎样才能使这项工作?

我注意到在这篇文章中,布拉德提到这个问题是由于消除了亮度:

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

“这与色度键控滤镜中的颜色匹配计算有关。它试图去除亮度分量,只匹配色度,因此对于白色或黑色,由于缺乏色度。你可以尝试深入研究色度键着色器,看看你可以改进那里的颜色匹配算法。

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

4

1 回答 1

0

嘿 Pranoy CI 与 GPUImageChromaKeyBlendFilter 有同样的问题,所以我制作了从背景中删除特殊像素的自定义函数,这些特殊像素可以由您根据 RGBA 定义,您可以使用它们,我在下面附上我的代码,

代码 -

#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

希望能帮助到你

于 2018-09-26T10:53:43.233 回答