<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 用FPGA來加速采用OpenCL的多功能打印機圖像處理

          用FPGA來加速采用OpenCL的多功能打印機圖像處理

          作者: 時間:2015-03-19 來源:網(wǎng)絡 收藏

            D. TRC調整

          本文引用地址:http://www.ex-cimer.com/article/271266.htm

            TRC調整算法是一個簡單的LUT.它允許C、M、Y、K值的進一步調整,以校正非線性色調再現(xiàn)。具體C、M、Y、K LUT條目憑經(jīng)驗來測量。

            E.誤差擴散

            最后階段執(zhí)行半色調功能。彩色激光MFP產(chǎn)品使用一個激光系統(tǒng)來消除感光介質上的電荷。無論電荷清除的是C、M、Y、K,墨粉都不能轉移到感光體。激光束掃過移動的感光體,被調制來創(chuàng)建一個倒置的圖像。調制的最小時間周期是一個像素。在反轉圖像被寫入感光體后,它經(jīng)過一個墨粉分配器附近。然后,帶有相反電荷的墨粉被吸引到電荷存在的感光區(qū)。墨粉“粘”到感光體上。最后一個步驟是將感光體上的圖像轉印到紙張或其他介質上。單個像素或開或關,實現(xiàn)二進制的1過程。來自TRC內核的8位CMYK像素必須半色調或二進制化,以驅動打印機中的激光系統(tǒng)。有許多算法可以將連續(xù)色調數(shù)據(jù)轉換為二進制數(shù)據(jù)。誤差擴散是MFP/打印機中使用的一種通用算法。我們選擇了實施眾所周知的弗洛伊德-斯坦伯格(Floyd-Steinberg)誤差擴散算法的一個變種,它有簡單的算術修正系數(shù)[7].

            弗洛伊德-斯坦伯格誤差擴散量化了基于一個閾值陣列的輸入像素,然后將剩余誤差分配到相鄰像素。在我們的案例中,我們將一個8位輸入像素減少到二進制輸出像素。因此,我們的閾值陣列是一個127的值。大于127的輸入像素成為了邏輯1.≤127的像素成為了0.該算法定義如下:

            

           

            1. IP(x,y)是當前輸入像素

            2. EPP是來自以前像素的剩余閾值誤差,IP(x-1,y)

            3. EP是來自以前掃描線的誤差矢量,y-1.

            VII.擴展和增強

            A.擴展CCP到整個系統(tǒng)

            下一步驟是采用CCP并將其連接到數(shù)據(jù)輸入的掃描裝置和數(shù)據(jù)輸出的打印裝置。這將需要增加一個校準內核和簡單的CST將RGB轉換為L*a*b*.根據(jù)在掃描設備中使用的傳感器陣列類型,即電荷耦合器件或接觸式圖像傳感器,紅、綠和藍行數(shù)據(jù)可能無法在垂直方向對準。行數(shù)據(jù)的對準可能需要幾十行緩沖區(qū),這在內存資源方面是非常昂貴的。為了緩解這一問題,原始RGB數(shù)據(jù)將使用DMA暫時保存在HPS內存中。然后,紅、綠、藍、行數(shù)據(jù)的對準可以使用DMA指針和偏移來完成。然后校準對準的RGB數(shù)據(jù),并通過通道傳遞到基本CST內核。

            基本CST內核將依次使用通道直接將數(shù)據(jù)傳遞到濾波器輸入模塊。我們的期望是,這些額外內核將適合未使用的邏輯和內存資源。圖22顯示了完整的復印流水線。請注意,除了有全掃描儀接口的CCP,分割、無損壓縮模塊和引擎級都不適合Cyclone V SoC器件。完整的圖像路徑將需要更大型的.

            B. ARM內核和NEON協(xié)處理

            除了架構和,Altera SoC系列器件還采用了雙核ARM Cortex A9內核和NEON協(xié)處理器。圖像處理流水線的某些模塊可以卸載到CPU.在分割操作和完成壓縮/解壓縮功能的特定部分可以使用NEON提供的有SIMD加速的CPU來完成。

            C.動態(tài)FPGA可重編程性

            Altera SoC FPGA提供的動態(tài)重新配置允許用戶重新編程FPGA架構,同時CPU運算繼續(xù)運行。這個特點在MFP中特別有用,而其中的一些操作永遠不可能同時發(fā)生。例如,掃描和復印操作共享6個共同輸入功能,如圖22所示。其余的復印操作、CST壓縮,以及剩下的掃描輸入功能、JPEG壓縮將永遠不會同時運行。因此,我們可以創(chuàng)建兩套內核,其中包括共同的掃描儀功能和多種后端功能。這些流水線可以在給定所需時間基于MFP操作來動態(tài)加載。在一個傳統(tǒng)ASIC中,這些模塊和數(shù)據(jù)通路都必須包括在內。動態(tài)圖像路徑的重新配置可以實現(xiàn)更小的FPGA,從而實現(xiàn)更低成本的圖像路徑。

            D. Arria V和Arria 10 SoC

            Altera的Arria V和最近發(fā)布的Arria10 SoC為功能齊全的MFP圖像路徑解決方案提供了一個可擴展平臺。增加的內存、更快的時鐘速度,加上更高性能ARM內核的大型FPGA架構為圖像處理和一般計算要求提供了完整解決方案。

            

           

            圖:完整的復印和掃描流水線

            圖字:

            復印流水線

            來自CCD或基于CIS掃描儀的RGB;分割;圖像內存;無損解壓縮;圖像調整;引擎接口

            掃描儀接口;校準和調整;CST(RGB到Lab);濾波器;縮放R E;CST(Lab到CMYK);調整;誤差擴散;無損壓縮;至引擎

            掃描出口流水線

            來自CCD或基于CIS掃描儀的RGB;分割;圖像內存;JGEG解壓縮;至網(wǎng)絡

            掃描儀接口;校準和調整;CST(RGB到Lab);濾波器;縮放R E;JGEG壓縮;JGEG壓縮;出口處理;無損壓縮

            通用內核/模塊;流水線特定內核/模塊

            VIII.總結和結論

            和Altera的工具鏈有助于2名全職軟件工程師、1名全職硬件工程師和其他兼職人員的一個小型團隊在約4.5個月內實現(xiàn)CCP.團隊可從C語言算法開始,創(chuàng)建一個高水平的基于C語言的CCP圖像流水線,將算法移植到OpenCL,在x86平臺上測試OpenCL以驗證基本功能,增加廠商特定擴展,學會Altera OpenCL工具流程,最后在Altera的參考平臺上測試結果。團隊還可開發(fā)一個測試環(huán)境來驗證位級別OpenCL結果的正確性。此外,團隊可創(chuàng)建一個基于Web的應用,允許用戶選擇源圖像,通過一個基于C語言的CCP和OpenCL加速的CCP運行圖像,顯示半色調圖像,并提供計時結果。軟件工程師可以沒有以往的FPGA經(jīng)驗,硬件工程師也可以沒有以往的OpenCL經(jīng)驗。

            這種新模式演示了一個小型團隊如何可以快速從一組算法到全面功能,優(yōu)化以硬件實現(xiàn)的流水線。大約50%的開發(fā)時間專注于優(yōu)化,包括最大限度地提高性能和最大限度地減少FPGA資源利用。該團隊預計,后續(xù)項目開發(fā)時間可減少50%。

            MFP廠商不再需要投入數(shù)百萬美元和多年時間來開發(fā)ASIC或SoC.OpenCL和Altera SoC器件提供了一種在最短時間內實現(xiàn)高性能、低成本MFP控制器的新模式。

          fpga相關文章:fpga是什么


          三維掃描儀相關文章:三維掃描儀原理

          上一頁 1 2 3 下一頁

          關鍵詞: FPGA OpenCL

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();