しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

CoreImageのフィルターを試してみる(CICategoryColorAdjustment、その3)

下記事の続きです。
今回もフィルターを使った画像加工を試してみました。

llcc.hatenablog.com

今回はCICategoryColorAdjustmentのCILinearToSRGBToneCurve以降を見ていきます。

Core Image Filter Reference

実装内容は前回同様、以下のようになります。

import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        let imageView = UIImageView(image: #imageLiteral(resourceName: "image"))
        imageView.frame = CGRect(
            x: (view.frame.width - #imageLiteral(resourceName: "image").size.width) / 2, y: 20,
            width: #imageLiteral(resourceName: "image").size.width, height: #imageLiteral(resourceName: "image").size.height)
        view.addSubview(imageView)
        
        // フィルターをかける
        let filter = CIFilter(name: "CIBoxBlur")
        let ciImage = CIImage(image: #imageLiteral(resourceName: "image"))
        filter?.setValue(ciImage, forKey: kCIInputImageKey)
        if let filteredImage = filter?.outputImage {
            imageView.image = UIImage(ciImage: filteredImage)
        }
    }
}

f:id:llcc:20170919132939p:plain

CILinearToSRGBToneCurve

ドキュメントによると下のようなフィルターのようです。

Maps color intensity from a linear gamma curve to the sRGB color space.

let filter = CIFilter(name: "CILinearToSRGBToneCurve")
let ciImage = CIImage(image: #imageLiteral(resourceName: "image"))
filter?.setValue(ciImage, forKey: kCIInputImageKey)
if let filteredImage = filter?.outputImage {
    imageView.image = UIImage(ciImage: filteredImage)
}

実際に動かしたところ、元画像より少し薄くなりました。

f:id:llcc:20170919132957p:plain

CISRGBToneCurveToLinear

こちらはCILinearToSRGBToneCurveと反対で、SRGBToneCurveをLinearに直すものです。
先程と反対に、色が濃くなりました。

f:id:llcc:20170919140504p:plain

CITemperatureAndTint

色温度と色合いを変更できるフィルターです。
inputNeutralのxの値を少なくすると青っぽく、yの値を大きくすると赤っぽくなりました。
inputTargetNeutralについては効果がわかりませんでした。

let filter = CIFilter(name: "CITemperatureAndTint")
let ciImage = CIImage(image: #imageLiteral(resourceName: "image"))
filter?.setValue(ciImage, forKey: kCIInputImageKey)
filter?.setValue(CIVector(x: 6500, y: 0), forKey: "inputNeutral")
filter?.setValue(CIVector(x: 6500, y: 0), forKey: "inputTargetNeutral")
if let filteredImage = filter?.outputImage {
    imageView.image = UIImage(ciImage: filteredImage)
}

f:id:llcc:20170919141313p:plain

CIToneCurve

トーンカーブを変更できるフィルターです。

let filter = CIFilter(name: "CIToneCurve")
let ciImage = CIImage(image: #imageLiteral(resourceName: "image"))
filter?.setValue(ciImage, forKey: kCIInputImageKey)
filter?.setValue(CIVector(x: 0.00, y: 0.00), forKey: "inputPoint0")
filter?.setValue(CIVector(x: 0.25, y: 0.25), forKey: "inputPoint1")
filter?.setValue(CIVector(x: 0.50, y: 0.50), forKey: "inputPoint2")
filter?.setValue(CIVector(x: 0.75, y: 0.75), forKey: "inputPoint3")
filter?.setValue(CIVector(x: 1.00, y: 1.00), forKey: "inputPoint4")
if let filteredImage = filter?.outputImage {
    imageView.image = UIImage(ciImage: filteredImage)
}

下のようにx=0.5以降のyを1.0にすることで、白に近い色だけを更に白っぽくしたりできます。

filter?.setValue(CIVector(x: 0.00, y: 0.00), forKey: "inputPoint0")
filter?.setValue(CIVector(x: 0.25, y: 0.25), forKey: "inputPoint1")
filter?.setValue(CIVector(x: 0.50, y: 1.00), forKey: "inputPoint2")
filter?.setValue(CIVector(x: 0.75, y: 1.00), forKey: "inputPoint3")
filter?.setValue(CIVector(x: 1.00, y: 1.00), forKey: "inputPoint4")

f:id:llcc:20170919141910p:plain

CIVibrance

肌の色を保ちつつ、彩度を調整してくれるようです。

let filter = CIFilter(name: "CIVibrance")
let ciImage = CIImage(image: #imageLiteral(resourceName: "image"))
filter?.setValue(ciImage, forKey: kCIInputImageKey)
filter?.setValue(1000, forKey: "inputAmount")
if let filteredImage = filter?.outputImage {
    imageView.image = UIImage(ciImage: filteredImage)
}

f:id:llcc:20170919142205p:plain

CIWhitePointAdjust

Adjusts the reference white point for an image and maps all colors in the source using the new reference.

リファレンスによると上のようなフィルターでした。
青色を入れたら濃い目の青に、黄色を入れたらほぼそのままでした。
おそらく画像の基準の色(この写真だと黄色)とinputColorとの差分を元に何かしているのだと思います。

let filter = CIFilter(name: "CIWhitePointAdjust")
let ciImage = CIImage(image: #imageLiteral(resourceName: "image"))
filter?.setValue(ciImage, forKey: kCIInputImageKey)
filter?.setValue(CIColor.blue(), forKey: "inputColor")
if let filteredImage = filter?.outputImage {
    imageView.image = UIImage(ciImage: filteredImage)
}

f:id:llcc:20170919142714p:plain