⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imageprocessmainunit.pas

📁 数字图像预出处理系统
💻 PAS
📖 第 1 页 / 共 5 页
字号:
//Desiger: Jiang Xiangang    2007.8
unit ImageProcessMainUnit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, ComCtrls, ExtDlgs, JPEG, Buttons, Clipbrd, Menus,math,
  ImgList, ToolWin;
type
  TImageProcessForm = class(TForm)
    ScrollBox1: TScrollBox;
    PaintBox1: TPaintBox;
    SavePictureDialog1: TSavePictureDialog;
    MainMenu1: TMainMenu;
    FileItems: TMenuItem;
    ImageProcess: TMenuItem;
    Gray1: TMenuItem;
    ScrollBox2: TScrollBox;
    PaintBox2: TPaintBox;
    TwoValue: TMenuItem;
    OpenImage: TMenuItem;
    Exit: TMenuItem;
    SaveAs: TMenuItem;
    Label1: TLabel;
    Label2: TLabel;

    LoadPrimitiveImage: TMenuItem;
    Filter: TMenuItem;
    Erode: TMenuItem;
    Help: TMenuItem;
    Dilate: TMenuItem;
    InvertImage: TMenuItem;
    Sobel: TMenuItem;
    Prewitt: TMenuItem;
    ToolBar2: TToolBar;
    OpenFileToolButton: TToolButton;
    SaveFileToolButton: TToolButton;
    ReLoadToolButton: TToolButton;
    ToolButton7: TToolButton;
    ToolButton8: TToolButton;
    ExchangeToolButton: TToolButton;
    ImageList1: TImageList;
    TwoValueTrackBar: TTrackBar;
    ToolButton1: TToolButton;
    Label3: TLabel;
    TwoValueLabel: TLabel;
    Laplace: TMenuItem;
    Canny: TMenuItem;
    Marr: TMenuItem;
    GaussFilter: TMenuItem;
    GuassLaplace: TMenuItem;
    Robert: TMenuItem;
    Kirsh: TMenuItem;
    About: TMenuItem;
    B1: TMenuItem;
    GaborFilter: TMenuItem;
    ProgressBar1: TProgressBar;
    V1: TMenuItem;
    N8Gabor1: TMenuItem;
    EightAnisotropic: TMenuItem;
    FourAnisotropic: TMenuItem;
    ShowAnsiParameter: TMenuItem;
    GrayErode: TMenuItem;
    GrayDilate: TMenuItem;
    Normalize: TMenuItem;   procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
    procedure BtExitClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure BtsaveClick(Sender: TObject);
    procedure InitialImages(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure LaplaceFilter(Sender: TObject);
    procedure Gray1Click(Sender: TObject);
    procedure TwoValueClick(Sender: TObject);
    procedure OpenImageClick(Sender: TObject);
    procedure ExitClick(Sender: TObject);
    procedure SaveAsClick(Sender: TObject);
    procedure PaintBox2Paint(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure TwoValueTrackBarChange(Sender: TObject);
    procedure LoadPrimitiveImageClick(Sender: TObject);
    procedure FilterClick(Sender: TObject);
   procedure  SelectionSort(var a: array of integer);
   
    procedure DilateClick(Sender: TObject);
    procedure ErodeClick(Sender: TObject);
    procedure InvertImageClick(Sender: TObject);
    procedure SobelClick(Sender: TObject);
    procedure PrewittClick(Sender: TObject);
    procedure ExchangeToolButtonClick(Sender: TObject);
    procedure MarrClick(Sender: TObject);
    procedure CannyClick(Sender: TObject);
    procedure GaussFilterClick(Sender: TObject);
    procedure GuassLaplaceClick(Sender: TObject);
    procedure RobertClick(Sender: TObject);
    procedure KirshClick(Sender: TObject);
    procedure HelpClick(Sender: TObject);
    procedure ToolButton8Click(Sender: TObject);
    procedure AboutClick(Sender: TObject);
    procedure GaborFilterClick(Sender: TObject);
    procedure N8Gabor1Click(Sender: TObject);
  //  procedure A1Click(Sender: TObject);
    procedure FourAnisotropicClick(Sender: TObject);
    procedure EightAnisotropicClick(Sender: TObject);
    procedure GrayErodeClick(Sender: TObject);
    procedure GrayDilateClick(Sender: TObject);
    procedure NormalizeClick(Sender: TObject);
 private
    procedure Dimensionpaintbox;
    procedure showPrimitiveBmp;
    procedure ShowOriginalBmp;
    procedure ShowChangedBmp;
end;

var
  ImageProcessForm: TImageProcessForm;
  WillbeChangedBmp : Tbitmap;    // Bitmap read by other unit
  CurrentDir : string;    //现在的目录
  RvalueArray, GvalueArray, BvalueArray: array[0..8] of Integer;
implementation

{$R *.DFM}

uses  ImageFileSelect, about, GaborShow, Unit1, ParameterSet;
type
  TRGBArray = ARRAY[0..0] OF TRGBTriple;   // bitmap element (API windows)
  pRGBArray = ^TRGBArray;     // type pointer to 3 bytes array

Var
  ChangedBmp : Tbitmap;   // Bitmap read. Used to restore original image
  ProcessedBmp : Tbitmap;   // 处理后图像
  TestBMP : Tbitmap;   // 处理过程中位图
  PromitiveBmp : Tbitmap;   //

  Startdir : string;   // 开始目录
  curfichier : string; // 现在的文件名
  SaveToDir: string;  // 保存目录

//---------------------------------------------------------------------------

procedure TImageProcessForm.FormCreate(Sender: TObject);
begin
  savetodir := '';
  WillbeChangedBmp := tbitmap.create; WillbeChangedBmp.width  := 0;  WillbeChangedBmp.height := 0;
  ChangedBmp := tbitmap.create; ChangedBmp.width  := 0;  ChangedBmp.height := 0;
  ProcessedBmp := Tbitmap.create; ProcessedBmp.width  := 0;  ProcessedBmp.height := 0;
  TestBMP := tbitmap.create; TestBMP.width  := 0;  TestBMP.height := 0;
  PromitiveBmp := tbitmap.create; PromitiveBmp.width  := 0;  PromitiveBmp.height := 0;
  CurrentDir   := getcurrentdir;
  startdir := getcurrentdir;
end;

procedure TImageProcessForm.FormActivate(Sender: TObject);
begin
// OpenImageClick(sender);
end;

procedure TImageProcessForm.FormDestroy(Sender: TObject);
begin
 // WillbeChangedBmp.free;
  ChangedBmp.free;
  ProcessedBmp.free;
  TestBMP.free;
  PromitiveBmp.free;

end;

procedure TImageProcessForm.BtExitClick(Sender: TObject);
begin
  close;
end;

procedure TImageProcessForm.PaintBox1Paint(Sender: TObject);
begin
  ShowOriginalBmp;
end;

procedure TImageProcessForm.FormResize(Sender: TObject);
begin
  if ProcessedBmp <> nil then
  begin
    dimensionpaintbox;
    paintbox1.invalidate;
  end;
end;

procedure TImageProcessForm.DimensionPaintbox;
begin
  Paintbox1.width  := WillbeChangedBmp.width;
  Paintbox1.height := WillbeChangedBmp.height;
end;



procedure TImageProcessForm.ShowPrimitiveBmp;
begin
  with paintbox1.canvas do
  begin
    copymode := srccopy;
    draw(0,0,PromitiveBmp)
  end;
end;

procedure TImageProcessForm.ShowOriginalBmp;
begin
  with paintbox1.canvas do
  begin
    copymode := srccopy;
    draw(0,0,WillbeChangedBmp)
  end;
end;
procedure TImageProcessForm.ShowChangedBmp;
begin
with paintbox2.canvas do
  begin
    copymode := srccopy;
    draw(0,0,ChangedBmp)
  end;
end;
procedure TImageProcessForm.InitialImages(Sender: TObject);
begin
  ChangedBmp.width := WillbeChangedBmp.width;
  ChangedBmp.height := WillbeChangedBmp.height;
  ChangedBmp.pixelformat := pf24bit; 
  ProcessedBmp.width  := WillbeChangedBmp.width;
  ProcessedBmp.height := WillbeChangedBmp.height;
  ProcessedBmp.pixelformat := pf24bit;
  TestBMP.width := WillbeChangedBmp.width;
  TestBMP.height := WillbeChangedBmp.height;
  TestBMP.pixelformat := pf24bit;
  PromitiveBmp.width  := WillbeChangedBmp.width;
  PromitiveBmp.height := WillbeChangedBmp.height;
  PromitiveBmp.pixelformat := pf24bit;
  Paintbox1.width  := WillbeChangedBmp.width;
  Paintbox1.height := WillbeChangedBmp.height;
  Paintbox2.width  := WillbeChangedBmp.width;
  Paintbox2.height := WillbeChangedBmp.height;
  ChangedBmp.Assign(WillbeChangedBmp);
  ProcessedBmp.Assign(WillbeChangedBmp);
  TestBMP.Assign(WillbeChangedBmp);
  PromitiveBmp.Assign(WillbeChangedBmp);
end;


//---------------------  Gestion des boutons ----------------------
procedure TImageProcessForm.BtsaveClick(Sender: TObject);
var
  JP  : TJPEGImage;
  ctrfich : integer;
  i : integer;
  ext : string;
begin
  { 文件 ProcessedBmp 的格式 .JPEG 或 .Bmp 或u .GIF}
  if savepicturedialog1.execute then
  begin
    ext :=uppercase(extractfileext(savepictureDialog1.FileName));
    if Not ((ext = '.BMP') or (ext = '.JPG')) then
    begin
     showmessage('错误的文件扩展名 '+curfichier+' (.jpg .bmp)');
    // exit;
    end;

    for i := 1 to 32 do application.processmessages;
    if ext = '.BMP' then
    begin
      ProcessedBmp.savetofile(savepictureDialog1.FileName);
    end
    else
    if ext = '.JPG' then
    begin
      JP := TJPEGImage.Create;             // 创造TJPEGImage 临时文件
      try
        JP.CompressionQuality := 88;  // 压缩比
        JP.ProgressiveEncoding := false;
        JP.Assign(ProcessedBmp);                    // 变 JPEG 为bitmap
        JP.SaveToFile(savepictureDialog1.FileName);  // 保存文件
      finally
        JP.Free;                            // 释放 JPEG
      end;
    end;
    sleep(400); //时间等待
    curfichier :=  savepictureDialog1.filename;
    ctrfich :=  ImageSelectForm.filelistbox1.itemindex;
    ImageSelectForm.filelistbox1.update;
    ImageSelectForm.filelistbox1.itemindex := ctrfich;
  end;
end;


procedure TImageProcessForm.Gray1Click(Sender: TObject);
var
    p: pbyteArray;
    Gray,x, y: Integer;
begin
   TestBMP.Assign(WillbeChangedBmp); // WillbeChangedBmp赋予彩色图像
      for y := 0 to TestBMP.Height - 1 do
    begin
        //获取每一行象素信息
        p := TestBMP.scanline[y];
        for x := 0 to TestBMP.Width - 1 do
        begin
        //这里采用YUV与RGB颜色空间变换的方法,即 Y=0.3R+0.59G+0.11B
            Gray := Round(p[3 * x + 2] * 0.3 + p[3 * x + 1] * 0.59
                    + p[3 * x] * 0.11);
            //由于是24位真彩色,故一个像素点为三个字节
            p[3 * x + 2] := byte(Gray);
            p[3 * x + 1] := byte(Gray);
            p[3 * x] := byte(Gray);
         //Gray的值必须在0~255之间
        end;
    end;
  ChangedBmp.Assign(TestBMP);
  ShowChangedBmp;
end;

procedure TImageProcessForm.TwoValueClick(Sender: TObject);
var
    p: PByteArray;
    Gray, x, y: Integer;
begin
     TestBMP.Assign(WillbeChangedBmp);// WillbeChangedBmp赋予彩色图像
       for y := 0 to TestBMP.Height - 1 do
    begin
        p := TestBMP.scanline[y];
        for x := 0 to TestBMP.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 >TwoValueTrackBar.position then //按阀值进行二值化
            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;
    ChangedBmp.Assign(TestBMP);
    ShowChangedBmp;
end;

procedure TImageProcessForm.OpenImageClick(Sender: TObject);
begin
scrollbox1.horzscrollbar.position := 0;
  scrollbox1.vertscrollbar.position := 0;
  IF ImageSelectForm.showmodal = mrok then

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -