2010年9月15日 星期三

BLE WLE Implement and RGB convert to YCbCr(YUV)

看到BLE跟WLE的資料,
所以拿Python來寫看看...
因為主要是對Y做處理,所以要先將RGB轉成YCrCb(YUV)

reference:
  1. 請問 RGB 轉換至 YCbCr (YUV) 的計算公式中如何替換 Cg 的?
    http://forum.slime.com.tw/thread102222.html
  2. [程式] RGB與YUV的色彩轉換
    http://www.wretch.cc/blog/killman/7147165
  3. RGB <--> YUV Conversion Formulas
    http://www.cse.msu.edu/~cbowen/docs/yuvtorgb.html

第一篇的文章提到了一個重點,
當初在寫CA Transform Compress的時候,堅哥有建議我轉YUV,可以降低1/4的資訊量,
可是轉完整個畫面顏色都偏掉了,而那個時候我不清楚為什麼會這樣...
我以為是因為轉換過程的Loss,但實際上RGB轉YCbCr是接近Lossless的。

簡單說,當初我用了Analog的轉換式來運算,
但實際上RGB轉YCbCr有分Analog與Digital,
BT.601與BT.709的轉換式也不同。

YUV是根據人眼對顏色的感知所弄出來的color space,
同時,人眼對於亮度的變化感覺最明顯,
以下列式子為例,綠色占的比例最高,紅色次之,藍色最低,因為人對於綠色的感知程度最高
Ey = 0.299R+0.587G+0.114B
Ecr = 0.713(R - Ey) = 0.500R-0.419G-0.081B
Ecb = 0.564(B - Ey) = -0.169R-0.331G+0.500B
上述是BT.601的參數,而BT.709是針對LCD Display所定出來的建議值。

下面是BLE/WLE的Code,以及RGB與YCbCr的轉換
import Image
im = Image.open("test.jpg")
#print im.format, im.size, im.mode
im.show()

#BLE and WLE Filter
BIL = range(256)
BIL[0:20] = [0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,4,8,12,16,20]
BIL[236:256] = [236,240,244,248,252,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255]

im_array = im.load()
Y601CbCr = im
Y601CbCr_array = Y601CbCr.load()
x,y = im.size
#Convert image from RGB Space to Y601CbCr space
for i in range(x):
for j in range(y):
R = im_array[i,j][0]
G = im_array[i,j][1]
B = im_array[i,j][2]
Y601 = int(R * 0.299 + G * 0.587 + B * 0.114)
Cb = int(R * -0.169 + G * -0.332 + B * 0.500 + 128)
Cr = int(R * 0.500 + G * -0.419 + B * -0.0813 + 128)
Y601CbCr_array[i,j] = (Y601,Cb,Cr)

#BLE and WLE
x,y = Y601CbCr.size
for i in range(x):
for j in range(y):
Y601CbCr_array[i,j] = ( BIL[Y601CbCr_array[i,j][0]],
Y601CbCr_array[i,j][1],
Y601CbCr_array[i,j][2])

#Convert image from Y601CbCr space to RGB Space
x,y = im.size
for i in range(x):
for j in range(y):
Y601 = Y601CbCr_array[i,j][0]
Cb = Y601CbCr_array[i,j][1]
Cr = Y601CbCr_array[i,j][2]
R = int(Y601 + (1.4075 * (Cr - 128)))
G = int(Y601 - (0.3455 * (Cb - 128)) - (0.7169 * (Cr - 128)))
B = int(Y601 + (1.7790 * (Cb - 128)))
im_array[i,j] = (R,G,B)

im.show()

Result:
Orignal
After BLE and WLE 

利用調整曲線讓Y更早截止、飽和,犧牲偏亮與偏暗的細節,
讓畫面看起來對比更高。

點圖可以看原始圖片,原圖是1920x1080的圖片,
上傳之後被縮小了Q.Q


PS.
謹以此文向當初我那難產的CA Transform Compress與堅哥至上敬意...

Blogger修改版面,安裝Google code prettify

修改版面,改用Blogger的新功能,
範本設計工具,可以簡單的修改版面配置跟寬度,
只是沒有原先用的minima dark的範本,
所以又東弄弄西弄弄把版面弄成跟原先不要差太多的style...

其實一開始我是想貼code上來,
弄好Google code prettify之後發現我的版面稍微窄了點,
要修改又工程浩大,所以用範本設計工具更換了版面,
但是寫出來會照著順序寫XD


接著,
因為要貼code所以找來這個Google code prettify,
呈現效果不錯咧...
不過如果可以直接弄成widget會更好,
在editor這邊有個對應的按鈕,這樣我就不用自己手動key tag進去= =

