二值化:procedure TForm1.Button2Click(Sender: TObject); var p: PByteArray; Gray, x, y: Integer; Bmp: TBitmap; begin Bmp := TBitmap.Create; Bmp.Assign(Image1.Picture.Bitmap); //设置为24位真彩色 Bmp.PixelFormat := pf24Bit; randomize; for y := 0 to Bmp.Height - 1 do begin p := Bmp.scanline[y]; for x := 0 to Bmp.Width - 1 do begin //一个象素点三个字节 Gray := Round(p[x * 3 + 2] * 0.3 + p[x * 3 + 1] * 0.59 + p[x * 3] * 0.11); if gray > 128 then //全局阀值128 begin p[x * 3] := 255; p[x * 3 + 1] := 255; p[x * 3 + 2] := 255; end else begin p[x * 3] := 0; p[x * 3 + 1] := 0; p[x * 3 + 2] := 0; end; end; end; Image2.Picture.Bitmap.Assign(Bmp); Bmp.Free;end;
中值滤波: unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;type TForm1 = class(TForm) Button1: TButton; Image1: TImage; Image2: TImage; procedure Button1Click(Sender: TObject); procedure SelectionSort(var a: array of integer); private { Private declarations } public { Public declarations } end;var Form1: TForm1; RvalueArray, GvalueArray, BvalueArray: array[0..8] of integer;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject); var bmp1, bmp2: Tbitmap; p1, p2, p3, p4: pbytearray; i, j: integer; begin //设置双缓冲 self.DoubleBuffered := true; //创建两个位图实例 bmp1 := Tbitmap.Create; bmp2 := Tbitmap.Create; //加在位图 bmp1.Assign(image1.Picture.Bitmap); //设置位图的象素格式 bmp1.PixelFormat := pf24bit; //位图的大小 bmp1.Width := image1.Picture.Graphic.Width; bmp1.Height := image1.Picture.Graphic.Height; //加载备份的位图 bmp2.Assign(image1.Picture.Bitmap); bmp2.PixelFormat := pf24bit; for j := 1 to bmp1.Height - 2 do begin //三条扫描线 p1 := bmp1.ScanLine[j]; p2 := bmp2.ScanLine[j - 1]; p3 := bmp2.ScanLine[j]; p4 := bmp2.ScanLine[j + 1]; for i := 1 to bmp1.Width - 2 do begin //对存储9个R分量的数组进行赋值 RvalueArray[0] := p2[3 * (i - 1) + 2]; RvalueArray[1] := p2[3 * i + 2]; RvalueArray[2] := p2[3 * (i + 1) + 2]; RvalueArray[3] := p3[3 * (i - 1) + 2]; RvalueArray[4] := p3[3 * i + 2]; RvalueArray[5] := p3[3 * (i + 1) + 2]; RvalueArray[6] := p4[3 * (i - 1) + 2]; RvalueArray[7] := p4[3 * i + 2]; RvalueArray[8] := p4[3 * (i + 1) + 2]; //调用排序过程 SelectionSort(RvalueArray); //获取R分量的中间值 p1[3 * i + 2] := RvalueArray[4]; //对存储9个G分量的数组进行赋值 GvalueArray[0] := p2[3 * (i - 1) + 1]; GvalueArray[1] := p2[3 * i + 1]; GvalueArray[2] := p2[3 * (i + 1) + 1]; GvalueArray[3] := p3[3 * (i - 1) + 1]; GvalueArray[4] := p3[3 * i + 1]; GvalueArray[5] := p3[3 * (i + 1) + 1]; GvalueArray[6] := p4[3 * (i - 1) + 1]; GvalueArray[7] := p4[3 * i + 1]; GvalueArray[8] := p4[3 * (i + 1) + 1]; //调用选择排序 SelectionSort(RvalueArray); //获取G分量的中间值 p1[3 * i + 1] := RvalueArray[4]; //对存储9个B分量的数组进行赋值 BvalueArray[0] := p2[3 * (i - 1)]; BvalueArray[1] := p2[3 * i]; BvalueArray[2] := p2[3 * (i + 1)]; BvalueArray[3] := p3[3 * (i - 1)]; BvalueArray[4] := p3[3 * i]; BvalueArray[5] := p3[3 * (i + 1)]; BvalueArray[6] := p4[3 * (i - 1)]; BvalueArray[7] := p4[3 * i]; BvalueArray[8] := p4[3 * (i + 1)]; //调用选择排序过程 SelectionSort(RvalueArray); //获取G分量的中间值 p1[3 * i] := RvalueArray[4]; end; end; Image2.Picture.Bitmap.Assign(Bmp1); Bmp1.Free; bmp2.Free; end; //选择排序过程procedure TForm1.SelectionSort(var a: array of integer); var i, j, t: integer; begin for i := low(a) to high(a) - 1 do for j := high(a) downto i + 1 do if a[i] > a[j] then begin //交换值(a[i], a[j], i, j); t := a[i]; a[i] := a[j]; a[j] := t; end; end;end.
汗一个,让大家BS了!其实我还是很勤快的!那大家接着BS吧
基本搞定! 如果关心请看我得博客! www.libing.net.cn
//计算多边形面积 Function TNetMap.GetPolygonArea(G:TMapPolygon):Double; Var I:Integer; Area:Double; Begin Area:=0; For I:=G.D_Start To G.D_End-1 Do Area:=Area+SData[I].X*SData[I+1].Y-SData[I+1].X*SData[I].Y; Area:=Area+SData[G.D_End].X*SData[G.D_Start].Y-SData[G.D_Start].X*SData[G.D_End].Y; Area:=Abs(Area/2); Result:=Area; End;
var
p: PByteArray;
Gray, x, y: Integer;
Bmp: TBitmap;
begin
Bmp := TBitmap.Create;
Bmp.Assign(Image1.Picture.Bitmap);
//设置为24位真彩色
Bmp.PixelFormat := pf24Bit;
randomize;
for y := 0 to Bmp.Height - 1 do
begin
p := Bmp.scanline[y];
for x := 0 to Bmp.Width - 1 do
begin
//一个象素点三个字节
Gray := Round(p[x * 3 + 2] * 0.3 + p[x * 3 + 1] * 0.59 + p[x
* 3] * 0.11);
if gray > 128 then //全局阀值128
begin
p[x * 3] := 255;
p[x * 3 + 1] := 255;
p[x * 3 + 2] := 255;
end
else
begin
p[x * 3] := 0;
p[x * 3 + 1] := 0;
p[x * 3 + 2] := 0;
end;
end;
end;
Image2.Picture.Bitmap.Assign(Bmp);
Bmp.Free;end;
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
Image2: TImage;
procedure Button1Click(Sender: TObject);
procedure SelectionSort(var a: array of integer); private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
RvalueArray, GvalueArray, BvalueArray: array[0..8] of integer;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
bmp1, bmp2: Tbitmap;
p1, p2, p3, p4: pbytearray;
i, j: integer;
begin
//设置双缓冲
self.DoubleBuffered := true;
//创建两个位图实例
bmp1 := Tbitmap.Create;
bmp2 := Tbitmap.Create;
//加在位图
bmp1.Assign(image1.Picture.Bitmap);
//设置位图的象素格式
bmp1.PixelFormat := pf24bit;
//位图的大小
bmp1.Width := image1.Picture.Graphic.Width;
bmp1.Height := image1.Picture.Graphic.Height;
//加载备份的位图
bmp2.Assign(image1.Picture.Bitmap);
bmp2.PixelFormat := pf24bit;
for j := 1 to bmp1.Height - 2 do
begin
//三条扫描线
p1 := bmp1.ScanLine[j];
p2 := bmp2.ScanLine[j - 1];
p3 := bmp2.ScanLine[j];
p4 := bmp2.ScanLine[j + 1];
for i := 1 to bmp1.Width - 2 do
begin
//对存储9个R分量的数组进行赋值
RvalueArray[0] := p2[3 * (i - 1) + 2];
RvalueArray[1] := p2[3 * i + 2];
RvalueArray[2] := p2[3 * (i + 1) + 2];
RvalueArray[3] := p3[3 * (i - 1) + 2];
RvalueArray[4] := p3[3 * i + 2];
RvalueArray[5] := p3[3 * (i + 1) + 2];
RvalueArray[6] := p4[3 * (i - 1) + 2];
RvalueArray[7] := p4[3 * i + 2];
RvalueArray[8] := p4[3 * (i + 1) + 2];
//调用排序过程
SelectionSort(RvalueArray);
//获取R分量的中间值
p1[3 * i + 2] := RvalueArray[4];
//对存储9个G分量的数组进行赋值
GvalueArray[0] := p2[3 * (i - 1) + 1];
GvalueArray[1] := p2[3 * i + 1];
GvalueArray[2] := p2[3 * (i + 1) + 1];
GvalueArray[3] := p3[3 * (i - 1) + 1];
GvalueArray[4] := p3[3 * i + 1];
GvalueArray[5] := p3[3 * (i + 1) + 1];
GvalueArray[6] := p4[3 * (i - 1) + 1];
GvalueArray[7] := p4[3 * i + 1];
GvalueArray[8] := p4[3 * (i + 1) + 1];
//调用选择排序
SelectionSort(RvalueArray);
//获取G分量的中间值
p1[3 * i + 1] := RvalueArray[4];
//对存储9个B分量的数组进行赋值
BvalueArray[0] := p2[3 * (i - 1)];
BvalueArray[1] := p2[3 * i];
BvalueArray[2] := p2[3 * (i + 1)];
BvalueArray[3] := p3[3 * (i - 1)];
BvalueArray[4] := p3[3 * i];
BvalueArray[5] := p3[3 * (i + 1)];
BvalueArray[6] := p4[3 * (i - 1)];
BvalueArray[7] := p4[3 * i];
BvalueArray[8] := p4[3 * (i + 1)];
//调用选择排序过程
SelectionSort(RvalueArray);
//获取G分量的中间值
p1[3 * i] := RvalueArray[4];
end;
end;
Image2.Picture.Bitmap.Assign(Bmp1);
Bmp1.Free;
bmp2.Free;
end;
//选择排序过程procedure TForm1.SelectionSort(var a: array of integer);
var
i, j, t: integer;
begin
for i := low(a) to high(a) - 1 do
for j := high(a) downto i + 1 do
if a[i] > a[j] then
begin
//交换值(a[i], a[j], i, j);
t := a[i];
a[i] := a[j];
a[j] := t;
end;
end;end.
如果关心请看我得博客!
www.libing.net.cn
Function TNetMap.GetPolygonArea(G:TMapPolygon):Double;
Var I:Integer;
Area:Double;
Begin
Area:=0;
For I:=G.D_Start To G.D_End-1 Do
Area:=Area+SData[I].X*SData[I+1].Y-SData[I+1].X*SData[I].Y;
Area:=Area+SData[G.D_End].X*SData[G.D_Start].Y-SData[G.D_Start].X*SData[G.D_End].Y;
Area:=Abs(Area/2);
Result:=Area;
End;