2015-06-21 71 views
1

我想创建一个使用核心图像的直方图。我成功地将其显示(下面的代码)。然而,脑图的背景是灰色的。我怎样才能清楚它?核心图像滤镜背景

//Show Histogram 
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
CFDictionaryRef attachments = CMCopyDictionaryOfAttachments(kCFAllocatorDefault, sampleBuffer, kCMAttachmentMode_ShouldPropagate); 
CIImage *ciImage = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer options:(__bridge NSDictionary *)attachments]; 


NSUInteger count = 256; 
count = count <= 256 ? count : 256; 
count = count >= 1 ? count : 1; 


NSDictionary *params = @{kCIInputImageKey: ciImage, 
         kCIInputExtentKey: [CIVector vectorWithCGRect:[ciImage extent]], 
         @"inputCount": @(count), @"inputScale": @(100), 
         }; 

CIFilter *filter = [CIFilter filterWithName:@"CIAreaHistogram" 
         withInputParameters:params]; 


CIImage *outImage = [filter outputImage]; 
//--------------------------------------------- 

CIContext *context = [CIContext contextWithOptions:nil]; 

NSDictionary *params2 = @{ 
          kCIInputImageKey: outImage, 
          }; 
CIFilter *filter2 = [CIFilter filterWithName:@"CIHistogramDisplayFilter" 
         withInputParameters:params2]; 

CIImage *outputImage = [filter2 outputImage]; 
CGRect outExtent = [outputImage extent]; 
CGImageRef cgImage = [context createCGImage:outputImage 
            fromRect:outExtent]; 


UIImage *outImage2 = [UIImage imageWithCGImage:cgImage]; 
CGImageRelease(cgImage); 

// resize 
UIImage *resized = [self resizeImage:outImage2 
         withQuality:kCGInterpolationNone 
           rate:2.5]; 

回答

1

据我所知,没有参数可以自定义此滤镜生成的直方图的背景颜色。它本来就是这样的。苹果的documentation of the filter甚至出现相同的颜色(请看示例输出)。

我能想到的两种可能的解决方案:

  1. 编写自己的代码,或者寻找另一个库产生直方图;一个可以让你更好地控制输出。
  2. 如果您希望保留CoreImage代码,则需要对直方图图像执行其他处理。一种可能的解决方案是检查像素并检查直方图背景的特定灰度(137,137,137),然后将它们设置为透明。我不知道这是否是最好的解决方案,但它是有效的。

与第二个解决方案去,这里将变成灰色的颜色透明的方法:

-(UIImage*)removeColorFromImage:(UIImage*)sourceImage grayLevel:(int)grayLevel 
{ 
    int width = sourceImage.size.width * sourceImage.scale; 
    int height = sourceImage.size.height * sourceImage.scale; 
    CGFloat scale = sourceImage.scale; 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, width * 4, colorSpace, kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedFirst); 
    CGColorSpaceRelease(colorSpace); 

    CGContextDrawImage(context, CGRectMake(0, 0, width, height), sourceImage.CGImage); 

    unsigned int *colorData = CGBitmapContextGetData(context); 

    for (int i = 0; i < width * height; i++) 
    { 
     unsigned int color = *colorData; 

     short a = color & 0xFF; 
     short r = (color >> 8) & 0xFF; 
     short g = (color >> 16) & 0xFF; 
     short b = (color >> 24) & 0xFF; 

     if ((r == grayLevel) && (g == grayLevel) && (b == grayLevel)) 
     { 
      a = r = g = b = 0; 
      *colorData = (unsigned int)(r << 8) + ((unsigned int)(g) << 16) + ((unsigned int)(b) << 24) + ((unsigned int)(a)); 
     } 

     colorData++; 
    } 

    CGImageRef output = CGBitmapContextCreateImage(context); 
    UIImage* retImage = [UIImage imageWithCGImage:output scale:scale orientation:UIImageOrientationUp]; 

    CGImageRelease(output); 
    CGContextRelease(context); 

    return retImage; 
} 

现在调用这个方法您的最终图像上:

resized = [self removeColorFromImage:resized grayLevel:137]; 
+0

这是有效的。谢谢! – Gizmodo

+0

这可能与上面的代码无关;但是,我得到条纹的原因是什么?它与上面的代码无关,它不是一个坚实的山谷http://s24.postimg.org/h9q59n45h/Screen_Shot_2015_06_24_at_5_00_58_PM.png – Gizmodo

+0

@gizmodo。即使你不使用它,你会注意到条纹出现,但是呈现灰色。代码只是让它透明。可能是因为你可以调整一些参数来控制它? – Artal

0

顺便说一句,需要一行来创建直方图图像:

CIImage *histogramImage = [CIFilter filterWithName:@"CIHistogramDisplayFilter" keysAndValues:kCIInputImageKey, self.inputImage, @"inputHeight", @100.0, @"inputHighLimit", @1.0, @"inputLowLimit", @0.0, nil].outputImage;