在图像上选出一个圆形区域后,如何将区域外的图像清除,以便对区域内图像进行操作?(100分)

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

nightnoise

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,我处理的图像是菌落图像,想对区域内菌株进行计数
目前我在图像上画选择区域的方法如下
procedure TMDIChild.DrawShape(TopLeft, BottomRight: TPoint; AMode: TPenMode);
begin
//rectangle, ellipse selection
with Image1.Canvas do begin

Pen.Mode := AMode;
Pen.Style := psDot;
Image1.Canvas.Brush.Style := bsClear;
case DrawingTool of
dtRectangle: Image1.Canvas.Rectangle(TopLeft.X, TopLeft.Y, BottomRight.X, BottomRight.Y);
dtEllipse: Image1.Canvas.Ellipse(TopLeft.X, TopLeft.Y, BottomRight.X, BottomRight.Y);
end;
end;
在DrawingTool := dtRectangle;的时候我可以很容易确定选择图像区域的边界,进行计数
但是DrawingTool := dtEllipse的时候该怎样确定边界呢?
我的初步设想是将Ellipse以外区域的象素值清空,或赋某一特定值,然后再对Ellipse内的菌株
计数,这样能减少数据计算量,但具体要实行还是不会,所以请大家指教.
(对象素赋值最好用Windows API或Pixel的方法,我对Scanline不熟悉,非常感谢)
 
自动搜索整个图象区域,计算坐标在圆外的替换为白色
 
procedure TMDIChild.DrawShape(TopLeft, BottomRight: TPoint; AMode: TPenMode);
begin
//rectangle, ellipse selection
with Image1.Canvas do begin

Pen.Mode := AMode;
Pen.Style := psDot;
Image1.Canvas.Brush.Style := bsClear;
case DrawingTool of
dtRectangle: Image1.Canvas.Rectangle(TopLeft.X, TopLeft.Y, BottomRight.X, BottomRight.Y);
dtEllipse:
begin
Image1.Canvas.Ellipse(TopLeft.X, TopLeft.Y, BottomRight.X, BottomRight.Y);
Image1.Canvas.FloodFill(TopLeft.X, TopLeft.Y, Image1.Canvas.Pen.Color, fsSurface)
end
end;
end;
 
不知你的菌株计数是如何编写的?望能提供原码!(我的Email :kh5418@163.net)
下面是我的圆形区域裁减,望能对你有所帮助。

var
Bmp :TBitmap;
FRgn :HRGN;
begin
Bmp :=TBitmap.Create;
Bmp.PixelFormat :=Image1.Picture.Bitmap.PixelFormat;
Bmp.Width :=280; // 圆的直径
Bmp.Height :=280; // 圆的直径

BitBlt(Bmp.Canvas.Handle,0,0,Bmp.Width,Bmp.Height,Image1.Canvas.Handle,8,
8,SRCCOPY);
image1.Picture :=nil;
FRgn :=CreateEllipticRgn(0,0,280,280);
SelectClipRgn(Image1.Canvas.Handle,FRgn);
Image1.Canvas.Draw(0,0,Bmp);
Bmp.Free;
DeleteObject(FRgn);
 
谢谢各位的帮助,我通过利用椭圆方程判别,已经解决问题,但是大家都帮忙了,分还是要给的
 
多人接受答案了。
 
后退
顶部