2012年1月31日 星期二

Filter4Cam 學習之 Core Image Programming Guide 1-2

since: 2012/01/31
update: 2012/01/31

reference: Core Image Programming Guide: Core Image Concepts

Core Image 概念之二

D. 處理過程路徑
    1. 圖 1-5 顯示在二個原始影像上操作濾鏡的像素處理過程路徑. 原始影像通常
       都被指定為 CIImage 物件. Core Image 提供了多樣的方式來取得影像資料.
       你可以利用以下的方式來轉成 CIImage 物件: 提供一個連結到影像的 URL, 讀取
       未加工(raw)的影像資料(使用 NSData 類別), 轉換一個 Quartz 2D 影像
       (CGContextRef), 一個 OpenGL 的紋理(texture), 或是一個 Core Video 的影像
       緩衝器(CVImageBufferRef).

       注意, 實際的影像輸入數量, 與是否濾鏡需要一個輸入的影像依不同的濾鏡而異,
       濾鏡是非常有彈性的, 可以做到以下的事情:

        a. 不需要影像而運作. 有些濾鏡基於輸入非影像的參數來產生影像. (例如, 在
             Core Image Filter Reference 中, 查看 CICheckerboardGenerator
         
CIConstantColorGenerator 濾鏡.)

        b. 需要一個影像. (例如, 在 Core Image Filter Reference 中, 查看 CIColorPosterize
         與
CICMYKHalftone 濾鏡.)

        c. 需要二個或多個影像. 用來合成影像的濾鏡或使用一個影像中的值來控制並
            處理另一個影像中的像素, 這都是典型地需要二個或多個影像. 其中一個輸入
            的影像能夠作為遮光影像(shading image), 影像遮罩, 背景影像或提供控制
            處理其它影像外觀時的查詢值之來源. (例如, 在 Core Image Filter Reference
            中, 查看 CIShadedMaterial 濾鏡.)

         當要處理一個影像時, 你有責任去建立一個包含適當輸入資料的 CIImage 物件.

         注意: 雖然 CIImage 物件是與影像資料相關聯的, 它本身並不是影像. 你可以將
                    CIImage 物件看成是一個影像的配方(recipe). 一個 CIImage 物件擁有產生
              一個影像
所需要的所有資訊, 但是 Core Image 實際上直到被告知去作時,
                   才會描繪出影像. 這個延遲求值(lazy evaluation)的方法(查看
                   "Filter Clients and Filter Creators" ) 允許 Core Image 盡可能地高效率運作.

    2. 每個原始影像的像素會被 CISampler 物件所取走(fetched), 或只是一個取樣器
         (sampler). 就如其名稱所建議的, 取樣器會取回影像的樣本並且將它們提供給
         kernel. 濾鏡創造者要為每個原始影像提供取樣器. 濾鏡委託人不需要知道有關
         取樣器的任何事情. 

         一個取樣器定義了以下的事情:
         a. 協調的轉換(coordinate transform): 如果沒有需要轉換的話, 可以是本身的轉換.

         b. 竄改模式(interpolation mode): 可以是最鄰近的樣本或是雙線性的(bilinear)
             竄改(此為預設).

         c. 包裹模式(wrapping mode): 當樣本區域位在原始影像之外時, 明確說明如何產生
             像素 ---- 使用透明黑(transparent black)或限制到其範圍(clamp to the extent).

         濾鏡創造者在 kernel 中定義每個像素的影像處理計算, 但是 Core Image 處理那些
         計算的實際實作. Core Image 決定使用 GPU 或 CPU 來執行計算. Core Image 經由
         OpenGL 來實作硬體光柵化處理(rasterization: 由向量圖形轉換為光柵圖形的過程).
         它經由特別調整用來為片斷(fragment)求值程序的模擬環境中實作了軟體的光柵化
         處理, 其隨著非投射性(nonprojective)紋理(texture)來查詢大的四邊形
         (quadrilaterals or quads).

    3. 雖然像素處理的路徑是從原始影像到目的地, 但是 Core Image 所使用的計算路徑
         從目的地開始, 並且它的工作方式是反向回到原始像素的, 如圖 1-6 所示.

        這個反向的計算也許似乎不方便使用, 但是它實際上在任何的計算中最小化了
        所使用的像素數量. 提供選擇的東西(二擇一), Core Image 沒有使用的是處理
        所有原始像素的暴力(brute force)方法, 接著之後決定目的地需要什麼東西.
        近一點來看圖 1-6.

    4. 假定在圖 1-6 中的濾鏡執行某些種類的合成操作, 例如 source-over 合成
        (上面的圖形覆蓋了下面的圖形). 濾鏡委託人想要將二個影像作部分重疊, 所以
        只有每個影像的一小部份會合成以達到結果, 如圖的左邊所示. 更進一步來看,
        目的地應該會是什麼樣子? Core Image 能夠決定從哪個原始影像來的資料會對
        最後的影像(目的地)發生作用, 並且只限制在那些原始影像中作計算. 結果, 取樣器
        只會在原始影像遮蔽的地區取回樣本, 如圖 1-6 所示.

    5. 注意, 在圖中標記為 domain of definition 的箱子(box). 這個定義的範圍是將來
        要限制住計算的方式. 它是一個在所有像素都透明之外的地區(那就是 alpha 成分
        等於零). 在這個例子中, 定義的範圍跟目的影像正確地相符. Core Image 提供了一個
        CIFilterShape 物件用來定義這個區域. CIFilterShape 類別提供了一些方法可以
        用來: 定義矩形的形狀, 轉換形狀, 以及在多邊形上執行嵌入(inset), 聯集(union),
        與交集 (intersection)的操作. 例如, 假如你使用一個小於遮蔽地區的矩形定義一個
        濾鏡的外形, 如圖 1-6 所示, Core Image 就會使用該資訊作為未來在計算中限制
        所使用的原始像素.

    6. Core Image 用其它的方式來提升高效率的處理. 它執行聰明的快取與編譯器最佳化,
        以致能適合如即時錄影控制的任務. 它對任何評估為多次出現的資料集, 快取了中間
        的結果(intermediate results). 每當增加一個新的影像會造成快取成長太大時,
         Core Image 以最近最少使用(least-recently-used)的次序來收回資料. 這意謂著:
        當那些被使用一次經過一段時間之後, 有需要時可能會被移入或移出快取, 而繼續
        存在快取中的物件會頻繁地重復被使用. 你的應用程式得益於 Core Image 的快取,
        而無須知道快取是如何實作的細節. 然而無論什麼時候, 你卻可以藉由重復使用物件
        (影像, contexts, 等等)來獲得最佳的效能.         

    7. Core Image 藉由在 kernel 及 pass levels 中使用傳統的編輯(compilation)技術,
        也可以獲得重大的效能. Core Image 採用的方法是: 配置最小化的註冊, 包括
        暫時註冊的數目(每個 kernel), 與暫時的像素緩衝器(每個濾鏡的圖). 編譯器執行
        CSE(Common Subexpression: 共同子運算式)並且作監視點最佳化
        (
peephole optimization), 在讀取資料相依的紋理時自動識別, 這些是基於之前
        的計算, 並且它們不是資料相依的. 又一次, 你自己無需擔心編輯(compilation)
        技術的細節. 重點為 Core Image 是懂硬體的; 每當可行的話, 它會使用 GPU
        力量, 並且採用敏捷的方式.

© 2004, 2011 Apple Inc. All Rights Reserved. (Last updated: 2011-10-12)

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。