图像处理?(50分)

  • 主题发起人 主题发起人 金少
  • 开始时间 开始时间

金少

Unregistered / Unconfirmed
GUEST, unregistred user!
如何实现两副Tbitmap图像像素相减, 速度要快!
谢谢!
 
先得到两幅图像各自的r,g,b值。然后将这三个数组各自相减。加上一个判断语句即可。
if O[x,y ]<0 then O[x,y]:=0 O[x,y]为相减后的值
 

procedure TForm1.Button1Click(Sender: TObject); //image1 和image2相同的大小,加载不同的两幅
//图象
var
bmp1,bmp2 :Tbitmap;
p1,p2:pbytearray;
x,y:integer;
bmpwidth,bmpheight:integer;
begin

bmp1:=Tbitmap.create;
bmp2:=Tbitmap.create;
bmp1.assign(image1.picture.bitmap);
bmp1.assign(image2.picture.bitmap);
bmpwidth:=image1.Picture.Graphic.Width;
bmpheight:=image1.Picture.Graphic.height;
bmp1.pixelformat:=pf24bit;
bmp2.pixelformat:=pf24bit;
for y:=0 to bmpheight-1 do
begin
p1:=bmp1.ScanLine[y] ;
p2:=bmp2.ScanLine[y];
for x:=0 to bmpwidth-1 do
begin
p1[3*x+2]:= abs(p1[3*x+2]- p2[3*x+2]);
p1[3*x+1]:= abs(p1[3*x+1]- p2[3*x+1]);
p1[3*x]:= abs(p1[3*x]- p2[3*x]);
end;
end;
image1.Picture.Bitmap.Assign(bmp1);
bmp1.Free;
bmp2.Free;

end;

end.
 
To huazai:
怎幺执行时出错呀!
如果将 bmp1.pixelformat := pf8bit;是不是下面将改为
p1[x]:=abs(p2[x]-p1[x]);呀
请邦助再看看!
To quickchop:
取每点的像素值太慢呀
 
接受答案了.
 
两个image的大小一样,也就是两图的大小一样,一般情况下,图不一样大小,所以首先保证
图的大小一样,否则scanline越界!如果是pf8bit,则就是你说的那样
 
我想分别前后两副分别相减, 效果一定不同, 你这样是取绝对值, 只能看到相同的效果,
所以我改如下(取pf8bit图像)
if p2[x]-p1[x]<=0 then p1[x]=0
else p1[x]:= p2[x]-p1[x];
我取相减的下限是0不知是否正确, 据效果我想应该是正确的.
不过如果是两副图像相加呢? 我只是单纯的相加
但有失帧的现象, 难道也有上限吗, 那上限又是多少呢?
 
to 金少
我已经告诉过你了,你不听,肯定不能取绝对值,上限是255。用于图像相加的情况。
 
To quickchop:
谢谢,有机会给你加分吧!
 
后退
顶部