Skip to main content

實作色彩系統轉換程式 (VB 6.0)

實作色彩系統轉換程式 (VB 6.0)

實作色彩系統轉換程式(VB 6.0)

介紹

RGB轉HSI

image.png

HSI轉RGB

當0°≦H<120°時,B值最小,因此如下式:

image.png

當120°<H≦240°時。

image.png

CMYK轉RGB

  tCMYK = {C,M,Y,K}
轉換成三分色
  tCMY = {C',M',Y'} = {C(1 - K) + K,M(1 - K) + K,Y(1 - K) + K}
然後再轉換成RGB
  tRGB = {R,G,B} = {1 - C',1 - M',1 - Y'}
同理結果如下:
  tRGB = {1 - (C(1 - K) + K),1 - (M(1 - K) + K),1 - (Y(1 - K) + K)} = {1 - C(1 - K) - K,1 - M(1 - K) - K,1 - Y(1 - K) - K}      

RGB轉CMYK

  tRGB = {R,G,B}
先轉換成三分色
  tCMY = {C',M',Y'} = {1 - R,1 - G,1 - B}
  if min{C',M',Y'} = 1
  tCMYK = {0,0,0,1}
再轉換成四分色
  K = min{C',M',Y'}
image.png

RGB轉YUV

Y=0.299R+0.587G+0.114B
U=0.493(B-Y)=0.439(-0.29R-0.587G+0.886B)
V=0.877(0.701R-0.587G-0.114B)
YUV與RGB關係如下:
image.png

RGB與YUV關係如下:
image.png

將其正規化,可以將RGB和YUV都在0到255之間轉換。所以可以採用下列的程式:

R = Y + (1.4075 * (V - 128))    
G = Y - (0.3455 * (U - 128) - (0.7169 * (V - 128))     
B = Y + (1.7790 * (U - 128)    
Y = R * .299 + G * .587 + B * .114    
U = R * -.169 + G * -.332 + B * .500 + 128    
V = R * .500 + G * -.419 + B * -.0813 + 128     

YIQ與RGB之間的關係如下:
image.png

RGB與YIQ之間的關係如下:

image.png

YCbCr與RGB的關係如下:
image.png

RGB與YCbCr關係如下:
image.png

環境

作業系統:Microsoft Windows 7 (64 bit)
開發工具:Microsoft Visual Basic 6.0

用法

image.png

程式碼


'設定所有變數必須宣告才能使用
Option Explicit
Private Sub Form_Load()
    '載入影像
    Picture1.Picture = LoadPicture(App.Path & "\Lai, Tai-Yu.bmp")
    '設定picture1計算單位為像素
    Picture1.ScaleMode = 3
    '設定picture1自動重繪有效
    Picture1.AutoRedraw = True
End Sub

'Picture1滑鼠移動事件
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    '宣告RGB變數
    Dim intR, intG, intB
    '獲取RGB值
    intR = (Picture1.Point(X, Y) And &HFF)
    intG = (Picture1.Point(X, Y) \ &H100) And &HFF
    intB = (Picture1.Point(X, Y) \ &H10000) And &HFF
    '顯示RGB值
    labRGB_R.Caption = "R = " & intR
    labRGB_G.Caption = "G = " & intG
    labRGB_B.Caption = "B = " & intB
    '宣告轉換至HSV所需變數
    Dim intS
    Dim dobH, dobS, dobV
    Dim intMax, intMin, intD
    '開始轉換HSV
    intMin = min(intR, intG, intB)
    intMax = max(intR, intG, intB)
    dobV = intMax / 255
    intD = intMax - intMin
    If (intR = intG) And (intG = intB) Then
       dobH = 0
    Else
       dobH = Arccos((0.5 * ((intR - intG) + (intR - intB))) / _
              (Sqr(((intR - intG) * (intR - intG) + (intR - intB) * (intG - intB)))))
    End If
    If intB > intG Then
       dobH = 2 * 3.1415 - dobH
    End If
    If intMax > 0 Then
       dobS = intD / intMax
    Else
       dobS = 0
    End If
    '顯示HSV數值
    labHSV_H.Caption = "H = " & Format(dobH, "0.##")
    labHSV_S.Caption = "S = " & Format(dobS, "0.##")
    labHSV_V.Caption = "V = " & Format(dobV, "0.##")
    '宣告YUV變數
    Dim YUV_Y, YUV_U, YUV_V
    '開始轉換,矩陣相乘
    YUV_Y = 0.299 * intR + 0.587 * intG + 0.114 * intB
    YUV_U = 0.439 * (-0.29 * intR - 0.587 * intG + 0.886 * intB)
    YUV_V = 0.877 * (0.701 * intR - 0.587 * intG - 0.114 * intB)
    '顯示YUV數值
    labYUV_Y.Caption = "Y = " & Format(YUV_Y, "0.##")
    labYUV_U.Caption = "U = " & Format(YUV_U, "0.##")
    labYUV_V.Caption = "V = " & Format(YUV_V, "0.##")
    '宣告YIQ變數
    Dim YIQ_Y, YIQ_I, YIQ_Q
    '開始轉換,矩陣相乘
    YIQ_Y = 0.299 * intR + 0.587 * intG + 0.114 * intB
    YIQ_I = 0.596 * intR + (-0.275 * intG) + (-0.321 * intB)
    YIQ_Q = 0.212 * intR + (-0.523 * intG) + 0.311 * intB
    '顯示YIQ數值
    labYIQ_Y.Caption = "Y = " & Format(YIQ_Y, "0.##")
    labYIQ_I.Caption = "I = " & Format(YIQ_I, "0.##")
    labYIQ_Q.Caption = "Q = " & Format(YIQ_Q, "0.##")
    '宣告YCbCr變數
    Dim YCbCr_Y, YCbCr_Cb, YCbCr_Cr
    '開始轉換,矩陣相乘
    YCbCr_Y = 0.299 * intR + 0.587 * intG + 0.114 * intB
    YCbCr_Cb = (-0.1687 * intR) + (-0.3313 * intG) + 0.5 * intB + 128
    YCbCr_Cr = 0.5 * intR + (-0.4187 * intG) + (-0.0813 * intB) + 128
    '顯示YCbCr數值
    labYCbCr_Y.Caption = "Y = " & Format(YCbCr_Y, "0.##")
    labYCbCr_Cb.Caption = "Cb = " & Format(YCbCr_Cb, "0.##")
    labYCbCr_Cr.Caption = "Cr = " & Format(YCbCr_Cr, "0.##")
    '宣告CMYK變數
    Dim CMYK_C, CMYK_M, CMYK_Y, CMYK_K
    '開始轉換CMYK
    CMYK_C = 255 - intR
    CMYK_M = 255 - intG
    CMYK_Y = 255 - intB
    If CMYK_C < CMYK_M Then
       CMYK_K = CMYK_C
    Else
       CMYK_K = CMYK_M
    End If
    If CMYK_Y < CMYK_K Then
       CMYK_K = CMYK_Y
    End If
    If CMYK_K > 0 Then
       CMYK_C = CMYK_C - CMYK_K
       CMYK_M = CMYK_M - CMYK_K
       CMYK_Y = CMYK_Y - CMYK_K
    End If
    '顯示CMYK數值
    labCMYK_C.Caption = "C = " & Format(CMYK_C, "0.##")
    labCMYK_M.Caption = "M = " & Format(CMYK_M, "0.##")
    labCMYK_Y.Caption = "Y = " & Format(CMYK_Y, "0.##")
    labCMYK_K.Caption = "K = " & Format(CMYK_K, "0.##")
End Sub

'尋找最小值函式
Private Function min(intA As Variant, intB As Variant, intC As Variant)
    '宣告最小值變數
    Dim intMin As Integer
    'A若小於等於B
    If intA <= intB Then
       '最小值為A
       intMin = intA
    '反之
    Else
       '最小值為B
       intMin = intB
    End If
    '最小值變數大於C
    If intMin > intC Then
       '最小值設定為C
       intMin = intC
    End If
    '回傳最小值
    min = intMin
'結束函式
End Function

'搜尋最大值函式
Private Function max(intA As Variant, intB As Variant, intC As Variant)
    '宣告最大值變數
    Dim intMax As Integer
    '當A值大於等於B值
    If intA >= intB Then
       '最大值為A
       intMax = intA
    '反之
    Else
       '最大值為B
       intMax = intB
    End If
    '當最大值變數小於C
    If intMax < intC Then
       '則最大值變數設定為C
       intMax = intC
    End If
    '回傳最大值
    max = intMax
'結束函式
End Function

' Inverse Cosine (反餘弦)函式
Private Function Arccos(X)
    '避免除以零的情況
    On Error Resume Next
    ' Inverse Cosine (反餘弦)函式
    Arccos = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1)
'結束函式
End Function

例外

如果執行檔不能執行,請先安裝vbrun60sp6.exe。

參考

致謝

感謝 (維基自由百科) 提供的知識。

Popular posts from this blog

數位影像處理:最佳化處理策略之快速消除扭曲演算法

寫作:波蘭文學習之旅:1-1. 波蘭文字母與發音(注音版)

Python 日期與時間的處理

數位影像處理:最佳化處理策略之快速消除扭曲演算法

Image

寫作:波蘭文學習之旅:1-1. 波蘭文字母與發音(注音版)

Image

Python 日期與時間的處理

Image

Visual Basic 6.0 (VB6) 程式語言案例學習 (10. 條碼列印程式)

Image

Visual Basic .Net (VB.Net) 程式語言案例學習 (06. 題庫測驗系統)

Image

修復損毀的 SQLite DB 資料庫

Image

用10種程式語言做影像二值化(Image binarization)

解決 ValueError: If using all scalar values, you must pass an index

Image

Visual Basic 6.0 (VB6) 程式語言案例學習 (04. 人事考勤管理系統)

Image

Visual Basic 6.0 (VB6) 程式語言案例學習 (07. 收據列印程式)

Image