bmp图像能否进行布尔运算----图像处理问题姊妹篇(200分)

  • 主题发起人 主题发起人 NetBird
  • 开始时间 开始时间
N

NetBird

Unregistered / Unconfirmed
GUEST, unregistred user!
现有两副图像:image1和image2,能否蒋image2上的特征减去image1的特征,然后将结果
显示在另一副图像(如image3)里,怎么做?
 
当然能,要不然photoshop怎么做的图层呀。只是算法要查查专门的书。
 
用异或的办法,
看这里:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=532697
或者用我的代码:

type
TPoints = array[0..0] of TPoint;
TP = array of TPoint;
TRGBColor = record
B: Byte;
G: Byte;
R: Byte;
end;
PRGBColor = ^TRGBColor;


procedure TimageForm.btnOtherFunctionClick(Sender: TObject);
var
Bmp1,Bmp2 :TBitmap;
i,j :integer;
P1, P2 : PByteArray;
begin
// if bIsPhotoContrast =false then //若不是图像对比状态
// begin
// showMessage('现在不处于图像对比状态,不能进行图像减影');
// exit;
// end;
Bmp1 :=TBitmap.Create;
Bmp1.Assign(image2.picture.Bitmap);
Bmp2 :=TBitmap.Create;
Bmp2.Assign(image5.picture.Bitmap);

// BitBlt(Bmp2.Canvas.Handle,0,0,Bmp2.Width,Bmp2.Height,Bmp1.Canvas.Handle,0,
// 0,SRCINVERT); //用作异或操作

for J:=0 to Bmp1.Height - 1 do
begin
P1 := Bmp1.ScanLine[J];
P2 := Bmp2.ScanLine[J];
for I:=0 to Bmp1.Width - 1 do
begin
P1[3*I] := P1[3*I] Xor P2[3*I];
P1[3*I+1] := P1[3*I+1] Xor P2[3*I+1];
P1[3*I+2] := P1[3*I+2] Xor P2[3*I+2];
end;
end;
Image3.Picture.Bitmap.Assign(Bmp1);
Bmp1.Free;
Bmp2.Free;
end;

 
速度应该很慢吧!!
 
用异或可以解决。
BitBlt函数还有很多能,建议看看帮助。
您也可以用 BitBlt 在本论坛查一下,肯定收获巨大!:)
 
为什么这种关于图象异或的问题这么多?
我只是想说:最基本的图象异或是运用 BitBlt 来实现的,但是 BitBlt 是象素级操作,
建议采用扫描线算法,也就是 htw 老哥的例子 。
 
呵呵!试试我的!

procedure TintBitmapRect(const Bitmap: TBitmap; const Rect: TRect; const Color: TColor);
var
Pixel: PLongWord;
I: Integer;
J: Integer;
Color2: LongWord;
const
Mask: LongWord = $00FEFEFE;
begin
Assert(Bitmap.PixelFormat = pf32Bit);
Color2 := SwapRedBlue(Color) and Mask;
for I := Rect.Top to (Rect.Bottom - 1) do
begin
Pixel := Bitmap.ScanLine;
Inc(Pixel, Rect.Left);
for J := Rect.Left to (Rect.Right - 1) do
begin
Pixel^ := ((Pixel^ and Mask) + Color2) shr 1;
Inc(Pixel);
end;
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
with Image1.Picture do
begin
Bitmap.PixelFormat := pf32Bit;
TintBitmapRect(Bitmap, Rect(Bitmap.Width div 4, Bitmap.Height div 4,
Bitmap.Width - Bitmap.Width div 4,
Bitmap.Height - Bitmap.Height div 4), clRed);
end;
end;
 
BitBlt函数好,windows 核心就使用它来画界面
 
多人接受答案了。
 
后退
顶部