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

?VB对BMP文件进行统计解决办法

2012-01-22 
?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的文件结构(网上有),并且自己用画图板做几个图试验一下就明白了。

热点排行