顯示具有 Python 標籤的文章。 顯示所有文章
顯示具有 Python 標籤的文章。 顯示所有文章

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 後,確實能有效的分離出膚色部分,非常實用!


2014年3月8日 星期六

Image Scaling and Rotation

第一次作業,題目是影像的縮放與旋轉,重點就是操作影像的位置。而我們要實作的演算法,總共有三個:NN、Bilinear、Bicubic。

Nearest Neighbor Interpolation

(圖片取自 Tech-Algorithm

如上圖所示,這個演算法縮放圖片的方法,就是找其最近的一個鄰居,根據鄰居的顏色,來填補空缺的格子。NN追求的是簡單與快速,所以在圖片處理上相較含糊,如果放大的倍率很大的話,很容易看到鋸齒狀的結果。以下是 lena 放大三倍後的結果。

(3x lena.bmp with NN)

Bilinear Interpolation

(圖片取自 Tech-Algorithm

Bilinear與NN不同的地方是,找其最近的四個鄰居,並且根據內插法(Interpolation)去決定顏色。因此,這個縮放出來會比 NN 還要平滑,鋸齒狀的結果會比較少見,但當然只是相對少見。

(3x lena.bmp with Bilinear)

Bicubic Interpolation

Bicubic 使用鄰近十六個鄰居的像素來決定本身的值,所以相對前面兩個會比較清晰,但花費時間也久了一點。而當你將他放大看時,你能發現圖片的銳利度是比較高的。

(3x lena.bmp with Bicubic)

Image Rotation using Nearest Neighbor

這個部分,其實也可以使用 Bilinear 實作,不過比較複雜,所以就選擇了 NN。

(Rotated lena.bmp with NN)

Conclusion

在這次學習之後,讓我對於影像處理有初步的了解。個人覺得三個演算法中,就屬 Bilinear 最平衡,所需時間小於 Bicubic ,且品質大於 Nearest Neighbor。