Skip to main content

实作色彩系统转换程序 (VB 6.0)

实作色彩系统转换程序 (VB 6.0)

下载原始码及执行档:


介绍

RGBHSI


HSIRGB

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



120°<H240°时。



CMYKRGB
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}
RGBCMYK
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'}


RGBYUV
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)
YUVRGB关系如下:


RGBYUV关系如下:



将其正规化,可以将RGBYUV都在0255之间转换。所以可以采用下列的程序:
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
YIQRGB之间的关系如下:



RGBYIQ之间的关系如下:



YCbCrRGB的关系如下:



RGBYCbCr关系如下:



环境

操作系统:Microsoft Windows 7 (64 bit)
开发工具:Microsoft Visual Basic 6.0

用法



'设定所有变量必须宣告才能使用
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


例外

1. 如果执行档不能执行,请先安装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