2014年6月9日 星期一

浮水印的製作

浮水印的製作,簡單說就是一個類似Merge的功能這樣

但是並不是直觀的把圖片跟圖片之間直接做顏色數值的ADD

而是要用到類似顏色空間的概念來做

正常的ADD的話,覆蓋上去的區塊會出現很奇怪的顏色

這並不是我們想要的結果

所以在直接手做上面會是有一些難度的

而現成的函式庫則是非常的多

包括最基礎的CImage、最常見的OpenCV、AForge等等

下列是製作結果:

原始底圖:
原始的兩個素材:

加入之後的結果:


最後...小小的吐槽一下

教授你的作業說明檔貌似打錯了....

中文的是說接受256色BITMAP

英文的卻說24-BIT的阿= =""



2014年6月3日 星期二

RGB與HSI空間顏色的轉換以及顏色區域偵測

這次主要的是實作顏色RGB轉換為空間的HSI,除了基礎的色調,裡面又分為HSB跟HSL。

HSB之中的B是Brightness,而L則是Lightness

除了原本RGB的平面色系,他們更加入了亮度、飽和度。成了一種圓柱體的調色盤


HSL之中的灰階不同於既定的RGB色塊來表示顏色,而是以黑白加上亮度來表示"明暗"

使用之灰階原圖:
此圖之HSL灰階通道:


而其中比較麻煩的則是偵測膚色區域的部分

首先要克服的部分是RGB轉到HSL的部分,先把公式刻出來

(此處從WIKI擷取)

設 (rgb)分別是一個顏色的紅、綠和藍坐標,它們的值是在0到1之間的實數。設max等價於rgb中的最大者。設min等於這些值中的最小者。要找到在HSL空間中的 (hsl)值,這裡的h ∈ [0, 360)是角度的色相角,而sl ∈ [0,1]是飽和度和亮度,計算為:

h =
\begin{cases}
0^\circ & \mbox{if } max = min \\
60^\circ \times \frac{g - b}{max - min} + 0^\circ,   & \mbox{if } max = r \mbox{ and } g \ge b \\
60^\circ \times \frac{g - b}{max - min} + 360^\circ,   & \mbox{if } max = r \mbox{ and } g < b \\
60^\circ \times \frac{b - r}{max - min} + 120^\circ, & \mbox{if } max = g \\
60^\circ \times \frac{r - g}{max - min} + 240^\circ, & \mbox{if } max = b
\end{cases}
l = \begin{matrix} \frac{1}{2} \end{matrix} (max + min)

s =
\begin{cases}
0 & \mbox{if } l = 0 \mbox{ or } max = min \\
\frac{max-min}{max+min} = \frac{max-min}{2l}, & \mbox{if } 0 < l \leq \frac{1}{2} \\
\frac{max-min}{2-(max+min)} = \frac{max-min}{2-2l}, & \mbox{if } l > \frac{1}{2}
\end{cases}
h的值通常規範化到位於0到360°之間。而h = 0用於max = min的(就是灰色)時候而不是留下h未定義。
HSL和HSV有同樣的色相定義,但是其他分量不同。HSV顏色的sv的值定義如下:
s =
\begin{cases}
0, & \mbox{if } max = 0 \\
\frac{max - min}{max} = 1 - \frac{min}{max}, & \mbox{otherwise}
\end{cases}
v = max \,


色盤轉換完畢之後,利用元件將色盤放到表單上然後切割區域就行了

由於平常使用的範例圖色塊太偏紅色,所以用比較鮮艷的圖片:


      版面:

色塊獨立後:

可以稍微在把區塊調大一點或是乾脆改成偵測藍色才不會這麼驚悚....不過大致上就是這樣(?)