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

Python 日期與時間的處理

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

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

Python 日期與時間的處理

Image

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

Image

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

Image

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

Image

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

Image

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

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

Image

Visual Basic .Net (VB.Net) 程式語言案例學習 (03. 場地預約系統)

Image

Visual Basic 6.0 (VB6) 程式語言案例學習 (11. 生產線拍照程式)

Image

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

Image