注册 登录
编程论坛 VB6论坛

把灰度图转换为单色假彩色图像,要有强度区别,这样代码对么

张live 发布于 2015-04-22 15:41, 2053 次点击
程序代码:
Dim x, y, hdc1, imgr As Long
Dim img As Long
hdc1 = Pic1.hdc
For x = 0 To Pic1.Width
For y = 0 To Pic1.Height
img = GetPixel(hdc1, x, y)
imgr = Red(img)
Pic4.PSet (x, y), RGB(imgr, 0, 0)
Next y
Next x

上面是我写的源代码,菜鸟不会,正在努力学习中,求大神多多指点与帮助,小弟感激不尽。不会上图,出来效果了,但是不懂什么是强度区别。
15 回复
#2
lianyicq2015-04-22 15:55
你这个问题来源于VB之外,是图像处理的问题吧。知道了什么是灰度,什么是假彩色,知道了转换的原理,才可能用VB实现。
img是取到的x,y坐标点象素的RGB值。这个Red是自定义的?
#3
张live2015-04-22 16:01
red的确是自定义的,我想知道的问题是这样用vb处理之后的图像是否具有强度区别。非常感谢您的回答。
#4
lianyicq2015-04-22 16:12
估计你是把R值分离出来再显示,就象这个
Private Sub Command1_Click()
Picture1.AutoSize = False
Picture2.AutoSize = False
Picture1.AutoRedraw = True
Picture2.AutoRedraw = True
Picture1.ScaleMode = 3
Picture2.ScaleMode = 3
CommonDialog1.ShowOpen
Picture1.Picture = LoadPicture(CommonDialog1.FileName)
End Sub
Private Sub Command2_Click()
Dim i, j As Integer
Dim r, g, b As Integer
Dim color As Long
For i = 0 To Picture1.ScaleWidth
For j = 0 To Picture1.ScaleHeight
color = Picture1.Point(i, j)
r = (color And &HFF&)
g = (color And &HFF00&) \ 256&
b = (color And &HFF0000) \ 65536
Select Case Text1.Text
  Case Is = "r"
  Picture2.PSet (i, j), RGB(r, 0, 0)
  Case Is = "g"
  Picture2.PSet (i, j), RGB(0, g, 0)
  Case Is = "b"
  Picture2.PSet (i, j), RGB(0, 0, b)
  Case Is = "c"
  Picture2.PSet (i, j), RGB(r, g, b)
  End Select
Next j
Next i
Picture2.Refresh
End Sub
根据text1.text决定显示r,g,b通道或彩色

你应该用强度分层法来显示伪彩色。比如把灰度分为n级,每一级采用一种颜色。
#5
风吹过b2015-04-22 16:20
你应该这样做。
img = GetPixel(hdc1, x, y)
这里是读出亮度代码,然后这个亮度值,应该是从 0 - 255
亮度公式
0.299*红+0.587*绿+0.114*蓝=亮度(0-255)
直接读出来的值,如果大于 255 的,那说明读到仍然是 RGB 代码,需要 按三个字节去区分。

如果你照这个亮度去直接转换一个线性颜色,那得得到了肯定无法有强度的区别了。

要么就把这 0-255 ,分成如64级或32级,然后显示出来。
如 0-3 ,=0
   4-7   =4
这种的分级。
#6
lianyicq2015-04-22 16:28
源是灰度图像,R、G、B值是相等的。取一个就可以计算灰度等级。
#7
张live2015-04-22 16:31
大神,您上边给出的代码应该就是说的直接提取的r值然后显示的吧,那您说的强度分层法是指什么,大概意思就中,我还是初学,谢谢您
#8
张live2015-04-22 16:37
回复 4楼 lianyicq
大神,您上边给出的代码应该就是说的直接提取的r值然后显示的吧,那您说的强度分层法是指什么,大概意思就中,我还是初学,谢谢您
#9
张live2015-04-22 16:37
回复 5楼 风吹过b
如果按照您说的那样分级的话,像素丢失会不会比较严重呢?
#10
lianyicq2015-04-22 16:46
回复 8楼 张live
伪彩色本来就不反映真实颜色。
我上的代码是估计你就是这样考虑的。那只是显示RGB的三个独立通道。
灰度一般是1个字节存储。分为256级。如果采用强度分层,只用四色,比如红,黄,绿,蓝。
那么以0~63的灰度值用红色代替
64~127的灰度值用黄色代替
以此类推。
看看一张灰度图片,按强度分为五色的效果
只有本站会员才能查看附件,请 登录


[ 本帖最后由 lianyicq 于 2015-4-22 16:49 编辑 ]
#11
张live2015-04-22 16:52
回复 10楼 lianyicq
哦,原来是这个意思啊,那您能提供一下您使用的代码么,我从中提取一下单色的使用方法,不知道可不可以。不管可不可以,都谢谢您。
#12
lianyicq2015-04-22 17:01
代码可以在4楼基础上修改
...
color = Picture1.Point(i, j)
r = (color And &HFF&)
Picture2.PSet (i, j), c(int(r/(256/n)))    'n是分层颜色数,c()长型数组,存放预设颜色的RGB值
 Next j
Next i
Picture2.Refresh
...
#13
张live2015-04-22 17:03
回复 12楼 lianyicq
谢谢您的回答,我现在就去试一试,有问题再请教您,谢谢了。
#14
张live2015-04-24 12:03
回复 10楼 lianyicq
大神您能把这张图的测试代码发给我一下么,单独的那张按您说的我做出来了,效果还不错(我新手不会贴图),但是合成的时候没效果不知道为啥,您有时间帮下忙谢谢。
#15
lianyicq2015-04-24 12:23
回复 14楼 张live
可以在文本框中自定义分层数,颜色随机生成。
程序代码:
Option Explicit
Dim c() As Long
Private Sub Command1_Click()
Picture1.AutoSize = False
Picture2.AutoSize = False
Picture1.AutoRedraw = True
Picture2.AutoRedraw = True
Picture1.ScaleMode = 3
Picture2.ScaleMode = 3
CommonDialog1.ShowOpen
Picture1.Picture = LoadPicture(CommonDialog1.FileName)

End Sub

Private Sub Command2_Click()
GenColor
Dim i, j As Integer
Dim r, g, b As Integer
Dim color As Long
For i = 0 To Picture1.ScaleWidth
For j = 0 To Picture1.ScaleHeight
color = Picture1.Point(i, j)
r = (color And &HFF&)
Picture2.PSet (i, j), c(1 + Int(r / (256 / Val(Text1.Text))))

Next j
Next i
Picture2.Refresh

End Sub

Sub GenColor()
Dim i As Integer
For i = 1 To Val(Text1.Text)
ReDim Preserve c(i)
c(i) = RGB(Int(255 * Rnd + 1), Int(255 * Rnd + 1), Int(255 * Rnd + 1))
Next
End Sub

 
#16
张live2015-04-24 12:34
回复 15楼 lianyicq
真是感激不尽,谢谢您的帮助,如果有什么我能帮到您的您@我
1