Byakuren:一個 C 實現的主題色提取庫

原文地址: Byakuren:一個 C 實現的主題色提取庫

好久沒發文章了,借著 Byakuren 開源的檔口炒炒冷飯吧。

先上 Repo 地址:XadillaX/byakuren。

主題色

圖像主題色是從一張圖像中提取出來最能代表這張圖片主色調的多種顏色。 也就是說在一幅色彩斑斕的圖片裡面,各種不同顏色的數量就對應著該顏色在圖 片中的比例,程序可以通過計算圖片中不同顏色的像素數來算出主題色。

主題色提取演算法

提取的演算法在我之前的博客中有說明。在 Byakuren 中其實用的就是之前博客中講的一些演算法。

  • 八叉樹提取法
  • 最小差值法

除去上面兩種演算法,Byakuren 還提供了將這兩種演算法結合起來的 Mix 演算法。

Byakuren

Byakuren 是我前兩年寫的一個主題色提取庫,也是繼 thmclrx 之後的 C 版實現,個人認為代碼質量比舊版的 thmclrx 要高。並且它實際上經過了企業級的驗證,在某相關的公司已經歡快跑了有些年頭了。

在經過相關人員的同意下,我也算把這雪藏了好久的代碼給開源出來了。

偽·Byakuren 是什麼?

聖 白蓮(ひじり びゃくれん,Hiziri Byakuren)是系列作品《東方 project》中的角色,首次登場於《東方星蓮船》。

  • 種族:魔法使
  • 能力:使用魔法程度的能力(酣暢增強身體能力的)
  • 危險度:不明
  • 人類友好度:中
  • 主要活動場所:命蓮寺之類
  • 命蓮寺的住持。雖然原本是人類,不過由於常年的修行已經完全超越了人類。現在已經屬於人們常說的魔法使了。

雖然已經入了佛門,但是不知道什麼原因卻被妖怪敬仰著。她從來沒有像童話故事中的魔法使那樣,念誦著咒語治退妖怪。使用的力量完全是邪惡的,一點都不像是聖人,雖然並沒有人目擊到她與人類為敵,但其實已徹底成為妖怪的同伴了。

好吧,總之本人是個東方控,所以基本上項目名都跟東方有關。

真·Byakuren 是什麼?

如文章題目所說,它是一個 C 實現的開源主題色提取的庫,大家可以把它編譯成鏈接庫使用。

不過目前暫時只支持 Makefile 的形式來編譯,大家如果有興趣也可以自己建個 Windows 下的 Visual Studio 項目等,也歡迎提類似於 CMake 之類的 PR。

使用

其實詳細的使用方法在文檔中就有說明。

不過這裡還是簡單介紹一下吧。

Clone

先把代碼給下下來,你也可以把它 Clone 下來。總之倉庫地址是:XadillaX/byakuren。

make

然後跑到目錄下執行make。

$ make byakurenn

你將得到一個 byakuren.a 的靜態鏈接庫。

這個時候你只要拿著這個靜態鏈接庫,然後順便在你的項目中把頭文件引進來就可以了。

#include "byakuren.h"n

API

我們假設你有 bkr_rgb* rgb 的圖片像素信息,以及 uint32_t color_count 的圖片像素總數兩個變數,下面分別給出三個樣例。具體的 API 解析還請去文檔觀摩。

Octree

bkr_color_stats stats[256];nbkr_octree_node* root = bkr_build_octree(rgb, color_count, 256);nint colors = bkr_octree_calculate_color_stats(root, stats);nbkr_release_octree(root);n

colors 就是主題色數量了,傳進去的 stats 就會接收到主題色的具體信息了。

Min-diff

bkr_color_stats stats[256];nbkr_mindiff_parameter param;nparam.gray_offset = 5;nparam.palette = NULL;nint colors = bkr_mindiff_calculate_color_stats(rgb, color_count, stats, &param);n

colors 和 stats 如上所述。

Mix

bkr_color_stats stats[256];nbkr_mindiff_parameter param;nparam.gray_offset = -1;nparam.palette = NULL;nint colors = bkr_mix_calculate_color_stats(rgb, color_count, 256, &param, stats);n

colors 和 stats 如上所述。

預覽一下

可能有人想看看效果,我這裡就放個效果圖給大家看看吧。

其中 Octree 和 Mix 兩個演算法的主題色最大數量參數傳的都是 16。

能做什麼?

你可以拿它來寫一些主題色提取的東西。

你也可以拿它來完成其它語言的主題色提取庫的封裝,如 Python、Lua 等等。歡迎反饋給我。

結束語

把一份自己覺得還不錯的代碼開源出來的感覺特爽,尤其是這種重見天日的感覺。?|???|?*~●


推薦閱讀:

燃燒船分形(Burning Ship fractal)
拉普拉斯運算元
GitHub|教你快速使用Tensorflow/Elasticsearch實現全文的圖片搜索(附源代碼)
顏色保衛戰與VOT2016
1.23【OpenCV圖像處理】直方圖均衡化和計算

TAG:C编程语言 | 图像处理 |