2014年6月8日 星期日

Visible Watermark

這次作業是要自製浮水印,依然使用 python 來實作。

前言

這個好像也沒什麼演算法或什麼圖可以貼......但還是得說說是怎麼實作的。

方法

  1. 輸入圖片
  2. 轉換成 RGBA 格式
  3. 圖片剪貼
  4. 輸出圖片
其實方法很簡單,就是把原圖片和浮水印圖片都轉換成 RGBA 格式,然後藉由 Alpha 的不同來區隔。

layer = Image.new('RGBA', im.size, (0,0,0,0))
ratio = min(float(im.size[0]) / mark.size[0], float(im.size[1]) / mark.size[1])
width = int(mark.size[0] * ratio)
height = int(mark.size[1] * ratio)
layer.paste(mark, ((im.size[0] - width) / 2, (im.size[1] - height) / 2))

上面這段程式碼就是在製作 mask,完成以後將其與原圖片合起來就可以了。

結果

現在以 lena 為基準,肌肉小童當浮水印。

lena

肌肉小童


製作後如下圖:
0.5 opacity 的浮水印

感想

好實用喔,覺得開心!

2014年6月4日 星期三

顏色空間轉換

這次作業主要有兩點:

  1. RGB to HSI
  2. 膚色偵測

RGB to HSI

色相(H):

    是色彩的基本屬性,就是平常所說的顏色名稱,如紅色、黃色等。

飽和度(S):

    是指色彩的純度,越高色彩越純,低則逐漸變灰,取0-100%的數值。

亮度(I):

    亮度,取0%~100%



根據上面的公式,可以將RGB轉換成HSI,而下圖就是圖像處理後的結果。


H 通道

S 通道

I 通道



膚色檢測

在這方面,我選擇先將RGB轉換成YCbCr,然後在對其三個元素做素質上的判斷。如此一來,即可將膚色部分顯現出來。

而RGB轉換成YCbCr的公式如下圖:


在轉換完成後,根據 JORGE ALBERTO MARCIAL BASILIO et al. 所提出的 threshold 來進行檢測:


檢測結果如下:

original image

skin-only image


結論

經由這次作業,我們可以了解,圖像轉換至 YCbCr 後,確實能有效的分離出膚色部分,非常實用!