CIFilter ile Fotoğraflara Filtre Uygulama

Hasan Oztunc
Paycell Tech Team
Published in
3 min readDec 14, 2023

Görüntü işlemenin en temel işlemlerinden biri filtre uygulamadır. Bu yazıda kısaca CIFilter ile fotoğraflara nasıl filtreler uygulayabileceğimizden bahsedeceğim. CIFilter’dan bahsetmeden önce kısaca Core Image framework hakkında bilgi vermem faydalı olacaktır. Core Image Apple’ın kendi dökümantasyonundaki açıklaması ile image ve videolar için yüksek performanslı görüntü işleme ve analiz frameworküdür.

CIFilter Core Image içerisinde yer alan bir class. CIFilter kullanarak kolay bir şekilde fotoğraflara filtre uygulamamız mümkün. CIFilter bir veya daha fazla image’ı input olarak alıp CIImage tipinde yeni bir image üreten bir class. Filtreleme için gerekli parametreleri key value olarak CIFilter’a vermemiz gerekmekte. Örneğin input olarak vereceğimiz image’ı kCIInputImageKey keyini kullarak vermemiz gerekiyor. Daha fazla uzatmadan bir örnek ile görelim.

Otsu Filter

İlk örnek olarak görüntü işlemenin en temel filtrelerinden biri olan otsu filter’ı CIFilter kullanarak gerçekleştirelim. Otsu filter bir fotoğrafta eşikleme (thresholding) işlemi uygular. Fotoğrafı background ve foreground olacak şekilde 2 katmana ayırır.

func applyOtsuFilter(to image: CIImage) -> CIImage? {
// Yeni bir CIFilter instance oluşuruyoruz ve kullanmak istediğimiz filtrenin ismini veriyoruz
let otsuFilter = CIFilter(name: "CIColorThresholdOtsu")

// Filtreleme işlemi yapmak istediğimiz image'ı input olarak veriyoruz
otsuFilter?.setValue(image, forKey: kCIInputImageKey)

// Filtre uygulanmış image'ı alıyoruz
return otsuFilter?.outputImage
}

Otsu filter sadece input image beklemekte. Filtre kendi içinde ortalama çıkarıp filtre uyguladığı için ayrı bir eşik değeri vermemizi beklemiyor. Yeni bir CIFilter instance’ı oluştururken uygulamak istediğimiz filtreyi string tipinde parametre olarak geçiyoruz. Filtrenin bizden beklediği inputları setValue fonksiyonu ile filtreye veriyoruz. Gerekli inputları verdikten sonra outputImage ile input olarak verdiğimz fotoğrafı filtrelenmiş olarak CIImage tipinde alabiliyoruz.

Otsu filter’ı CIFilter ile yukarıdaki gibi uyguladığımızda bu şekilde bir sonuç elde etmekteyiz.

Edges Filter

Bir başka örnek olarak kullanışlı olduğunu düşündüğüm bir filtre olan CIEdges’ı uygulayalım. Bu filtrede de genel olarak otsudan çok farklı bir şey yapmamıza gerek yok. Bu filtre bizden input image haricinde ikinci parametre olarak inputIntensity beklemekte. Bu parametre kenarların yoğunluğu için vermemiz gerek. inputIntensity değerini büyüttükçe kenarların belirginliği artacaktır.

func detectEdges(of image: CIImage) -> CIImage? {
// Yeni bir CIFilter instance oluşuruyoruz ve kullanmak istediğimiz filtrenin ismini veriyoruz
let edgesFilter = CIFilter(name: "CIEdges")

// Filtreleme işlemi yapmak istediğimiz image'ı input olarak veriyoruz
edgesFilter?.setValue(image, forKey: kCIInputImageKey)

// intensity değerini setliyoruz
edgesFilter?.setValue(10, forKey: kCIInputIntensityKey)

// Filtre uygulanmış image'ı alıyoruz
return edgesFilter?.outputImage
}

Edges filter’ı CIFilter ile yukarıdaki gibi uyguladığımızda bu şekilde bir sonuç elde etmekteyiz.

Bu iki filtre gibi bir çok filtre mevcut. Sık kullanılan filtrelere örnek örnek verecek olursak

Blur için CIGaussianBlur, CIMedianFilter

Color Adjustment için CIColorThreshold, CIColorThresholdOtsu

Color Effect için CIColorMonochrome, CISepiaTone

Stylize için CIEdges, CIEdgeWork

Sonuç

CIFilter kolay kullanımı ile filtreleme işlemlerimizi gerçekleştirmemizi sağlamakta. Görüntü işleme, recogniton, detection gibi işlemlerde kullanışlı olabilicek filtreler uygulamamızı sağlıyor. Apple’ın Vision framework’ü ile recognition ve detection işlemlerini yapmadan önce yapacağımız işleme uygun filtreler uygulayarak recognition ve detection işlemlerinden daha iyi sonuçlar almamız mümkün. Örnek olarak bir fotoğrafa text detection uygulamadan önce otsu filter ve sonrasında edges filter uyguladığımızda text detectiondan daha başarılı sonuçlar alabiliriz.

--

--