iOS GPUImage — хроматический ключ GPUImageChromaKeyBlendFilter не работает с заменой черного/серого на изображении белым

Я пытаюсь заменить черный/темно-серый на чисто черное изображение на этом изображении, используя 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 и манипулировании изображениями в целом, поэтому я понятия не имею, как даже изменить код для яркости.


person sudoExclaimationExclaimation    schedule 20.07.2018    source источник
comment
@Brad Larson Пожалуйста, помогите мне, я застрял здесь :(   -  person sudoExclaimationExclaimation    schedule 20.07.2018
comment
ты нашел решение? чем, пожалуйста, скажи мне, что я застрял здесь.   -  person    schedule 12.01.2021


Ответы (1)


Привет, Pranoy C. У меня была такая же проблема с 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

Надеюсь, поможет

person Shivam Gaur    schedule 26.09.2018