ObjecTips

Swift & Objective-C で iOS とか macOS とか

iOS 13 で追加された Core Image の CIFilter

iOS 13 で何か追加の CIFilter はあったかな?と思って diff を取ってみたら面白かった。
使った出力はワンライナーでこれ

CIFilter.filterNames(inCategory: nil).forEach{print($0)}

CIFilter Changes iOS 12 - iOS 13
https://gist.github.com/86315376f00fa44662f0d841f046e5d2/revisions

iOS 13 beta 1

CIDocumentEnhancer
// CICategoryColorEffect
public protocol CIDocumentEnhancer : CIFilterProtocol {
    @available(iOS 5.0, *)
    var inputImage: CIImage? { get set }
    var amount: Float { get set }
}

f:id:Koze:20190623235940p:plain

CIKMeans

No Header!

CIMorphologyRectangleMaximum
// CICategoryBlur
public protocol CIMorphologyRectangleMaximum : CIFilterProtocol {
    @available(iOS 5.0, *)
    var inputImage: CIImage? { get set }
    var width: Float { get set }
    var height: Float { get set }
}

f:id:Koze:20190624000259p:plain

CIMorphologyRectangleMinimum
// CICategoryBlur
public protocol CIMorphologyRectangleMinimum : CIFilterProtocol {
    @available(iOS 5.0, *)
    var inputImage: CIImage? { get set }
    var width: Float { get set }
    var height: Float { get set }
}

f:id:Koze:20190624000623p:plain

CIPaletteCentroid
// CICategoryColorEffect
public protocol CIPaletteCentroid : CIFilterProtocol {
    @available(iOS 5.0, *)
    var inputImage: CIImage? { get set }
    @available(iOS 5.0, *)
    var paletteImage: CIImage? { get set }
    var perceptual: Bool { get set }
}
CIPalettize
// CICategoryColorEffect
public protocol CIPalettize : CIFilterProtocol {
    @available(iOS 5.0, *)
    var inputImage: CIImage? { get set }
    @available(iOS 5.0, *)
    var paletteImage: CIImage? { get set }
    var perceptual: Bool { get set }
}

iOS 13 beta 2

CIGaborGradients
// CICategoryStylize
public protocol CIGaborGradients : CIFilterProtocol {
    @available(iOS 5.0, *)
    var inputImage: CIImage? { get set }
}

f:id:Koze:20190624002803p:plain

CIKeystoneCorrectionCombined
// CICategoryGeometryAdjustment
public protocol CIKeystoneCorrectionCombined : CIFilterProtocol {
    @available(iOS 5.0, *)
    var inputImage: CIImage? { get set }
    var focalLength: Float { get set }
    var topLeft: CGPoint { get set }
    var topRight: CGPoint { get set }
    var bottomRight: CGPoint { get set }
    var bottomLeft: CGPoint { get set }
}
CIKeystoneCorrectionHorizontal
// CICategoryGeometryAdjustment
public protocol CIKeystoneCorrectionHorizontal : CIFilterProtocol {
    @available(iOS 5.0, *)
    var inputImage: CIImage? { get set }
    var focalLength: Float { get set }
    var topLeft: CGPoint { get set }
    var topRight: CGPoint { get set }
    var bottomRight: CGPoint { get set }
    var bottomLeft: CGPoint { get set }
}
CIKeystoneCorrectionVertical
// CICategoryGeometryAdjustment
public protocol CIKeystoneCorrectionVertical : CIFilterProtocol {
    @available(iOS 5.0, *)
    var inputImage: CIImage? { get set }
    var focalLength: Float { get set }
    var topLeft: CGPoint { get set }
    var topRight: CGPoint { get set }
    var bottomRight: CGPoint { get set }
    var bottomLeft: CGPoint { get set }
}
CIPerspectiveRotate
// CICategoryGeometryAdjustment
public protocol CIPerspectiveRotate : CIFilterProtocol {
    @available(iOS 5.0, *)
    var inputImage: CIImage? { get set }
    var focalLength: Float { get set }
    var pitch: Float { get set }
    var yaw: Float { get set }
    var roll: Float { get set }
}

念の為 diff を取ってみたら beta 1 から beta 2 で追加フィルタがあった!
いずれもドキュメントは存在しないので名前と入力パラメータから機能を推測するしかない。
なのに CIKMeans に至ってはオンラインドキュメントにも Xcode 内にも一切記述が無いという隠れフィルタ!楽しい。

CIFIlter をインスタンス化して取れるプロパティから入出力を調べてみたところ、おそらく以下の様なプロトコル定義になると思う。

CIKMeans
// CICategoryReduction
public protocol CIKMeans : CIFilterProtocol {
    @available(iOS 5.0, *)
    var inputImage: CIImage? { get set }
    var extent: CGRect { get set }
    var means: CIImage? { get set }
    var count: Int { get set }
    var passes: Int { get set }
    var perceptual: Bool { get set }
}

ググってみたところ KMeans ってのは機械学習に出てくる k-means の事だと思われるが CIKMeans フィルタをどう使うかはまだ未調査で不明。
ちなみに CIPaletteCentroidCIPalettize のフィルタの attributes を見ると paletteImage の入力にはこの CIKMeans で得た画像を使用するらしい。

CIGaborGradients についてもググってみたところ機械学習で使われる画像処理 Gabor Filter というものらしい。

CIDocumentEnhancer は名前と効果からドキュメントスキャナ時のフィルタ処理だろうと推測。

CIMorphologyRectangleMinimum CIMorphologyRectangleMaximum については iOS 11 で CIMorphologyMinimum CIMorphologyMaximum CIMorphologyGradient という3つのフィルタが登場しており、WWDC 2017 でこれらのフィルタは depth のマスクを処理するのに良いと紹介されていた。今回追加された2つのフィルタは入力パラメータは少し違うものの用途としては同じ様なものではないかと思われる。

Advances in Core Image: Filters, Metal, Vision, and More - WWDC 2017 - Videos - Apple Developer

とりあえず beta 2 ではこの様な感じで、また今後の beta でも何かしらのフィルタの増減があるかも知れないので余裕があればチェックしてみるかも。