Core Image框架詳細(xì)解析(十) —— 子類化CIFilter:自定義效果的配方 Subclassing CIFilter: Recipes for Custom Effects(二)

版本記錄

版本號 時間
V1.0 2018.01.28

前言

Core Image是IOS5中新加入的一個框架,里面提供了強大高效的圖像處理功能十厢,用來對基于像素的圖像進行操作與分析。還提供了很多強大的濾鏡,可以實現(xiàn)你想要的效果麸粮,下面我們就一起解析一下這個框架。感興趣的可以參考上面幾篇镜廉。
1. Core Image框架詳細(xì)解析(一) —— 基本概覽
2. Core Image框架詳細(xì)解析(二) —— Core Image濾波器參考
3. Core Image框架詳細(xì)解析(三) —— 關(guān)于Core Image
4. Core Image框架詳細(xì)解析(四) —— Processing Images處理圖像(一)
5. Core Image框架詳細(xì)解析(五) —— Processing Images處理圖像(二)
6. Core Image框架詳細(xì)解析(六) —— 圖像中的面部識別Detecting Faces in an Image(一)
7. Core Image框架詳細(xì)解析(七) —— 自動增強圖像 Auto Enhancing Images
8. Core Image框架詳細(xì)解析(八) —— 查詢系統(tǒng)中的過濾器 Querying the System for Filters
9. Core Image框架詳細(xì)解析(九) —— 子類化CIFilter:自定義效果的配方 Subclassing CIFilter: Recipes for Custom Effects(一)

Anonymous Faces Filter Recipe - 讓面孔無法識別過濾Recipe

在圖像中查找面部并對它們進行像素化弄诲,使其無法識別。

Figure 5-4 The Anonymous Faces filter processing chain

要創(chuàng)建一個匿名面孔過濾器:

  • 創(chuàng)建圖像的像素化版本。
  • 使用在圖像中檢測到的臉部構(gòu)建遮罩齐遵。
  • 使用蒙版將像素化圖像與原始圖像混合寂玲。

以下部分顯示如何執(zhí)行每個步驟。

1. Create a Pixellated version of the image - 創(chuàng)建圖像的像素化版本

設(shè)置CIPixellate過濾器的輸入?yún)?shù)如下:

  • inputImage設(shè)置為包含面部的圖像梗摇。
  • inputScale設(shè)置為max(width, height)/60或其他看起來令人愉快的值拓哟,其中寬度和高度是指圖像的寬度和高度。

2. Build a Mask From the Faces Detected in the Image - 從圖像中檢測到的臉部構(gòu)建遮罩

使用CIDetector類來查找圖像中的面部伶授。 對于每一張臉:

// Listing 5-5  Building a mask for the faces detected in an image

CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeFace
                                          context:nil
                                          options:nil];
NSArray *faceArray = [detector featuresInImage:image options:nil];
 
// Create a green circle to cover the rects that are returned.
 
CIImage *maskImage = nil;
for (CIFeature *f in faceArray) {
    CGFloat centerX = f.bounds.origin.x + f.bounds.size.width / 2.0;
    CGFloat centerY = f.bounds.origin.y + f.bounds.size.height / 2.0;
    CGFloat radius = MIN(f.bounds.size.width, f.bounds.size.height) / 1.5);
    CIFilter *radialGradient = [CIFilter filterWithName:@"CIRadialGradient" withInputParameters:@{
        @"inputRadius0": @(radius),
        @"inputRadius1": @(radius + 1.0f),
        @"inputColor0": [CIColor colorWithRed:0.0 green:1.0 blue:0.0 alpha:1.0],
        @"inputColor1": [CIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0],
        kCIInputCenterKey: [CIVector vectorWithX:centerX Y:centerY],
        }];
    CIImage *circleImage = [radialGradient valueForKey:kCIOutputImageKey];
    if (nil == maskImage)
        maskImage = circleImage;
    else
        maskImage = [[CIFilter filterWithName:@"CISourceOverCompositing" withInputParameters:@{
            kCIInputImageKey: circleImage,
            kCIInputBackgroundImageKey: maskImage,
        }] valueForKey:kCIOutputImageKey];
}

