俺是第一次来这,就有个小小的问题,谁会图像插值???(100分)

  • 主题发起人 主题发起人 踏雪留恨
  • 开始时间 开始时间

踏雪留恨

Unregistered / Unconfirmed
GUEST, unregistred user!
我有两张肝脏CT的灰度切面图,要求是根据两张图像的灰度变化,用插值算法
在两个截面之间的插入若干切面,现在只求在它们之间的中间的一个切面,各位高
手,能帮帮我吗?最好能给我代码, lxj54@msn.com,我是新来的,不知道分怎么给
别人,如果能帮我的,我的分可以给你,但你要告诉我怎么给,我不会用,还有,
要RMB也可以,开个价,要不就当练练脑,助人乃快乐之本嘛。
 
设图一的x,y点灰度是a,图二的x,y点灰度是b;图一和二距离是L,
距离图一k处切片图x,y点的灰度=Floor(a+(b-a)*k/L);//Floor是地板函数
不知道行否?
 
具体的代码呢?
 
只要做一个遍历就可以了。
for x:=0 to 图片.宽-1 do
for y:=1 to 图片.高-1 do
图一k处切片图x,y点的灰度=Floor(a+(b-a)*k/L);
我不清楚你的图片格式,无法给出具体代码。
如果图片是压缩格式,必须先转换成非压缩的。

 
谢谢你了,我的图片是32位的位图,如果能把具体的代码写给我,我感激不尽!!!!
 
你的图片应该是同样大小,设有两张图片:LBMP左边的图,RBMP右边的图;
Len两图片的距离,Dtn是欲生成的图形与左图的距离。
下面函数输出一个中间图形的Bitmap。

procedure GetMidBMP(LBMP,RBMP:TBitmap; Len,Dtn:Integer):TBitmap;
var
LPB,RPB,MPB:PByteArray;
MG,LG,RG,
x,y,
W,H,DPos:Integer;
begin
W=LBMP.Width; H:=LBMP.Height;
Result:=TBitmap.Create;
Result.PixelFormat:=pf32Bit; //pf32Bits ?,记不清了,请你试一下
Result.Width:=W; Result.Height:=H;

for y:=0 to H-1 do
begin
LPB:=LBMP.ScanLine[Y];
RPB:=RBMP.ScanLine[Y];
MPB:=Result.ScanLine[Y];
for x:=0 to W-1 do begin
DPos:=x*4;
LG:=LPB[DPos]+LPB[DPos+1]+LPB[DPos+2]; //左灰度
RG:=RPB[DPos]+RPB[DPos+1]+RPB[DPos+2]; //右灰度
MG:=Floor(LG+(RG-LG)*Dtn/Len/3); //获得中间图片灰度
MPB[DPos]:=MG;
MPB[DPos+1]:=MG;
MPB[DPos+2]:=MG;
end;
end;
大概就这样了,我没有编译过,因为是在网吧。
如果有更多的图片,就可以用更好的插值方法如三次样条插值法,参数法等。
但肝脏的轮廓(形状)应该会变化,这样的方法也许不行,
你先试一下,不行再讨论吧。
 
你想要得中间的那张图和前后两张图的关系是设么呢?
 
dcba大侠,你看DarwinZhang写的代码就知道关系是怎么样的了。
DarwinZhang,谢谢你,我试一下,看行不行。
 
DarwinZhang大侠,运行后,出错:Undeclared identifier: 'Floor',这个函数怎么定义
啊?我有四张图片,肝脏的轮廓(形状)是有些变化的,其中的肿瘤组织变化最大。
 
Floor这个函数在Math单元中,用 Use Math 就可以。
也可以用 Trunc(LG+(RG-LG)*Dtn/Len/3)函数;
如果肝脏和肿瘤的外形是连续的且和外界有明显分界线,
可以设法取得他们的轮廓,然后进行曲线拟合,再进行插值。
如果你对上面程序的效果不满意,我可帮你查一下这方面的算法。
 
那谢谢你,肝脏和肿瘤的外形是连续的且和外界有明显分界线,如果你要看清楚一点,把
地址告诉我,我可以把图片发给你,上面程序的结果的确不太好。
 
我的Email: ZXDarwin@163.net
 
如果找到更好的算法就尽快告诉我吧,我比较急,如果没有,那就算了,
谢谢你的帮忙!!!!!!!!!
 
后退
顶部