'伪彩色图象 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
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
to chewinggum(口香糖·把减肥列入下一个五年计划):你有些偏见了现在伪彩色常用的方法有两种: 1。根据灰度划定阈值范围 2。根据特征频域确定阈值范围到现在为止,还没有把模式识别的结果作为伪彩色的标准的做法我的属于第一种你可以查下相关资料伪彩色我是研究过的具体的区间是要靠经验确定的。我的代码只是个实现例子。
还有,如果楼主可以的话,自己试试看做伪彩转换程序。 大体的算法如下: 灰度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)就可以了。
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
1。根据灰度划定阈值范围
2。根据特征频域确定阈值范围到现在为止,还没有把模式识别的结果作为伪彩色的标准的做法我的属于第一种你可以查下相关资料伪彩色我是研究过的具体的区间是要靠经验确定的。我的代码只是个实现例子。
大体的算法如下:
灰度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)就可以了。
蒙版的白色部分是透明的,黑色部分是不透明的。
我们这里就是利用了这一点,全选前后的两个图像其实本来就同时存在于一幅图中的。没全选时你看不到下面的美女图是利用了人眼睛的辨别精度有限这一缺陷(这也许就是视若无睹吧,呵呵),当全选时,上边我们提到的蒙版中黑色部分盖住的正好是绿叶那一部分,所以绿叶看不到了!而那张美女图的像素正好处于白色部分范围,也就是透明范围,所以看到的只有她了.明白了吗? 用楼主发的教程作了一下,并作了个试验,过程我就不说了,太麻烦,呵呵!
刚才发的那个车只是个试验,大家没有发现嘛其实调完色相后你的图片并没有变为黑白色,如果你在PS里将图片放到最大值就能清楚的看见了,因为你并没有把全图全部调整色相而是用自订义图案所给的选区调整的,上面那位叫客人的朋友的那张最小的图片没有成功是因为你的图片太小用完填充后的间距也相对比较大,所以出现了上面的效果,并不是没成功,而是说明了一个问题,它并不是黑白的!而是单一的有规律的大面积颜色块,你的图像越大看起来就越像黑白色的,就像我们用的显示器一样,像素越高表现出的图像色彩也就越细腻,只是像而已。而且并不是所有图片都能在全选下出现颜色,你的图片色彩丰富就不行了,比如我所发的一段车头的图片。
当你全选的时候(Alt+a)在网页里会以蓝色填充以表示你已全选,这样蓝色就把你图片上的单一色块填充上了,因为你事先已经调整过这幅图的色相,(要说明一下:每一幅图调整出的色相也不一样)所以当蓝色把单一颜色块填充后,会和你调整后的单一色块产生配色,这样有的图片就能呈现出颜色,但是这种颜色也不是原本所具有的色彩!