[iOS 7] 追加された画像フィルタ郡 (4) その他のフィルタ

2013.09.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

フィルタ郡の紹介も、今回が最後になります。
最後に、どこにも属さないけれどあったら便利そうなフィルタを一気に紹介します。
今回のフィルタ追加は、iPhone5sになることで、 Apple A7へのCPU強化、さらにApple M7へのモーション系処理CPUが追加されたこと、カメラ機能が強化されたことによる機能拡張だったようです。
これまでは、外部ライブラリを使用するか、自分で画像処理ルーチンを実装する必要がありましたが、それらをOS標準のCoreImage Frameworkで使用できるようになったのは、格段に便利に、ハードルが下がりましたね。

CILinearToSRGBToneCurve

 リニア表示の画像をstandard RGB表示にトーンカーブによる階調補正を行います。
あまり明るくない室内のディスプレイ等で、実際に撮影した色合いと表示した時の差異をなくすような補正で、画面で見る限りオリジナルよりも少し淡く、明るい補正になります。
ソースコードは次のようになります。

/* フィルタをONにする */
/* ファイルを読み込む */
CIImage *ciImage = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"original.jpg"]];

/* フィルタを読み込む */
CIFilter *ciFilter = [CIFilter filterWithName:@"CILinearToSRGBToneCurve" keysAndValues:kCIInputImageKey, ciImage, nil];

/* 画像を画面に表示する */
CIContext *ciContext = [CIContext contextWithOptions:nil];
CGImageRef cgimg = [ciContext createCGImage:[ciFilter outputImage] fromRect:[[ciFilter outputImage] extent]];
_mainImage.image = [UIImage imageWithCGImage:cgimg scale:1.0f orientation:UIImageOrientationUp];
CGImageRelease(cgimg);

 このソースを実行した写真が下記のようになります。

LinearToSRGBToneCurve

CISRGBToneCurveToLinear

 先ほどの、standard RGMを、逆にリニアRGBに階調補正を行います。
CILinearToSRGBToneCurveが明るくなった反面、このフィルタを通すと、少し暗くなったイメージを抱きます。
ソースは次のようになります。

/* フィルタをONにする */
/* ファイルを読み込む */
CIImage *ciImage = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"original.jpg"]];

/* フィルタを読み込む */
CIFilter *ciFilter = [CIFilter filterWithName:@"CISRGBToneCurveToLinear" keysAndValues:kCIInputImageKey, ciImage, nil];

/* 画像を画面に表示する */
CIContext *ciContext = [CIContext contextWithOptions:nil];
CGImageRef cgimg = [ciContext createCGImage:[ciFilter outputImage] fromRect:[[ciFilter outputImage] extent]];
_mainImage.image = [UIImage imageWithCGImage:cgimg scale:1.0f orientation:UIImageOrientationUp];
CGImageRelease(cgimg);

 このソースを実行した写真が下記のようになります。

SRGBToneCurveToLinear

CIColorPolynomial

 カラー多項式パレットによる補正を行います。それぞれの深度をCIVector型で指定します。具体的な計算式は
r = rCoeff[0] + rCoeff[1] * r + rCoeff[2] * r*r + rCoeff[3] * r*r*r
のように、Red,Green,Blue,Alphaそれぞれにあります。
サンプルソースは下記のようになります。

/* フィルタをONにする */
/* ファイルを読み込む */
CIImage *ciImage = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"original.jpg"]];

/* フィルタを読み込む */
CIFilter *ciFilter = [CIFilter filterWithName:@"CIColorPolynomial" keysAndValues:kCIInputImageKey, ciImage, nil];

/* オプション */
CIVector *r = [[CIVector alloc] initWithX:0 Y:0.2 Z:0 W:0];
CIVector *g = [[CIVector alloc] initWithX:0 Y:0.2 Z:0 W:0];
CIVector *b = [[CIVector alloc] initWithX:0 Y:0.5 Z:0 W:1];
CIVector *a = [[CIVector alloc] initWithX:0 Y:0.5 Z:1 W:0];
[ciFilter setValue:r forKey:@"inputRedCoefficients"];
[ciFilter setValue:g forKey:@"inputGreenCoefficients"];
[ciFilter setValue:b forKey:@"inputBlueCoefficients"];
[ciFilter setValue:a forKey:@"inputAlphaCoefficients"];

/* 画像を画面に表示する */
CIContext *ciContext = [CIContext contextWithOptions:nil];
CGImageRef cgimg = [ciContext createCGImage:[ciFilter outputImage] fromRect:[[ciFilter outputImage] extent]];
_mainImage.image = [UIImage imageWithCGImage:cgimg scale:1.0f orientation:UIImageOrientationUp];
CGImageRelease(cgimg);

ColorPolynomial

パラメータで、Blue補正を強くした形になります。全体的に青がかってるのがわかりますね。

CIVignetteEffect

 ビネット、つまり背景をぼかした、局所を目立たせるためのエフェクトです。画面でスポットライトを当てる似たような形になります。
ソースを次のように書きます。

/* フィルタをONにする */
/* ファイルを読み込む */
CIImage *ciImage = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"original.jpg"]];

/* フィルタを読み込む */
CIFilter *ciFilter = [CIFilter filterWithName:@"CIVignetteEffect" keysAndValues:kCIInputImageKey, ciImage, nil];

/* オプション */
/* センター */
CIVector *vct = [[CIVector alloc] initWithX:430 Y:200];
[ciFilter setValue:vct forKey:@"inputCenter"];
/* 深度(大きければ大きいほど外部へ向かって暗くなる) */
[ciFilter setValue:[NSNumber numberWithFloat:0.9] forKey:@"inputIntensity"];

/* 画像を画面に表示する */
CIContext *ciContext = [CIContext contextWithOptions:nil];
CGImageRef cgimg = [ciContext createCGImage:[ciFilter outputImage] fromRect:[[ciFilter outputImage] extent]];
_mainImage.image = [UIImage imageWithCGImage:cgimg scale:1.0f orientation:UIImageOrientationUp];
CGImageRelease(cgimg);

このソースを実行した写真が下記のようになります。

 VignetteEffect

見事に、浮かれている彼が目立つ形になりました。