2012-01-16 1 views
1

CGImageがあり、主に明るいか主に暗いかを判別したい。私は確かに行列を繰り返して、十分な数のピクセルが所望の閾値を超えているかどうかを確かめることができる。しかし、私は画像処理に慣れていないので、CoreGraphicsやQuartzには、より適した、さらには高速化された組み込み関数がなければならないと仮定します。CGImageをバイナリで量子化する(画像は主に明るく、または暗い)

答えて

2

CoreGraphics(別名Quartz 2D)にはこれに関する機能はありません。 Mac OS XのCoreImageにはCIAreaAverageCIAreaHistogramがありますが、iOS(5.0.1以降)にはこれらのフィルタがないと思います。

iOSはthe Accelerate frameworkです。 vImageHistogramCalculation_ARGBFFFF関数と関連する関数が役に立ちます。

+0

は、応答をありがとうございました。あなたが指摘したように。 CIAreaAverageは私が必要としていた帽子のように見えます。だから私は手でti di utを持っていると思いますか? – nambrot

+0

あなたはたぶんそれを手作業で行うべきです。 –

0

強度ヒストグラムよりも、特定の測定基準を測定するためのより迅速かつ効果的な方法があります。実際には、それを測定するだけの場合です。

イメージキーイングは別です。それは輝度の和の平均によって決定されるが、それらをビニングする必要はない。画像のキーイング式によって返される値は、必要に応じてローカルの適応的な色調範囲マッピング(あなたが望むもの)に使用できます。単純なガンマ調整を使用します(ピクセルの輝度値は、イメージキー値)。

これは難しいことではなく、明るく暗いイメージをより迅速かつ効果的に区別するためのスキルと経験があることは明らかです。

さらに、ヒストグラムの代わりにイメージメトリックの式を使用するパターンと実践を確立する必要があります。彼らは単に情報を収集するのではなく、情報を解釈するように設計されています。それだけでなく、相互運用性があり、Core Imageフィルタと同様に、他のレイヤーの上に積み重ねることができます。詳細については

は、読み:画像キーへの適応と

ガンマ補正を、ローレンス・メランによる高ダイナミックレンジ画像のためのトーンマッピングの14ページ。ここで

1

はiOSアプリでCIAreaAverageを使用する方法は次のとおりです。

CGRect inputExtent = [self.inputImage extent]; 
    CIVector *extent = [CIVector vectorWithX:inputExtent.origin.x 
              Y:inputExtent.origin.y 
              Z:inputExtent.size.width 
              W:inputExtent.size.height]; 
    CIImage* inputAverage = [CIFilter filterWithName:@"CIAreaAverage" keysAndValues:@"inputImage", self.inputImage, @"inputExtent", extent, nil].outputImage; 

    //CIImage* inputAverage = [self.inputImage imageByApplyingFilter:@"CIAreaMinimum" withInputParameters:@{@"inputImage" : inputImage, @"inputExtent" : extent}]; 
    EAGLContext *myEAGLContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; 
    NSDictionary *options = @{ kCIContextWorkingColorSpace : [NSNull null] }; 
    CIContext *myContext = [CIContext contextWithEAGLContext:myEAGLContext options:options]; 

    size_t rowBytes = 32 ; // ARGB has 4 components 
    uint8_t byteBuffer[rowBytes]; // Buffer to render into 

    [myContext render:inputAverage toBitmap:byteBuffer rowBytes:rowBytes bounds:[inputAverage extent] format:kCIFormatRGBA8 colorSpace:nil]; 

    const uint8_t* pixel = &byteBuffer[0]; 
    float red = pixel[0]/255.0; 
    float green = pixel[1]/255.0; 
    float blue = pixel[2]/255.0; 
    NSLog(@"%f, %f, %f\n", red, green, blue); 


    return outputImage; 
} 

@end 
関連する問題