reference:
  1. Google Code Prettify
    http://sls.weco.net/blog/rjrsjajawhu/26-dec-2008/11929
  2. Blogger code prettifier
    http://pkario.blogspot.com/2010/04/blogger-code-prettifier.html
  3. tune-google-code-prettify-for-blogger
    http://sandrotosi.blogspot.com/2010/03/tune-google-code-prettify-for-blogger.html

作法有兩種,一種是直接包進Widget並把所有修改放在Widget裡,
另外還有作法是修改template,看是要把code放在template裡,
或是外部link到google的svn server上,
但是考慮到維護的方便性,以及減少外部連結增加效率,
所以我採用第一個做法,合併上述文章中提到的作法...

Step:
  • 首先下載最新的google-code-prettify
    http://code.google.com/p/google-code-prettify/downloads/list
    分別有prettify-21-Jul-2010.zip與prettify-small-21-Jul-2010.zip,
    兩個都要下載並解壓縮。
  • 開啟prettify-21-Jul-2010.zip中的prettify.js,
    以及prettify-small-21-Jul-2010.zip中的prettify.cs,
    建議用Notepad++,比較不容易造成不必要的錯誤
  • 開啟Blogger的後台,設計→網頁元素→找個位置新增小工具
    基本→Html/Javascript
  • 貼上下面的片段,不過為了方便也可以在編輯器上處理好再貼
    <style type="text/css">
    ===>插入prettify.css的內容 <===
    </style>

    <script type="text/javascript>
    ===> 插入prettify.js的內容,注意不能使用壓縮過的版本 <===
    </script>
  • 接著,由於我的版面是以黑色為底,預設的配色會造成某些字看不到,所以要再修改一下,
    在上述的片段之後再貼上這段。
    <style type='text/css'>
    .pln { color: #C0C0C0; }
    .kwd { color: #4169E1; }
    .tag { color: #4169E1; }
    </style>
  • 最後,貼上這段載入prettyPrint(),
    大多的教學是把這段放在body的onload event,
    但既然包到gadget裡了,那就一起吧:)
    <script>prettyPrint();</script>

基本上這樣就完成了,
但是因為是gadget所以會多一塊東西在畫面上,
為了美觀,所以我把上述的code藏在授權的gadget裡面:)

使用上也很單純,編輯文章時...
<pre class="prettyprint">
Post your Dirty code hereeeeeee...
</pre>

Try it!

PS.如果是特殊的code style請另外增加對應的檔案,作法請參照參考連結2。

貼上Html或css,JS等,
如果文章中有包含<、>、&等符號,需先更換為&lt;、&gt;、&amp;
因這幾個字元是html的保留字。

2010年9月3日 星期五

Platform Builder或CETK Tools透過ActiveSync連線時出現"Unable to load device side components"

很長的標題,中文的資料比較少...
接下來應該有段時間不會碰WinCE了,
特此留個紀錄:D

Platform Builder的Remote tools或是CE Test Kit(CETK)要連上Target測試或是Debug的時候,
可以透過KITL或Microsoft Active Sync...
Kitl很多時候不是那麼的方便,
包括會佔用ethernet,ethernet可能不support VMini或Driver有問題?
而Active Sync可以透過USB或Serial Port連線,
也是個不錯的方式...

基本上首先是建立Active Sync連線,
如果Target的USB OTG port插上PC沒有反應,
可以透過USB Viewer確認PC端到底有沒有偵測到USB Client?
需要將Target的USB OTG設定為Serial Mode...

接著修改連線選項,
改為Microsoft Active Sync與Microsoft Active Sync Startup Server
按下Test或OK接著連線,
會出現"Unable to load device side components"

這是因為建立Active Sync連線時,
Tools會複製一些檔案到Target端,
當要複製時找不到檔案就會出現上述的錯誤訊息。

解決方案...以ArmV4i的BSP為例,
Platform Manager會將
"C:\Program Files\Common Files\Microsoft Shared\Windows CE Tools\Platman\target\wce600\armV4"
中的Binary檔複製到Target端,
但是沒有這個資料夾所以出現上述錯誤。

因此,我們需要手動將
"C:\Program Files\Common Files\Microsoft Shared\Windows CE Tools\Platman\target\wce600\armV4i"
複製到
"C:\Program Files\Common Files\Microsoft Shared\Windows CE Tools\Platman\target\wce600\armV4"
這樣就可以讓Platform Manager順利將檔案複製過去,
然後建立連線了:)

How to disable GUI on armbian (revert the Desktop to server)

Check which Display manager that you're using currently cat /etc/X11/default-display-manager nodm should be default if you're choose...