3. Blend the Pixellated Image, the Mask, and the Original Image - 混合像素化圖像糜烹,蒙版和原始圖像

CIBlendWithMask過濾器的輸入?yún)?shù)設(shè)置為以下內(nèi)容:

  • inputImage設(shè)置為圖像的像素化版本违诗。
  • inputBackgroundImage設(shè)置為原始圖像。
  • inputMaskImage設(shè)置為合成的綠色圓圈疮蹦。

Pixellate Transition Filter Recipe - Pixellate過渡過濾器Recipe

通過像素化每個圖像從一個圖像轉(zhuǎn)換到另一個圖像诸迟。

Figure 5-5 The Pixellate Transition filter processing chain

要創(chuàng)建一個像素轉(zhuǎn)換濾鏡:

  • 使用CIDissolveTransition在源圖像和目標(biāo)圖像之間切換。
  • Pixellate轉(zhuǎn)換過濾器的結(jié)果愕乎。

以下部分顯示如何執(zhí)行每個步驟阵苇。

1. Create a Dissolve Transition - 創(chuàng)建一個Dissolve轉(zhuǎn)換

設(shè)置CIDissolveTransition過濾器的輸入?yún)?shù)如下:

  • inputImage設(shè)置為要轉(zhuǎn)換的圖像。
  • inputTagetImage設(shè)置為要轉(zhuǎn)換的圖像妆毕。
  • inputTime設(shè)置為類似于min(max(2 *(time-0.25)慎玖,0),1)的值笛粘,這是一個斜率函數(shù)趁怔,它夾在兩個值之間。

2. Pixellate the Result of the Transition - 過渡的結(jié)果像素化

設(shè)置CIPixellate過濾器薪前,通過將其輸入?yún)?shù)設(shè)置如下润努,達到隨著時間的推移改變像素的比例的效果。

  • inputImage設(shè)置為CIDissolveTransition過濾器的輸出圖像示括。
  • 設(shè)置inputScale通過提供三角函數(shù)的值隨時間變化:90 *(1-2 * abs(時間-0.5))铺浇。
  • 使用inputCenter的默認(rèn)值。

Old Film Filter Recipe - 懷舊過濾Recipe

降低視頻圖像的質(zhì)量垛膝,使其看起來像一個舊的鳍侣,磨損的模擬電影。

Figure 5-6 The Old Film filter processing chain

要創(chuàng)建一個懷舊效果old-film的過濾器:

  • CISepiaTone過濾器應(yīng)用于原始視頻圖像吼拥。
  • 創(chuàng)建隨機變化的白色斑點倚聚。
  • 創(chuàng)建隨機變化的黑暗劃痕。
  • 將斑點和劃痕復(fù)合到棕褐色調(diào)的圖像上凿可。

以下部分顯示如何執(zhí)行每個步驟惑折。

1. Apply Sepia to the Video Image - 將棕褐色應(yīng)用于視頻圖像

設(shè)置CISepiaTone的輸入?yún)?shù)如下:

  • inputImage設(shè)置為效果要應(yīng)用的視頻圖像。
  • inputIntensity設(shè)置為1.0。

2. Create Randomly Varying White Specks - 創(chuàng)造隨機變化的白色斑點

使用產(chǎn)生彩色噪音的CIRandomGenerator過濾器惨驶。 它沒有任何輸入?yún)?shù)白热。

要處理噪點,以便只得到白色斑點粗卜,請使用CIColorMatrix濾鏡屋确,輸入?yún)?shù)設(shè)置如下:

  • inputImage設(shè)置為由隨機生成器生成的輸出。
  • inputRVector休建,inputGVectorinputBVector設(shè)置為(0,1,0,0)乍恐。
  • inputBiasVector設(shè)置為(0,0,0,0)

