图像处理问题:请问哪位老师能贴个黑白图象转换成伪彩的代码?本人是医生,只会写点简单的VB程序,看到我们医院的超声设备能把黑白的图象加上伪彩处理,对医生有一定的辅助作用,哪位老师能帮得上忙的吗?谢谢!

解决方案 »

  1.   

    '伪彩色图象
      Function Wcs() As Boolean
        Dim MapArr() As Color32
        Dim OldMapArr() As Color32
        'Dim TempLng As Long
        Dim i As Long, maxi As Long
        Dim j As Long, maxj As Long
        Dim temp As Single
        
        maxi = MyBMIH.biHeight - 1
        maxj = MyBMIH.biWidth - 1
        
        Me.MapArrayLong VarPtrArray(MapArr)
        OldMapArr = MapArr    For j = 0 To maxj
            For i = 0 To maxi
            temp = OldMapArr(j, i).r * 0.3 + OldMapArr(j, i).G * 0.59 + OldMapArr(j, i).b * 0.11       If temp > 32 Then
               If temp > 64 Then
                  If temp > 96 Then
                    If temp > 128 Then
                       If temp > 160 Then
                          If temp > 192 Then
                             If temp > 224 Then
                               If temp > 255 Then
                               Else
                                       MapArr(j, i).r = 255
                                       MapArr(j, i).G = 255
                                       MapArr(j, i).b = 255
                               End If
                             Else
                                       MapArr(j, i).r = 255
                                       MapArr(j, i).G = 255
                                       MapArr(j, i).b = 255
                            End If
                          Else
                                       MapArr(j, i).r = 255
                                       MapArr(j, i).G = 255
                                       MapArr(j, i).b = 255
                          End If
                       Else
                                       MapArr(j, i).r = 255
                                       MapArr(j, i).G = 255
                                       MapArr(j, i).b = 255
                       End If
                    Else
                                       MapArr(j, i).r = 255
                                       MapArr(j, i).G = 255
                                       MapArr(j, i).b = 255
                    End If
                  Else
                                       MapArr(j, i).r = 255
                                       MapArr(j, i).G = 255
                                       MapArr(j, i).b = 255
                  End If
               Else
                                       MapArr(j, i).r = 0
                                       MapArr(j, i).G = 0
                                       MapArr(j, i).b = 0
               End If
            Else
                                       MapArr(j, i).r = 0
                                       MapArr(j, i).G = 0
                                       MapArr(j, i).b = 0
            End If
                     
                     
            Next i
        Next
        
    End Function
      

  2.   

    to  chewinggum(口香糖·把减肥列入下一个五年计划):你有些偏见了现在伪彩色常用的方法有两种:
    1。根据灰度划定阈值范围
    2。根据特征频域确定阈值范围到现在为止,还没有把模式识别的结果作为伪彩色的标准的做法我的属于第一种你可以查下相关资料伪彩色我是研究过的具体的区间是要靠经验确定的。我的代码只是个实现例子。
      

  3.   

    还有,如果楼主可以的话,自己试试看做伪彩转换程序。
    大体的算法如下:
    灰度256级的黑白照,将整个灰度空间4等分,每64级一段红色的灰度对应方程R(Gray)为: 
                            Red = 0            (0 <= Gray <= 127)
                Red = Gray * 4     (128 <= Gray <= 191)
                            Red = 255          (192 <= Gray <= 255) 绿色的灰度对应方程G(Gray)为: 
                            Green = Gray * 4         (0 <= Gray <= 63)
                            Green = 255              (64 <= Gray <= 191) 
                            Green = 1020 - 4 * Gray  (192 <= Gray <= 255)蓝色的灰度对应方程B(Gray)为: 
                            Blue = 255            (0 <= Gray <= 63)
                            Blue= 510 - 4 * Gray  (64 <= Gray <= 127)
                            Blue=0                (128 <= Gray <= 255)另外补充一句,楼上的程序中:
    temp = OldMapArr(j, i).r * 0.3 + OldMapArr(j, i).G * 0.59 + OldMapArr(j, i).b * 0.11
    这记忆一句是不必要的,楼主本来就是一个灰度图,不必再花这么多浮点运算转换成灰度了。
    因此只要在原图上任意点的像素值中的任取一点,该点的R,G,B三个值是相同的,并且该点的灰度值也等于这个值,因此即使使用了上面的这个语句来转换,你也会发现Gray=Green=Red=Blue
    再说一下程序的思路:
    先用两次循环获得整个图片的每一点像素值。
    从图取得的点的颜色值是一个长整数,要把里面的R,G,B分离出来,算法入下:
    Red = Color mod 256
    Color = Color \ 256
    Green = Color mod 256
    Blue = Color \ 256
    由于本来就是一个灰度图,即使转换成R,G,B值,三者也是相等的,(前文已经说过,因此任取一个就行)
    改为:
    Gray(x,y) = Color(x,y) \ 256然后,代上面给出的公示
    计算每一点的新颜色:
    Dot(x,y) = RGB(R(Gray(x,y)),G(Gray(x,y)) ,B(G(x,y)))
    然后把新的线素画到原来的位置(x,y)就可以了。
      

  4.   

    谢谢大家的回复,我的邮箱[email protected],再次感谢!CSDN确实是个好地方!
      

  5.   

    同意 DooDu的说法了,WallesCai给出的转换公式中Red = Gray * 4(128 <= Gray <= 191)应该不对,超出范围了,不过按照该转换的确能得到挺不错的伪彩色结果。
      

  6.   

    windows中图片是否被全选的标志就是,是否在其上面加了一个黑白相间的梦版。 
    蒙版的白色部分是透明的,黑色部分是不透明的。 
    我们这里就是利用了这一点,全选前后的两个图像其实本来就同时存在于一幅图中的。没全选时你看不到下面的美女图是利用了人眼睛的辨别精度有限这一缺陷(这也许就是视若无睹吧,呵呵),当全选时,上边我们提到的蒙版中黑色部分盖住的正好是绿叶那一部分,所以绿叶看不到了!而那张美女图的像素正好处于白色部分范围,也就是透明范围,所以看到的只有她了.明白了吗? 用楼主发的教程作了一下,并作了个试验,过程我就不说了,太麻烦,呵呵!
        刚才发的那个车只是个试验,大家没有发现嘛其实调完色相后你的图片并没有变为黑白色,如果你在PS里将图片放到最大值就能清楚的看见了,因为你并没有把全图全部调整色相而是用自订义图案所给的选区调整的,上面那位叫客人的朋友的那张最小的图片没有成功是因为你的图片太小用完填充后的间距也相对比较大,所以出现了上面的效果,并不是没成功,而是说明了一个问题,它并不是黑白的!而是单一的有规律的大面积颜色块,你的图像越大看起来就越像黑白色的,就像我们用的显示器一样,像素越高表现出的图像色彩也就越细腻,只是像而已。而且并不是所有图片都能在全选下出现颜色,你的图片色彩丰富就不行了,比如我所发的一段车头的图片。
        当你全选的时候(Alt+a)在网页里会以蓝色填充以表示你已全选,这样蓝色就把你图片上的单一色块填充上了,因为你事先已经调整过这幅图的色相,(要说明一下:每一幅图调整出的色相也不一样)所以当蓝色把单一颜色块填充后,会和你调整后的单一色块产生配色,这样有的图片就能呈现出颜色,但是这种颜色也不是原本所具有的色彩!
      

  7.   

    再次感谢各位,特别是DOODU和chewinggum两位大侠,问题算是有个完美的答案了——在看帮助给各位加分哈