鉛筆畫演算法

2022-08-29 09:30:11 字數 2020 閱讀 2928

**《combining sketch and tone for pencil drawing production》(cewu lu, lixu, jiayajia)

演算法的實現。

該演算法的實現在專案目錄pencildrawing中。

opencv2.4.10

eigen3

建構函式

pencildrawing()

成員函式

void

operator()(const mat& image, const mat& pencilstyle, out_para mat& pencildrawing)

生成影象image的鉛筆畫。

image:原始影象,image的型別需為bgr三通道彩色圖或gray單通道灰度圖。

pencilstyle:鉛筆畫的風格模板(線條的粗細或輕重)

pencildrawing:演算法生成的鉛筆畫

注:此演算法步驟摘自《combining sketch and tone for pencil drawing production》

演算法的整體框架如下圖:

1.生成梯度圖: $$g=\sqrt)^2 + (\alpha_y)^2}$$

2.生成線條形狀圖: $$g_i=\varphi_i * g, i=1, ..., 8$$

其中$\varphi_i$是線段濾波器,方向為$^\circ*i$。

$$c_i(p) = \beging(p), & if \space _i\ = i\\ 0, & otherwise \end$$

$$s^ = \sum_^8 (\varphi_i \otimes c_i)$$

再次利用$\varphi_i$對$c_i$進行濾波,並取和。

3.將$s^$對映到區間$[0, 1]$得到$s^$,最終生成的線條圖$s=1-s^$

4.生成色調圖,將原始影象亮度值劃分為三個區域:明亮區,暗區和溫和區。每個區域使用一種分布去描述該區域的亮度變化。

明亮區:$$p_1(v)=\begin \frac e^}, & if \space v \le 1 \\0, & otherwise \end$$

溫和區:$$p_2(v) = \begin \frac, & if \space u_a \le v \le u_b \\0, & otherwise \end$$

暗區:$$p_e(v) = \frac} e^}$$

每個畫素值對應的概率值為$p(v) = \frac \sum_^3w_ip_i(v)$,其中$z$是歸一化因子,使得$\int_0^1p(v)dv = 1$。

其中,每種分布的引數值是通過已有的鉛筆畫訓練得到的,計算公式如下:$\delta_b=\frac\sum_^|x_i - 1|$, $u_a = m_m - \sqrt3s_m$, $u_b = m_m + \sqrt3s_m$, $u_d=m_d$, $\delta_d = s_d$。$x_i$表示鉛筆畫明亮區域的畫素值,$m$與$s$表示鉛筆畫相應區域的畫素均值與標準差。

最後,使用直方圖匹配得到色調圖$j$

最後得到鉛筆紋理圖: $$t = h^}$$

6.最終得到的鉛筆畫可以表示為:$$r = s \cdot t$$

## 參考資料

1. [《combining sketch and tone for pencil drawing production》(cewu lu, lixu, jiayajia)](

2. [matlab版本實現-github.com/candycat1992/pencildrawing](

3. [python版實現-github.com/moonfighting/pencildrawing--python-version](

買鉛筆 演算法競賽

時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 題目描述 p老師需要去商店買n支鉛筆作為小朋友們參加noip的禮物。她發現商店一共有 3 種包裝的鉛筆,不同包裝內的鉛筆數量有可能不同,也有可能不同。為了公平起見,...

尤拉迴路判定演算法 一筆畫問題

如果圖中的一條路經經過每條邊一次,則該路徑稱為尤拉路徑。如果該路徑正好是乙個迴路,即從起點出發又回到起點,則該路徑稱為尤拉迴路。如果乙個圖有尤拉迴路,則該圖稱為尤拉圖。無向圖存在尤拉迴路的充要條件 乙個無向圖存在尤拉迴路,當且僅當該圖所有頂點度數都為偶數,且該圖是連通圖。無向圖存在尤拉路徑的充要條件...

一筆畫完C語言程式尋找路徑演算法

過年這幾天疫情嚴重,哈哈,想必各位在家也是閒得慌。於是,玩了一款叫 一筆畫完 的遊戲打發時間,要求從起點一筆連線所有格仔,不能重複,不能空格。有些關卡還真是意想不到,於是想到能不能用計算機去幫我找路徑,間接 開掛 哈哈。遊戲介面截圖如下 其中乙個關卡,用來測試程式 廢話不多說,來看 vc 6.0寫的...