通過如下設(shè)置的過濾器的輸入?yún)?shù)测砂,使用CISourceOverCompositing過濾器將斑點與視頻圖像混合:

  • inputImage設(shè)置為由CIColorMatrix過濾器生成的白色斑點圖像茵烈。
  • inputBackgroundImage設(shè)置為由CISepiaTone過濾器生成的圖像。

3. Create Randomly Varying Dark Scratches - 創(chuàng)造隨機變黑暗的劃痕

再次使用CIRandomGenerator過濾器生成彩色噪音砌些。 然后使用帶有這些輸入?yún)?shù)的CIAffineTransform過濾器處理其輸出:

  • inputImage設(shè)置為由CIRandomGenerator過濾器生成的噪聲呜投。
  • inputTransform設(shè)置為scale將x縮放1.5,將y縮放25存璃,這會使像素變粗而長仑荐,但它們?nèi)詫⒈恢?/li>

使用CIAffineTransform的替代方法是使用imageByApplyingTransform:方法來轉(zhuǎn)換噪聲。

要使像素變暗纵东,請按如下所示設(shè)置CIColorMatrix濾鏡的輸入?yún)?shù):

  • inputImage設(shè)置為轉(zhuǎn)換的視頻圖像粘招。
  • inputRVector設(shè)置為(4,0,0,0)
  • inputGVector偎球,inputBVector和inputAVector設(shè)置為(0,0,0,0)洒扎。
  • inputBiasVector設(shè)置為(0,1,1,1)

這導(dǎo)致青色的劃痕衰絮。

要使劃痕變暗袍冷,請將CIMinimumComponent過濾器應(yīng)用于青色劃痕。 此濾鏡使用r猫牡,g胡诗,b值的最小值生成灰度圖像。

4. Composite the Specks and Scratches to the Sepia Video Image - 將斑點和劃痕復(fù)合到棕褐色視頻圖像

設(shè)置CIMultiplyCompositing過濾器的輸入?yún)?shù)如下:

  • 設(shè)置inputBackgroundImage為處理的視頻圖像(棕褐色調(diào)淌友,白色斑點)煌恢。
  • 設(shè)置inputImage為黑色劃痕,即來自CIMinimumComponent過濾器的輸出

后記

本篇已結(jié)束震庭,后面更精彩~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末症虑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子归薛,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件主籍,死亡現(xiàn)場離奇詭異习贫,居然都是意外死亡,警方通過查閱死者的電腦和手機千元,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門苫昌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人幸海,你說我怎么就攤上這事祟身。” “怎么了物独?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵袜硫,是天一觀的道長。 經(jīng)常有香客問我挡篓,道長婉陷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任官研,我火速辦了婚禮秽澳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘戏羽。我一直安慰自己担神,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布始花。 她就那樣靜靜地躺著妄讯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪衙荐。 梳的紋絲不亂的頭發(fā)上捞挥,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音忧吟,去河邊找鬼砌函。 笑死,一個胖子當(dāng)著我的面吹牛溜族,可吹牛的內(nèi)容都是我干的讹俊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼煌抒,長吁一口氣:“原來是場噩夢啊……” “哼仍劈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起寡壮,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤贩疙,失蹤者是張志新(化名)和其女友劉穎讹弯,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體这溅,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡组民,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了悲靴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臭胜。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖癞尚,靈堂內(nèi)的尸體忽然破棺而出耸三,到底是詐尸還是另有隱情,我是刑警寧澤浇揩,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布仪壮,位于F島的核電站,受9級特大地震影響临燃,放射性物質(zhì)發(fā)生泄漏睛驳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一膜廊、第九天 我趴在偏房一處隱蔽的房頂上張望乏沸。 院中可真熱鬧,春花似錦爪瓜、人聲如沸蹬跃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝶缀。三九已至,卻和暖如春薄货,著一層夾襖步出監(jiān)牢的瞬間翁都,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工谅猾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留柄慰,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓税娜,卻偏偏與公主長得像坐搔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子敬矩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容