gray=0.299r+0.587g+0.114b so try tihs
if green * 0.587 > red * 0.299 and green * 0.587 > blue * 0.114

解决方案 »

  1.   

    不如将绿色的点改为灰度如何?就强行把该点颜色改为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
      

  2.   

    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
      

  3.   

    我很久以前就想过把它改为灰度了,但改为灰度不行的。还是很明显的看的出。后来才想干脆用盘边的像素代替好了(象用PHOTOSHOP里的象皮图章工具~^_^),可得出的效果却更糟糕。。我做了很多的实验,发现即使灰度的地方,也是有三种颜色的,只是三种颜色几乎相等。而绿色的地方,只是颜色比另两种要高一点。后来又做个这个实验:'RGB(MYred + Text2.Text, MYgreen + Text3.Text, MYblue + Text4.Text)  (就是上面那段源代码注释掉那句)
    程序运行后,我一次次的改变那三个文本框里的数据(主要是绿色,但我发现其它那些颜色是有偏差的,这偏差来自显示器),后得出很多的数据,基本是在绿色为16左右,另两个10左右(很久了,记不清楚了~)。。但还是不理想……这个问题我认为是图象(R、G、B色彩)方面最难的一个题了~~我几乎都研究了快半年了,也看了很多的图象方面的书,都毫无所获……
    但我这个人就是只要有问题,就会不想通绝不罢休的那种人~汗……哈哈
      

  4.   

    Picture2.ScaleMode 没有设置,结果只改了一小块,因为默认的是vbTwips
      

  5.   

    你试试PHOtoshop魔术棒(调整容差)可不可以全部将你图中的绿色选出来?如果能选出来,那程序就可以实现喽:)如果PHOTOSHOP都做不到,那我们自然做起来会很困难啦。~~
      

  6.   

    用photoshop当然可以选出来。
    选出来不是问题,主要是怎么把它们去掉。。
    是否有一种算法可以把绿色去掉。
    不是把绿色值完全去掉,而是看上去不觉得是绿色了。?
      

  7.   

    先问一下你想要实现的效果,既然这种方法不行,只要实现相同的效果,用其他方法还是可以的,另外,送你一个简单的取得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
      

  8.   

    thirdapple(第三只苹果)
    非常感谢你,取颜色办法我已经知道了(前面的代码都已经用了呀)。
    我现在只是想知道怎么才能把一张图上的绿色的地方给取掉。
    不是把绿色值去掉,也不是把那个像素值给去掉,只是让那个地方看起来不再是绿色。
      

  9.   

    请大家看看下面这段代码为什么不能成功好吗。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左边左边一位来代替它。但运行后,图片很多处被扭曲了。(各位可以拿张上面有绿色图片试一试)
    而且还有很多绿色没有被去掉……不知道这是为什么?
      

  10.   

    zyl兄的代码可以做到消除绿色啊.当然还是会有痕迹的..因为颜色替换也没办法.但不会出现扭曲啊.
    不过这个速度未免有点...
      

  11.   

    稍微修改了一下(将绿色变成平均,这样效果好一点)
    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
      

  12.   

    to zyl910(910:分儿,我来了!) :
       非常感谢你!但取中值的办法不行的,而且绿色好象更加浓了,
    end to
    '----------------------------
    to thirdapple(第三只苹果):
       我的油箱地址:[email protected]
      请发给我《中值去噪法》看看
      谢谢了!!
    end to
      

  13.   

    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
        
      

  14.   


        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