下面的代码,供参考。基本思路是,取得黑白图像的灰度值(例子中用彩色图像代替,但先将其转成黑白图像),然后再在颜色表中查找得到颜色。 需要优化的地方:1)可用API函数代替point,pset,速度会更快。2)颜色表可适当选取。 Option Explicit Private mCol() As LongPrivate Sub Command1_Click() Dim w As Long, h As Long w = Picture1.ScaleWidth h = Picture1.ScaleHeight Dim x As Long, y As Long, RealCol As Long Dim r As Long, g As Long, b As Long, grayCol As Long Dim nCol As Long For x = 0 To w For y = 0 To h RealCol = Picture1.Point(x, y) r = RealCol Mod 256 g = (RealCol Mod 65536) \ 256 b = RealCol \ 65536 grayCol = (9798 * r + 19235 * g + 3735 * b) / 32768 If grayCol < 32 Then nCol = mCol(0) ElseIf grayCol < 64 Then nCol = mCol(1) ElseIf grayCol < 96 Then nCol = mCol(2) ElseIf grayCol < 128 Then nCol = mCol(3) ElseIf grayCol < 160 Then nCol = mCol(4) ElseIf grayCol < 192 Then nCol = mCol(5) ElseIf grayCol < 224 Then nCol = mCol(6) Else nCol = mCol(7) End If Picture1.PSet (x, y), nCol DoEvents Next y Next x
End SubPrivate Sub Form_Load() ReDim mCol(7) mCol(0) = ColorConstants.vbBlack mCol(1) = ColorConstants.vbGreen mCol(2) = ColorConstants.vbRed mCol(3) = ColorConstants.vbBlue mCol(4) = ColorConstants.vbCyan mCol(5) = ColorConstants.vbMagenta mCol(6) = ColorConstants.vbYellow mCol(7) = ColorConstants.vbWhite End SubPrivate Sub Form_Unload(Cancel As Integer) Erase mCol End Sub
ding一下,医生都能写程序了!
to yuanyc(yyc) : 我个人认为专业性的软件其实应该由具有相关专业知识的人来写,即使是计算机的博士也未必能搞得定一个比较专业化的算法,至少他先要去学习相关专业知识。
需要优化的地方:1)可用API函数代替point,pset,速度会更快。2)颜色表可适当选取。
Option Explicit
Private mCol() As LongPrivate Sub Command1_Click()
Dim w As Long, h As Long
w = Picture1.ScaleWidth
h = Picture1.ScaleHeight
Dim x As Long, y As Long, RealCol As Long
Dim r As Long, g As Long, b As Long, grayCol As Long
Dim nCol As Long
For x = 0 To w
For y = 0 To h
RealCol = Picture1.Point(x, y)
r = RealCol Mod 256
g = (RealCol Mod 65536) \ 256
b = RealCol \ 65536
grayCol = (9798 * r + 19235 * g + 3735 * b) / 32768
If grayCol < 32 Then
nCol = mCol(0)
ElseIf grayCol < 64 Then
nCol = mCol(1)
ElseIf grayCol < 96 Then
nCol = mCol(2)
ElseIf grayCol < 128 Then
nCol = mCol(3)
ElseIf grayCol < 160 Then
nCol = mCol(4)
ElseIf grayCol < 192 Then
nCol = mCol(5)
ElseIf grayCol < 224 Then
nCol = mCol(6)
Else
nCol = mCol(7)
End If
Picture1.PSet (x, y), nCol
DoEvents
Next y
Next x
End SubPrivate Sub Form_Load()
ReDim mCol(7)
mCol(0) = ColorConstants.vbBlack
mCol(1) = ColorConstants.vbGreen
mCol(2) = ColorConstants.vbRed
mCol(3) = ColorConstants.vbBlue
mCol(4) = ColorConstants.vbCyan
mCol(5) = ColorConstants.vbMagenta
mCol(6) = ColorConstants.vbYellow
mCol(7) = ColorConstants.vbWhite
End SubPrivate Sub Form_Unload(Cancel As Integer)
Erase mCol
End Sub
我个人认为专业性的软件其实应该由具有相关专业知识的人来写,即使是计算机的博士也未必能搞得定一个比较专业化的算法,至少他先要去学习相关专业知识。
大体的算法如下:
灰度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)就可以了。
“楼主告诉病人说自己是个程序员,不知道病人会不会昏厥 哈哈”——一般我这么说的话,包括同事在内,都觉得我不是凡人,概括一下三字:“了不起”,——其实对写程序来说,我是门外汉,只能当做是一项业余兴趣。对不起,不知道怎么引用大家的回复:D不知道有没有朋友愿意合作开发DICOM相关的软件,有几家医疗器械公司的朋友叫我开发这么个东西,跟他们销售的影像设备打包的方式销售,要求很简单,以DICOM图像处理和图像存储为主,同时具备简单的图文报告功能——简单点说是开发一个PACS客户端,有兴趣的朋友可以发邮件到[email protected]。
其实你的问题比较简单:
如果B超具备DICOM存储服务,你的程序也具备DICOM方面的能力,直接往B超通过网络发送图片;
如果不具备DICOM接口,则B超要具有VIDEO IN视频接口——中高端的B超都具备VIDEO IN 接口的,一些便携式的可能没有,现在市场上很多的显示卡/电视卡/视频采集卡都具备TV-OUT功能,只要你的程序能往TV-OUT接口发送视频信号,那么接条视频线,B超上自然能看到你的电脑的东西啦。PS:但我不知道这个功能有什么实际意义?我感觉只相当于把B超上的显示器当作电脑的显示器——难道用设备来看VCD哈?