HSV轉RGB去浮點優化 為MCU簡化

2021-09-09 06:38:39 字數 3273 閱讀 2098

hsv做為基本的調色空間,有較多的使用場景,目前越來越多的iot產品也需要用的hsv到rgb的顏色空間轉換,其中不乏低成本的微控制器。

低成本的微控制器沒有fpu,所以只能靠編譯器將浮點運算轉為模擬浮點。當然模擬浮點運算就需要cpu來算了,同時需要更大的**空間。恰巧mcu一般主頻低,ram、rom小。

所以原有的**需要簡化才能適用於這類平台。

為了脫敏,這裡使用網上能找到python**,來說明化簡方法。

來自網際網路

import math

defhsv2rgb

(h, s, v)

: h =

float

(h) s =

float

(s) v =

float

(v) h60 = h /

60.0

h60f = math.floor(h60)

hi =

int(h60f)%6

f = h60 - h60f

p = v *(1

- s)

q = v *(1

- f * s)

t = v *(1

-(1- f)

* s)

r, g, b =0,

0,0if hi ==

0: r, g, b = v, t, p

elif hi ==

1: r, g, b = q, v, p

elif hi ==

2: r, g, b = p, v, t

elif hi ==

3: r, g, b = p, q, v

elif hi ==

4: r, g, b = t, p, v

elif hi ==

5: r, g, b = v, p, q

r, g, b =

int(r *

255)

,int

(g *

255)

,int

(b *

255)

return r, g, b

h =

float

(h) s =

float

(s) v =

float

(v)

原來需要轉置為浮點型,但是低端mcu不帶浮點運算,s,v可以擴大100or1000倍輸入,改為整形計算

scal=1000
沒了浮點運算,取小數部分也改改。求模再除(這個除60放到後面算式裡)。

原:

h60 = h /

60.0

h60f = math.floor(h60)

hi =

int(h60f)%6

f = h60 - h60f

改:

hi =

int(h/60)

%6 f =(h%60)

#/60

需要保持擴大比例,但又不能增加太多計算量,人工化簡一下,找找規律

p = v *(1

- s)

q = v *(1

- f * s)

t = v *(1

-(1- f)

* s)

改:

vs = v * s / scal

vfs = v * f * s/

60/scal

p = v - vs

q = v - vfs

t = p + vfs

def

hsv2rgb

(h, s, v)

: scal=

1000

hi =

int(h/60)

%6f =

(h%60

)#/60

vs = v * s / scal

vfs = v * f * s/

60/scal

print

(v,vs,vfs)

p = v - vs

q = v - vfs

t = p + vfs

r, g, b =0,

0,0if hi ==

0: r, g, b = v, t, p

elif hi ==

1: r, g, b = q, v, p

elif hi ==

2: r, g, b = p, v, t

elif hi ==

3: r, g, b = p, q, v

elif hi ==

4: r, g, b = t, p, v

elif hi ==

5: r, g, b = v, p, q

r, g, b = r *

255/scal, g *

255/scal, b *

255/scal

return r, g, b

這個比較簡單,就不解釋了,直接貼結果

def

rgb2hsv

(r, g, b)

: scal =

100 mx =

max(r, g, b)

mn =

min(r, g, b)

df = mx-mn

if mx == mn:

h =0elif mx == r:

h =(60

*(g-b)

/df )

%360

elif mx == g:

h =(60

*(b-r)

/df+

120)

%360

elif mx == b:

h =(60

*(r-g)

/df+

240)

%360

if mx ==0:

s =0else

: s = df*scal/mx

v = mx*scal/

255return h, s, v

lua觸動精靈rgb轉hsv函式方法

hsv識別適用於背景色與目標色單一且反差大的場景,例如這樣的 紅色戰力和綠色戰力,我們的目的是挑戰綠色低戰力的,用找色很麻煩,因為他們是數字一直是變化的,無法用找色實現,而用hsv就可以輕鬆實現,具體hsv資料可以自己搜尋,觸動精靈目前沒有hsv相關函式,我分享乙個自己原創的。rgb轉hsv,返回h...

RGB和HSV顏色空間

rgb顏色空間 rgb red,green,blue 顏色空間最常用的用途就是顯示器系統,彩色陰極射線管,彩色光柵圖形的顯示器都使用r g b數值來驅動r g b電子槍發射電子,並分別激發螢光屏上的r g b三種顏色的螢光粉發出不同亮度的光線,並通過相加混合產生各種顏色 掃瞄器也是通過吸收原稿經反射...

RGB和HSV顏色轉換

分類 影象處理 2008 07 21 21 50 2979人閱讀收藏 舉報integer 演算法工具 c360 h引數表示色彩資訊,即所處的光譜顏色的位置。該引數用一角度量來表示,紅 綠 藍分別相隔120度。互補色分別相差180度。純度s為一比例值,範圍從0到1,它表示成所選顏色的純度和該顏色最大的...