在嵌入式GUI開(kāi)發(fā)中,低色深(如RGB565)常常導(dǎo)致圖片漸變出現(xiàn)明顯色帶。
今天給大家?guī)?lái)一個(gè)好消息!
GUI Guider現(xiàn)已支持LVGL圖片抖動(dòng)處理,內(nèi)置兩種主流算法:Floyd-Steinberg誤差擴(kuò)散抖動(dòng)和閾值抖動(dòng)。
本文將結(jié)合源碼實(shí)現(xiàn),帶你深入理解這兩種算法的原理、特點(diǎn)與工程應(yīng)用,讓你的界面更細(xì)膩、更專(zhuān)業(yè)!
什么是圖片抖動(dòng)(Dithering)
想象一下,你有一盒256色的彩筆,但現(xiàn)在只能用16色來(lái)畫(huà)同一幅畫(huà)。直接的做法是找到最接近的顏色替代,但這樣會(huì)產(chǎn)生明顯的色彩分層和失真。
抖動(dòng)算法就像一個(gè)聰明的藝術(shù)家,通過(guò)巧妙地安排像素的分布,讓人眼在一定距離下看到接近原始色彩的效果。這就是"空間換色彩"的思想。
誤差擴(kuò)散抖動(dòng)算法
原理簡(jiǎn)介:
Floyd-Steinberg算法是一種經(jīng)典的誤差擴(kuò)散抖動(dòng)方法。其核心思想是:當(dāng)前像素的量化誤差不應(yīng)浪費(fèi),而應(yīng)傳遞給鄰近像素,從而整體提升視覺(jué)效果。
實(shí)現(xiàn)算法流程:

1.將每個(gè)像素的RGB值映射到21個(gè)等級(jí)(step約為12.75),以適應(yīng)低色深顯示。
2.計(jì)算原始像素與量化后像素的誤差。
3.按照Floyd-Steinberg權(quán)重,將誤差分配給右側(cè)、正下、左下和右下的像素。
源碼實(shí)例片段:
constquantize= (value) => { conststep =255/ (21-1); returnMath.round(value / step) * step; }; // 誤差擴(kuò)散到鄰近像素 diffuseError(1,0,7/16);// 右側(cè) diffuseError(-1,1,3/16);// 左下 diffuseError(0,1,5/16);// 正下 diffuseError(1,1,1/16);// 右下算法特點(diǎn):

閾值抖動(dòng)算法
原理簡(jiǎn)介:
閾值抖動(dòng)采用預(yù)定義的閾值矩陣,根據(jù)像素在矩陣中的位置決定其量化方式。每個(gè)像素獨(dú)立處理,天然支持并行計(jì)算。

實(shí)現(xiàn)流程:
閾值矩陣設(shè)計(jì):
使用8×8的閾值矩陣,分別針對(duì)RGB三個(gè)通道設(shè)計(jì)不同的閾值分布:
letred_thresh = [ 1,7,3,5,0,8,2,6, 7,1,5,3,8,0,6,2, // ... 64 個(gè)值的 8x8 矩陣 ]
這種分離式設(shè)計(jì)有特殊考慮:

2. 基于像素位置計(jì)算閾值矩陣索引:
let threshold_id = ((y & 7) << 3) + (x & 7);
3. RGB565格式適配:針對(duì)RGB565格式,分別對(duì)紅、綠、藍(lán)通道做位掩碼處理,保證色彩映射準(zhǔn)確。
算法特點(diǎn):

算法對(duì)比與選擇建議:

若在GUI Guider中遇到圖片顯示出現(xiàn)色帶問(wèn)題,建議在圖片屬性設(shè)置中嘗試更換不同的圖像渲染算法,以改善圖像質(zhì)量:

實(shí)際應(yīng)用建議:
漸變和照片類(lèi)圖片優(yōu)先選擇Floyd-Steinberg算法,追求最佳視覺(jué)體驗(yàn)
UI圖標(biāo)、純色塊、實(shí)時(shí)渲染場(chǎng)景優(yōu)先選擇閾值抖動(dòng)算法,追求極致效率
總結(jié)
兩種抖動(dòng)算法各有優(yōu)勢(shì):
Floyd-Steinberg-適合追求高質(zhì)量的場(chǎng)景,特別是照片和復(fù)雜圖像
閾值抖動(dòng)-適合對(duì)性能要求較高的實(shí)時(shí)應(yīng)用和UI圖標(biāo)
在使用GUI Guider的嵌入式GUI開(kāi)發(fā)中,根據(jù)具體的硬件平臺(tái)和應(yīng)用需求選擇合適的算法,可以在性能和視覺(jué)效果之間找到最佳平衡點(diǎn)。理解這些算法的原理,不僅能幫助我們更好地使用現(xiàn)有工具,還能在需要時(shí)進(jìn)行定制優(yōu)化,打造更出色的用戶(hù)界面體驗(yàn)。
-
嵌入式
+關(guān)注
關(guān)注
5210文章
20680瀏覽量
337369 -
算法
+關(guān)注
關(guān)注
23文章
4810瀏覽量
98608 -
GUI
+關(guān)注
關(guān)注
3文章
699瀏覽量
43905
原文標(biāo)題:告別色帶!從GUI Guider無(wú)色帶漸變開(kāi)始
文章出處:【微信號(hào):NXP_SMART_HARDWARE,微信公眾號(hào):恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
抖動(dòng)的基礎(chǔ)知識(shí)
STM32的ADC項(xiàng)目應(yīng)用,用什么算法濾波和穩(wěn)定數(shù)據(jù)抖動(dòng)?
抖動(dòng)測(cè)量三種方法
防抖動(dòng)算法
超寬帶通信中定時(shí)抖動(dòng)抑制算法的研究
考慮基線(xiàn)抖動(dòng)的雙天線(xiàn)干涉SAR 原始回波仿
自適應(yīng)抖動(dòng)調(diào)制圖像水印算法
抖動(dòng)的概念和抖動(dòng)的測(cè)量方法
什么是抖動(dòng)?什么叫抖動(dòng)
抖動(dòng)/歪斜,抖動(dòng)/歪斜是什么意思
基于Tail Fit算法的抖動(dòng)分離
時(shí)鐘抖動(dòng)的基礎(chǔ)
降抖動(dòng)的位同步環(huán)路設(shè)計(jì)(GARDNER)
基于新閾值函數(shù)的小波閾值去噪算法
誤差擴(kuò)散抖動(dòng)算法和閾值抖動(dòng)算法的原理
評(píng)論