しめ鯖日記

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

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

下の続きになります。

www.cl9.info

今回もCoreImageのフィルターを使って画像加工を実装していきます。
フィルターはCICategoryColorAdjustmentのCIColorPolynomial以降を見ていきます。

https://developer.apple.com/library/content/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIColorPolynomial

実装は下の通りです。
画像は今回もぱくたそ様のものを利用させて頂きました。

import UIKit
import CoreImage

class ViewController: UIViewController {
    let imageView = UIImageView(image: #imageLiteral(resourceName: "image"))
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        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:20170915144821p:plain

CIColorPolynomial

CIColorPolynomialは3次多項式を追加する事で色の変更を行うようです。
説明だけでは分からなかったので実際に試してみたいと思います。

フィルターは、下のような値をセットする事ができます。
各色のデフォルト値はCIVector(x: 0, y: 1, z: 0, w: 0)です。

let filter = CIFilter(name: "CIColorPolynomial")
let ciImage = CIImage(image: #imageLiteral(resourceName: "image"))
filter?.setValue(ciImage, forKey: kCIInputImageKey)
filter?.setValue(CIVector(x: 0, y: 1, z: 0, w: 0), forKey: "inputRedCoefficients")
filter?.setValue(CIVector(x: 0, y: 1, z: 0, w: 0), forKey: "inputGreenCoefficients")
filter?.setValue(CIVector(x: 0, y: 1, z: 0, w: 0), forKey: "inputBlueCoefficients")
filter?.setValue(CIVector(x: 0, y: 1, z: 0, w: 0), forKey: "inputAlphaCoefficients")
if let filteredImage = filter?.outputImage {
    imageView.image = UIImage(ciImage: filteredImage)
}

inputRedCoefficientsの値を色々変更してみました。
まずはxを0から1に変更しました。

filter?.setValue(CIVector(x: 1, y: 1, z: 0, w: 0), forKey: "inputRedCoefficients")

かなり強い赤になりました。

f:id:llcc:20170915145929p:plain

続けてzを1にします。

filter?.setValue(CIVector(x: 0, y: 1, z: 1, w: 0), forKey: "inputRedCoefficients")

先程よりは弱めの赤になりました。

f:id:llcc:20170915150008p:plain

wを1にした場合も弱めの赤になりました。

f:id:llcc:20170915150108p:plain

逆にyを0にすると、赤が消えて青っぽい画像になりました。

filter?.setValue(CIVector(x: 0, y: 0, z: 0, w: 0), forKey: "inputRedCoefficients")

f:id:llcc:20170915150204p:plain

CIExposureAdjust

こちらは露光の調整をしてくれるフィルターです。
inputEVの値を1にする事で、明るい写真になります。

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

f:id:llcc:20170915150356p:plain

CIGammaAdjust

画像のガンマ値を調整する機能です。
inputPowerという値をセットして色を調整します。

ドキュメントによると、inputPowerはpow(s.rgb, vec3(power))という式で適用されます。
つまり下のように1より大きい値を入れると色がかなり暗くなります。

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

f:id:llcc:20170915151114p:plain

CIHueAdjust

色相を調整するフィルターです。
inputAngleに角度を入れる事で調整できます。

inputAngleの単位はラジアンで、下の場合は真逆の色相に変換しています。

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

f:id:llcc:20170915151724p:plain