我试图用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];我怎么才能让它工作呢?
我注意到在这篇文章中,Brad提到这个问题是由于删除亮度造成的:
https://github.com/BradLarson/GPUImage/issues/2256
“这与色度键控滤镜中的颜色匹配计算有关。它试图删除亮度分量,仅根据色度进行匹配,因此对于白色或黑色,由于色度不足,它很难匹配目标颜色。您可以尝试深入色度键控着色器,看看您可以改进其中的颜色匹配算法。”
有没有办法在键控时也考虑到亮度?一般来说,我对GPUImage和图像操作非常陌生,所以我甚至不知道如何修改亮度的代码。
发布于 2018-09-26 18:53:43
嘿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
希望能有所帮助
https://stackoverflow.com/questions/51437007
复制相似问题