我写一下大概的思路:
首先定义如下的数组,用于存储图像的灰度值 :
type
imgbuf=array[0..255,0..255]of byte;
for i:=0 to Imgwidth-1 do
for j:=0 to Imglenth-1 do
begin
imgbuf1[i][j]:=GetBValue(bitmap1.Canvas.pixels[i,j]);
imgbuf2[i][j]:=GetBValue(bitmap2.Canvas.pixels[i,j]);
end;
这个不用解释了吧,bitmap就是你的两张图片,imgwidth,imglenth是图像的长宽;bitmap1,bitmap2是两幅要处理
的图像。
然后计算两幅图像的差
for i:=0 to Imgwidth-1 do
for j:=0 to Imglenth-1 do
imgbuf3[i][j]:=abs(imgbuf2[i][j] - imgbuf1[i][j]);
for i:=0 to Imgwidth-1 do
for j:=0 to Imglenth-1 do
bitmap.Canvas.pixels[i,j]:=RGB(imgbuf3[i][j],imgbuf3[i][j],imgbuf3[i,j]);
image1.Picture.Graphic:=Bitmap;
for i:=0 to Imgwidth-1 do
for j:=0 to Imglenth-1 do
begin
if imgbuf3[i][j] < 50 then imgbuf4[i][j] := 0 else imgbuf4[i][j] := 255;
end;
这个时候的图像大体成型了,背景黑色,但是有些白色噪声(因为两次拍照的背景不可能完全一样),人像的区域为白色,但是有很多黑色噪声。接下来要做的就是腐蚀膨胀运算,用于去除噪声。
太晚了,写不下去了,你可以参考
http://www.yesky.com/SoftChannel/72342371928702976/20030731/1718121.shtml
是C++的,你改写成Delphi的就可以了。
腐蚀可以消除图像中小的噪声区域,膨胀可以填补物体中的空洞。对一个图像先进行腐蚀运算然后再膨胀的操作过程称为开运算,它可以消除细小的物体、在纤细点处分离物体、平滑较大物体的边界时不明显的改变其面积。如果对一个图像先膨胀然后再收缩,我们称之为闭运算,它具有填充物体内细小的空洞、连接邻近物体、在不明显改变物体面积的情况下平滑其边界的作用。通常情况下,当有噪声的图像用阈值二值化后,所得到的边界是很不平滑的,物体区域具有一些错判的孔洞,背景区域散布着一些小的噪声物体,连续的开和闭运算可以显著的改善这种情况,这时候需要在连接几次腐蚀迭代之后,再加上相同次数的膨胀,才可以产生所期望的效果。