上一篇:Delphi旋转位图 - 转贴
下一篇:Delphi图像二值化 - 转贴

中值滤波 - 转帖

发布于: 2012/12/16 8:05:57   |  发布在: Delphi文章   |  点击:

验证码识别之中值滤波

unit Unit1;

interface

uses
  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.



 

验证码