首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

?VB对BMP资料进行统计

2012-12-30 
?VB对BMP文件进行统计请教各位高手:我这有一BMP格式的不规则图形。我想统计出其中亮度低于200的像素点的数

?VB对BMP文件进行统计
请教各位高手:
    我这有一BMP格式的不规则图形。
    我想统计出其中亮度低于200的像素点的数量,并根据像素点数量计算出不规则图形的面积,但是一直没有头绪,请高手指点.。
[解决办法]
BMP每个像素都由RGB组成,用下面函数转换成色相(h)、饱和度(s)、亮度(l)
'RGB转换为色相(h)、饱和度(s)、亮度(l)
Public Sub RGBToHLS( _
                    ByVal r As Long, ByVal g As Long, ByVal b As Long, _
                    h As Single, s As Single, l As Single)
    Dim Max As Single
    Dim Min As Single
    Dim delta As Single
    Dim rR As Single, rG As Single, rB As Single

    rR = r / 255: rG = g / 255: rB = b / 255
    Max = Maximum(rR, rG, rB)
    Min = Minimum(rR, rG, rB)
    l = (Max + Min) / 2    '{This is the lightness}
    '{Next calculate saturation}
    If Max = Min Then
        'begin {Acrhomatic case}
        s = 0
        h = 0
        'end {Acrhomatic case}
    Else
       'begin {Chromatic case}
            '{First calculate the saturation.}
        If l <= 0.5 Then
            s = (Max - Min) / (Max + Min)
        Else
            s = (Max - Min) / (2 - Max - Min)
        End If
        '{Next calculate the hue.}
        delta = Max - Min
        If rR = Max Then
            h = (rG - rB) / delta    '{Resulting color is between yellow and magenta}
        ElseIf rG = Max Then
            h = 2 + (rB - rR) / delta '{Resulting color is between cyan and yellow}
        ElseIf rB = Max Then
            h = 4 + (rR - rG) / delta '{Resulting color is between magenta and cyan}
        End If
    End If
End Sub

'色相(h)、饱和度(s)、亮度(l)转换为RGB


Public Sub HLSToRGB( _
                    ByVal h As Single, ByVal s As Single, ByVal l As Single, _
                    r As Long, g As Long, b As Long)
    Dim rR As Single, rG As Single, rB As Single
    Dim Min As Single, Max As Single

    If s = 0 Then
        ' Achromatic case:
        rR = l: rG = l: rB = l
    Else
        ' Chromatic case:
        ' delta = Max-Min
        If l <= 0.5 Then
            's = (Max - Min) / (Max + Min)
            ' Get Min value:
            Min = l * (1 - s)
        Else
            's = (Max - Min) / (2 - Max - Min)
            ' Get Min value:
            Min = l - s * (1 - l)
        End If
        ' Get the Max value:
        Max = 2 * l - Min
        ' Now depending on sector we can evaluate the h,l,s:
        If (h < 1) Then
            rR = Max
            If (h < 0) Then
                rG = Min
                rB = rG - h * (Max - Min)
            Else
                rB = Min
                rG = h * (Max - Min) + rB
            End If
        ElseIf (h < 3) Then
            rG = Max
            If (h < 2) Then
                rB = Min
                rR = rB - (h - 2) * (Max - Min)


            Else
                rR = Min
                rB = (h - 2) * (Max - Min) + rR
            End If
        Else
            rB = Max
            If (h < 4) Then
                rR = Min
                rG = rR - (h - 4) * (Max - Min)
            Else
                rG = Min
                rR = (h - 4) * (Max - Min) + rG
            End If
        End If
    End If
    r = rR * 255: g = rG * 255: b = rB * 255
End Sub

Private Function Maximum(rR As Single, rG As Single, rB As Single) As Single
    If (rR > rG) Then
        If (rR > rB) Then
            Maximum = rR
        Else
            Maximum = rB
        End If
    Else
        If (rB > rG) Then
            Maximum = rB
        Else
            Maximum = rG
        End If
    End If
End Function

Private Function Minimum(rR As Single, rG As Single, rB As Single) As Single
    If (rR < rG) Then
        If (rR < rB) Then
            Minimum = rR
        Else
            Minimum = rB
        End If
    Else
        If (rB < rG) Then
            Minimum = rB
        Else
            Minimum = rG
        End If
    End If


End Function

[解决办法]
其实原理很简单,所谓的亮度就是灰度中的颜色度。
即:(R+G+B)/3=灰度色,也可以理解为亮度大小,0为最暗,255为最亮
根据这个原理,灰度色小于200的值你就累计加一就可以了。
[解决办法]
亮度和灰度不是等同的概念
灰度 = (R*299 + G*587 + B*114 + 500) / 1000
变种:
灰度 = (R*30 + G*59 + B*11 + 50) / 100

从代码可以看出l = (Max + Min) / 2,亮度应该是R,G,B三个数值中的(最大值+最小值)/2
[解决办法]
读取BMP文件可以直接采用读取文件的方式,只不过不保留前面的信息字节(好像是54个字节),剩下的就是BMP的数据,数据的存储方式是从右下角到左上角的。这个可以具体参考一下BMP的文件结构(网上有),并且自己用画图板做几个图试验一下就明白了。

热点排行