不如将绿色的点改为灰度如何?就强行把该点颜色改为RGB的平均值 看看吧。Dim X As Long Dim Y As Long Dim MYred As Long Dim MYgreen As Long Dim MYblue As Long dim MYAVG AS LONGDim YanSe As Long Dim n As Long Picture1.ScaleMode = vbPixels For X = 1 To Picture1.ScaleWidth For Y = 1 To Picture1.ScaleHeight YanSe = Picture1.Point(X, Y) MYred = YanSe And &HFF MYgreen = (YanSe \ &H100) And &HFF MYblue = (YanSe \ &H10000) And &HFF MYAVG=(MYRED+MYGREEN+MYBLUE)/3 If MYgreen > MYred And MYgreen > MYblue Then YanSe = RGB(MYAVG,MYAVG,MYAVG) End If Picture2.PSet (X, Y), YanSe Next Y Next X
Dim X As Long Dim Y As Long Dim MYred As Long Dim MYgreen As Long Dim MYblue As Long dim MYAVG AS LONGDim YanSe As Long Dim n As Long Picture1.ScaleMode = vbPixels For X = 1 To Picture1.ScaleWidth For Y = 1 To Picture1.ScaleHeight YanSe = Picture1.Point(X, Y) MYred = YanSe And &HFF MYgreen = (YanSe And &HFF00&) \ &H100 MYblue = (YanSe And &HFF0000) \ &H10000 If MYgreen > iif(MYred > MYblue, MYred, MYblue) Then '大于RB的最大数 MYAVG=0.299*MYred+0.587*MYgreen+0.114*MYblue YanSe = RGB(MYAVG,MYAVG,MYAVG) End If Picture2.PSet (X, Y), YanSe Next Y Next X
先问一下你想要实现的效果,既然这种方法不行,只要实现相同的效果,用其他方法还是可以的,另外,送你一个简单的取得Red,Green,Blue的方法: Public Function GetRedValue(COLOR As Long) As Integer GetRedValue = COLOR And &HFF End Function Public Function GetGreenValue(COLOR As Long) As Integer GetGreenValue = (COLOR And 65280) \ 256 End Function Public Function GetBlueValue(COLOR As Long) As Integer GetBlueValue = (COLOR And &HFF0000) \ 65536 End Function
请大家看看下面这段代码为什么不能成功好吗。Dim X As Long Dim Y As Long Dim MYred As Long Dim MYgreen As Long Dim MYblue As Long Dim YanSe As Long Picture1.ScaleMode = vbPixels For X = 1 To Picture1.ScaleWidth For Y = 1 To Picture1.ScaleHeight YanSe = Picture1.Point(X, Y) MYred = YanSe And &HFF MYgreen = (YanSe \ &H100) And &HFF MYblue = (YanSe \ &H10000) And &HFF If MYgreen > MYred And MYgreen > MYblue Then YanSe = Picture1.Point(X - 1, Y) End If Picture2.PSet (X, Y), YanSe Next Y Next X我说一下上面这段代码的意思:就是遍历整张图片,发现为绿色的那个像素(绿色值大于红色和蓝色)就用那个像素的X左边左边一位来代替它。但运行后,图片很多处被扭曲了。(各位可以拿张上面有绿色图片试一试) 而且还有很多绿色没有被去掉……不知道这是为什么?
稍微修改了一下(将绿色变成平均,这样效果好一点) Dim X As Long Dim Y As Long Dim MYred As Long Dim MYgreen As Long Dim MYblue As Long dim MYAVG AS LONGDim YanSe As Long Dim n As Long Picture1.ScaleMode = vbPixels For X = 1 To Picture1.ScaleWidth For Y = 1 To Picture1.ScaleHeight YanSe = Picture1.Point(X, Y) MYred = YanSe And &HFF MYgreen = (YanSe And &HFF00&) \ &H100 MYblue = (YanSe And &HFF0000) \ &H10000 If MYgreen > iif(MYred > MYblue, MYred, MYblue) Then '大于RB的最大数 MYAVG=0.299*MYred+0.587*MYgreen+0.114*MYblue YanSe = RGB(MYred,MYAVG,MYblue) End If Picture2.PSet (X, Y), YanSe Next Y Next X
to zyl910(910:分儿,我来了!) : 非常感谢你!但取中值的办法不行的,而且绿色好象更加浓了, end to '---------------------------- to thirdapple(第三只苹果): 我的油箱地址:[email protected] 请发给我《中值去噪法》看看 谢谢了!! end to
Dim X As Long Dim Y As Long Dim MYred As Long Dim MYgreen As Long Dim MYblue As Long Dim MYAVG As Long
Dim YanSe As Long Dim n As Long Picture1.ScaleMode = vbPixels For X = 1 To Picture1.ScaleWidth For Y = 1 To Picture1.ScaleHeight YanSe = Picture1.Point(X, Y) MYred = YanSe And &HFF MYgreen = (YanSe And &HFF00&) \ &H100 MYblue = (YanSe And &HFF0000) \ &H10000 If MYgreen > IIf(MYred > MYblue, MYred, MYblue) Then '大于RB的最大数 MYAVG = 0.299 * MYred + 0.587 * MYgreen + 0.114 * MYblue YanSe = RGB(MYred, IIf(MYAVG < MYgreen, MYAVG, MYgreen) - Abs(MYgreen - MYAVG) / 2, MYblue) End If Picture2.PSet (X, Y), YanSe Next Y Next X
Dim X As Long Dim Y As Long Dim MYred As Long Dim MYgreen As Long Dim MYblue As Long Dim MYAVG As Long
Dim YanSe As Long Dim n As Long Picture1.ScaleMode = vbPixels For X = 0 To Picture1.ScaleWidth For Y = 0 To Picture1.ScaleHeight YanSe = Picture1.Point(X, Y) MYred = YanSe And &HFF MYgreen = (YanSe And &HFF00&) \ &H100 MYblue = (YanSe And &HFF0000) \ &H10000 If MYgreen > IIf(MYred > MYblue, MYred, MYblue) Then '大于RB的最大数 MYAVG = 0.299 * MYred + 0.587 * MYgreen + 0.114 * MYblue MYAVG = IIf(MYAVG < MYgreen, MYAVG, MYgreen) - Abs(MYgreen - MYAVG) / 2 MYAVG = 0.299 * MYred + 0.587 * MYgreen + 0.114 * MYblue YanSe = RGB(MYred, MYAVG, MYblue) End If Picture2.PSet (X, Y), YanSe Next Y Next X
看看吧。Dim X As Long
Dim Y As Long
Dim MYred As Long
Dim MYgreen As Long
Dim MYblue As Long
dim MYAVG AS LONGDim YanSe As Long
Dim n As Long
Picture1.ScaleMode = vbPixels
For X = 1 To Picture1.ScaleWidth
For Y = 1 To Picture1.ScaleHeight
YanSe = Picture1.Point(X, Y)
MYred = YanSe And &HFF
MYgreen = (YanSe \ &H100) And &HFF
MYblue = (YanSe \ &H10000) And &HFF
MYAVG=(MYRED+MYGREEN+MYBLUE)/3
If MYgreen > MYred And MYgreen > MYblue Then
YanSe = RGB(MYAVG,MYAVG,MYAVG)
End If
Picture2.PSet (X, Y), YanSe
Next Y
Next X
Dim Y As Long
Dim MYred As Long
Dim MYgreen As Long
Dim MYblue As Long
dim MYAVG AS LONGDim YanSe As Long
Dim n As Long
Picture1.ScaleMode = vbPixels
For X = 1 To Picture1.ScaleWidth
For Y = 1 To Picture1.ScaleHeight
YanSe = Picture1.Point(X, Y)
MYred = YanSe And &HFF
MYgreen = (YanSe And &HFF00&) \ &H100
MYblue = (YanSe And &HFF0000) \ &H10000
If MYgreen > iif(MYred > MYblue, MYred, MYblue) Then '大于RB的最大数
MYAVG=0.299*MYred+0.587*MYgreen+0.114*MYblue
YanSe = RGB(MYAVG,MYAVG,MYAVG)
End If
Picture2.PSet (X, Y), YanSe
Next Y
Next X
程序运行后,我一次次的改变那三个文本框里的数据(主要是绿色,但我发现其它那些颜色是有偏差的,这偏差来自显示器),后得出很多的数据,基本是在绿色为16左右,另两个10左右(很久了,记不清楚了~)。。但还是不理想……这个问题我认为是图象(R、G、B色彩)方面最难的一个题了~~我几乎都研究了快半年了,也看了很多的图象方面的书,都毫无所获……
但我这个人就是只要有问题,就会不想通绝不罢休的那种人~汗……哈哈
选出来不是问题,主要是怎么把它们去掉。。
是否有一种算法可以把绿色去掉。
不是把绿色值完全去掉,而是看上去不觉得是绿色了。?
Public Function GetRedValue(COLOR As Long) As Integer
GetRedValue = COLOR And &HFF
End Function
Public Function GetGreenValue(COLOR As Long) As Integer
GetGreenValue = (COLOR And 65280) \ 256
End Function
Public Function GetBlueValue(COLOR As Long) As Integer
GetBlueValue = (COLOR And &HFF0000) \ 65536
End Function
非常感谢你,取颜色办法我已经知道了(前面的代码都已经用了呀)。
我现在只是想知道怎么才能把一张图上的绿色的地方给取掉。
不是把绿色值去掉,也不是把那个像素值给去掉,只是让那个地方看起来不再是绿色。
Dim Y As Long
Dim MYred As Long
Dim MYgreen As Long
Dim MYblue As Long
Dim YanSe As Long
Picture1.ScaleMode = vbPixels
For X = 1 To Picture1.ScaleWidth
For Y = 1 To Picture1.ScaleHeight
YanSe = Picture1.Point(X, Y)
MYred = YanSe And &HFF
MYgreen = (YanSe \ &H100) And &HFF
MYblue = (YanSe \ &H10000) And &HFF
If MYgreen > MYred And MYgreen > MYblue Then
YanSe = Picture1.Point(X - 1, Y)
End If
Picture2.PSet (X, Y), YanSe
Next Y
Next X我说一下上面这段代码的意思:就是遍历整张图片,发现为绿色的那个像素(绿色值大于红色和蓝色)就用那个像素的X左边左边一位来代替它。但运行后,图片很多处被扭曲了。(各位可以拿张上面有绿色图片试一试)
而且还有很多绿色没有被去掉……不知道这是为什么?
不过这个速度未免有点...
Dim X As Long
Dim Y As Long
Dim MYred As Long
Dim MYgreen As Long
Dim MYblue As Long
dim MYAVG AS LONGDim YanSe As Long
Dim n As Long
Picture1.ScaleMode = vbPixels
For X = 1 To Picture1.ScaleWidth
For Y = 1 To Picture1.ScaleHeight
YanSe = Picture1.Point(X, Y)
MYred = YanSe And &HFF
MYgreen = (YanSe And &HFF00&) \ &H100
MYblue = (YanSe And &HFF0000) \ &H10000
If MYgreen > iif(MYred > MYblue, MYred, MYblue) Then '大于RB的最大数
MYAVG=0.299*MYred+0.587*MYgreen+0.114*MYblue
YanSe = RGB(MYred,MYAVG,MYblue)
End If
Picture2.PSet (X, Y), YanSe
Next Y
Next X
非常感谢你!但取中值的办法不行的,而且绿色好象更加浓了,
end to
'----------------------------
to thirdapple(第三只苹果):
我的油箱地址:[email protected]
请发给我《中值去噪法》看看
谢谢了!!
end to
Dim Y As Long
Dim MYred As Long
Dim MYgreen As Long
Dim MYblue As Long
Dim MYAVG As Long
Dim YanSe As Long
Dim n As Long
Picture1.ScaleMode = vbPixels
For X = 1 To Picture1.ScaleWidth
For Y = 1 To Picture1.ScaleHeight
YanSe = Picture1.Point(X, Y)
MYred = YanSe And &HFF
MYgreen = (YanSe And &HFF00&) \ &H100
MYblue = (YanSe And &HFF0000) \ &H10000
If MYgreen > IIf(MYred > MYblue, MYred, MYblue) Then '大于RB的最大数
MYAVG = 0.299 * MYred + 0.587 * MYgreen + 0.114 * MYblue
YanSe = RGB(MYred, IIf(MYAVG < MYgreen, MYAVG, MYgreen) - Abs(MYgreen - MYAVG) / 2, MYblue)
End If
Picture2.PSet (X, Y), YanSe
Next Y
Next X
Dim X As Long
Dim Y As Long
Dim MYred As Long
Dim MYgreen As Long
Dim MYblue As Long
Dim MYAVG As Long
Dim YanSe As Long
Dim n As Long
Picture1.ScaleMode = vbPixels
For X = 0 To Picture1.ScaleWidth
For Y = 0 To Picture1.ScaleHeight
YanSe = Picture1.Point(X, Y)
MYred = YanSe And &HFF
MYgreen = (YanSe And &HFF00&) \ &H100
MYblue = (YanSe And &HFF0000) \ &H10000
If MYgreen > IIf(MYred > MYblue, MYred, MYblue) Then '大于RB的最大数
MYAVG = 0.299 * MYred + 0.587 * MYgreen + 0.114 * MYblue
MYAVG = IIf(MYAVG < MYgreen, MYAVG, MYgreen) - Abs(MYgreen - MYAVG) / 2
MYAVG = 0.299 * MYred + 0.587 * MYgreen + 0.114 * MYblue
YanSe = RGB(MYred, MYAVG, MYblue)
End If
Picture2.PSet (X, Y), YanSe
Next Y
Next X