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

📄 liverrec.pas

📁 数字图像预出处理系统
💻 PAS
字号:
unit LiverRec;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,datamodule,
  Dialogs, ExtCtrls,CHILDWIN, StdCtrls, ComCtrls, ToolWin, Menus, ImgList,
  Clipbrd,GrayCurrenceMatrix;
var
  pattern:array [0..2] of LiverPattern;
  F:double=0.0;
type
  TLiverRecForm = class(TForm)
    LiverPartImage: TImage;
    Panel1: TPanel;
    GroupBox1: TGroupBox;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    ToolBar1: TToolBar;
    OpenToolButton: TToolButton;
    RadioGroup1: TRadioGroup;
    HealthLiverRadioButton: TRadioButton;
    FattyLiverRadioButton: TRadioButton;
    CirrhosisRadioButton: TRadioButton;
    R1: TMenuItem;
    H1: TMenuItem;
    SaveAllToolButton: TToolButton;
    ImageList1: TImageList;
    SaveNowToolButton: TToolButton;
    GroupBox2: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    EnergyEdit: TEdit;
    EntropyEdit: TEdit;
    CorrelationEdit: TEdit;
    RecognizeToolButton: TToolButton;
    GroupBox3: TGroupBox;
    ComputeButton: TButton;
    GroupBox4: TGroupBox;
    Label4: TLabel;
    LiverKindEdit: TEdit;
    Label5: TLabel;
    LiverKindIDEdit: TEdit;
    SaveCurrentlyPatternButton: TButton;
    SaveAllPatternButton: TButton;
    PatternOrderButton: TButton;
    GroupBox5: TGroupBox;
    Label6: TLabel;
    RecLiverKindEdit: TEdit;
    SaveDialog1: TSaveDialog;
    SdudyToolButton: TToolButton;
    PopupMenu1: TPopupMenu;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    R2: TMenuItem;
    S1: TMenuItem;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    OpenDialog1: TOpenDialog;
    TempPartImage: TImage;
    InertiaQuadratureEdit: TEdit;
    LocalCalmEdit: TEdit;
    Label8: TLabel;
    Label9: TLabel;
    MouseUpTimer: TTimer;
    TimeEdit: TEdit;
    Label7: TLabel;
    Button1: TButton;
    procedure FormShow(Sender: TObject);
    procedure RecognizeToolButtonClick(Sender: TObject);
    procedure MouseUpTimerTimer(Sender: TObject);
    procedure ComputeButtonClick(Sender: TObject);
    procedure LiverKindEditChange(Sender: TObject);
    procedure SaveAllPatternButtonClick(Sender: TObject);
    procedure SaveCurrentlyPatternButtonClick(Sender: TObject);
    procedure SaveNowToolButtonClick(Sender: TObject);
    procedure SaveAllToolButtonClick(Sender: TObject);
    procedure SdudyToolButtonClick(Sender: TObject);
    procedure PatternOrderButtonClick(Sender: TObject);
    //procedure GetLiverPartImage();
    procedure R2Click(Sender: TObject);
    procedure S1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
    function Get_Most_LRTB: TRect;
    procedure GetLiverPartImage();
  end;

var
  LiverRecForm: TLiverRecForm;
  RecognizeStudyvariable:Boolean;
  ImageArray:array of array of byte;
  pathstring:string;

implementation

{$R *.dfm}
uses QReport;

procedure TLiverRecForm.FormShow(Sender: TObject);
begin
  //Self.TempPartImage.Picture.LoadFromFile('./ade.bmp');
  //GetLiverPartImage();
  //Self.LiverPartImage.Picture.LoadFromFile('./ade1.bmp');
 // GrayCurrenceMatrix.OpenPatternFile();
 // GrayCurrenceMatrix.ClusterCenterCompare();
end;

procedure TLiverRecForm.RecognizeToolButtonClick(Sender: TObject);
begin
  RecognizeStudyvariable:=true;
  SdudyToolButton.Down:=false;
end;

procedure TLiverRecForm.MouseUpTimerTimer(Sender: TObject);
//var
//Bitmap: TBitmap;
begin
{  if mark5=true then
   begin
    if Clipboard.HasFormat(CF_BITMAP) then
      begin
        Bitmap := TBitmap.Create;
      try
        Bitmap.Assign(Clipboard);
        TempPartImage.Canvas.Draw(0, 0, Bitmap);
      finally
        Bitmap.Free;
     end;
  end;
  //Self.TempPartImage.Picture.LoadFromFile('./ade.bmp');
  //TempPartImage.Picture.LoadFromClipboardFormat(CF_BITMAP,ClipBoard.GetAsHandle(CF_BITMAP),0);
  GetLiverPartImage();
  Self.LiverPartImage.Picture.LoadFromFile('./ade1.bmp');
   end; }
end;

procedure TLiverRecForm.ComputeButtonClick(Sender: TObject);
var
Feature_Energy,Feature_Entropy,Feature_Correlation:double;
Feature_InertiaQuadrature,Feature_LocalCalm:double;
arLocalImage:TMyImage;//array [0..FilterWindowsWidth-1,0..FilterWindowsWidth-1] of byte;//vc离定义的是char
RollTimeH,RollTimeW:integer;
i,j,p,q:integer;
ts,te:Cardinal;
a1,a2,a3,a4,a5:double;
//ImageArray:array  of array  of byte;
//a:array [0..3] of TMatrix;
begin
  setlength(arLocalImage,FilterWindowsWidth,FilterWindowsWidth);
  setlength(ImageArray,LiverPartImage.Height,LiverPartImage.Width);
  a1:=0.46; a2:=0.46;a3:=0.08;//a4:=;a5:=;
  FeatureEnergy:=0.0;  FeatureEntropy:=0.0;  FeatureCorrelation:=0.0;
  resultInertiaQuadrature:=0.0;FeatureLocalCalm:=0.0;
  Feature_Energy:=0.0;  Feature_Entropy:=0.0;  Feature_Correlation:=0.0;
  Feature_LocalCalm:=0.0;Feature_InertiaQuadrature:=0.0;
  ts:=gettickcount;
  RollTimeH:=LiverPartImage.Height div FilterWindowsWidth;//FilterWindowsWidth应该是属于类的
  RollTimeW:=LiverPartImage.Width div FilterWindowsWidth;
  for i:=0 to LiverPartImage.Height-1 do
    for j:=0 to LiverPartImage.Width-1 do
      ImageArray[i][j]:= LiverPartImage.Canvas.Pixels[i,j];
  for i:=0 to RollTimeH-1 do
    for j:=0 to RollTimeW-1 do
    begin
      for p:=0 to FilterWindowsWidth-1 do
        for q:=0 to FilterWindowsWidth-1 do
          arLocalImage[p][q]:= ImageArray[i*FilterWindowsWidth+p][j*FilterWindowsWidth+q];
      GrayCurrenceMatrix.ComputeCorrelationMatrix(arLocalImage,FilterWindowsWidth);
      CurrenceMatrixH:=resultH;
      CurrenceMatrixV:=resultV;
      CurrenceMatrixRD:=resultRD;
      CurrenceMatrixLD:=resultLD;
      //0度共现矩阵
      GrayCurrenceMatrix.ComputeTextureFeature(Feature_Energy,Feature_Entropy,
      Feature_Correlation,Feature_InertiaQuadrature,Feature_LocalCalm,CurrenceMatrixH,GrayLayerNum);
      //90度共现矩阵
      //GrayCurrenceMatrix.ComputeTextureFeature(Feature_Energy,Feature_Entropy,
     // Feature_Correlation,Feature_InertiaQuadrature,Feature_LocalCalm,CurrenceMatrixV,GrayLayerNum);
      //45度共现矩阵
      //GrayCurrenceMatrix.ComputeTextureFeature(Feature_Energy,Feature_Entropy,
      //Feature_Correlation,Feature_InertiaQuadrature,Feature_LocalCalm,CurrenceMatrixRD,GrayLayerNum);
      //135度共现矩阵
      //GrayCurrenceMatrix.ComputeTextureFeature(Feature_Energy,Feature_Entropy,
      //Feature_Correlation,Feature_InertiaQuadrature,Feature_LocalCalm,CurrenceMatrixLD,GrayLayerNum);
      Feature_Energy:=resultEnergy;
      Feature_Entropy:=resultEntropy;
      Feature_Correlation:=resultCorrelation;
      Feature_InertiaQuadrature:=resultInertiaQuadrature;
      Feature_LocalCalm:=resultLocalCalm;
      FeatureEnergy:=Feature_Energy+FeatureEnergy;
      FeatureEntropy:=Feature_Entropy+FeatureEntropy;
      FeatureCorrelation:=Feature_Correlation+FeatureCorrelation;
      FeatureInertiaQuadrature:=Feature_InertiaQuadrature+FeatureInertiaQuadrature;
      FeatureLocalCalm:=Feature_LocalCalm+FeatureLocalCalm;
    end;
  FeatureEnergy:=FeatureEnergy /(RollTimeH*RollTimeW);
  FeatureEnergy:=strtofloat(format('%.5f',[FeatureEnergy]));
  FeatureEntropy:=FeatureEntropy/(RollTimeH*RollTimeW);
  FeatureEntropy:=strtofloat(format('%.5f',[FeatureEntropy]));
  FeatureCorrelation:=FeatureCorrelation/(RollTimeH*RollTimeW);
  FeatureCorrelation:=strtofloat(format('%.5f',[FeatureCorrelation]));
  FeatureInertiaQuadrature:=FeatureInertiaQuadrature/(RollTimeH*RollTimeW);
  FeatureInertiaQuadrature:=strtofloat(format('%.5f',[FeatureInertiaQuadrature]));
  FeatureLocalCalm:=FeatureLocalCalm/(RollTimeH*RollTimeW);
  FeatureLocalCalm:=strtofloat(format('%.5f',[FeatureLocalCalm]));
  te:=gettickcount;
  TimeEdit.Text:=floattostr((te-ts)*55/1000)+'s';
  setlength(ImageArray,0,0);
  setlength(arLocalImage,0,0);
  EnergyEdit.Text:=floattostr(FeatureEnergy);
  EntropyEdit.Text:=floattostr(FeatureEntropy);
  CorrelationEdit.Text:=floattostr(FeatureCorrelation);
  InertiaQuadratureEdit.Text:=floattostr(FeatureInertiaQuadrature);
  LocalCalmEdit.Text:=floattostr(FeatureLocalCalm);
  if RecognizeStudyvariable= false then
  begin
    LiverKindIDEdit.Text:=inttostr(strtoint(LiverKindIDEdit.Text)+1);
  //if LiverKindEdit.Text=''  then
  //  showmessage('请填写肝脏类别');
  //if LiverKindEdit.Text<>''  then
  //begin
    pattern[strtoint(LiverKindEdit.Text)].FeatrueValue[strtoint(LiverKindIDEdit.Text)][0]:=FeatureEnergy;
    pattern[strtoint(LiverKindEdit.Text)].FeatrueValue[strtoint(LiverKindIDEdit.Text)][1]:=FeatureEntropy;
    pattern[strtoint(LiverKindEdit.Text)].FeatrueValue[strtoint(LiverKindIDEdit.Text)][2]:=FeatureCorrelation;
    pattern[strtoint(LiverKindEdit.Text)].FeatrueValue[strtoint(LiverKindIDEdit.Text)][3]:=FeatureInertiaQuadrature;
    pattern[strtoint(LiverKindEdit.Text)].FeatrueValue[strtoint(LiverKindIDEdit.Text)][4]:=FeatureLocalCalm;
  end
  else
  if RecognizeStudyvariable=true then
  begin
  GrayCurrenceMatrix.FeatureCompare();
  end;
end;

procedure TLiverRecForm.LiverKindEditChange(Sender: TObject);
begin
   LiverKindIDEdit.Text:='0';
   //LiverKindIDEdit.Text:=inttostr(strtoint(LiverKindIDEdit.Text)+1);
end;

procedure TLiverRecForm.SaveAllPatternButtonClick(Sender: TObject);
var //记录每类肝脏的各个模板
 n,i,j,k,LiverType:integer;
 SepChar:String;
 PatternFile:TextFile;
 pathstring:string;
begin
     PathString:=ExtractFilePath(Application.ExeName)+'Feature\Pattern.txt';
     Assignfile(PatternFile,PathString);
     ReWrite(PatternFile);//写模板文件
      SepChar:=' ';
        for LiverType := 0 to 2 do //记录肝脏‘0’到‘2’的各模板数据
          if Pattern[LiverType].Num=0 then
            begin
         Writeln(PatternFile,IntToStr(LiverType));//记录肝脏类别
         Writeln(PatternFile,IntToStr(0));//记录该肝脏类别模板的个数
            end
                   else
             if Pattern[LiverType].Num<>0 then
              begin
         Writeln(PatternFile,IntToStr(LiverType));//记录肝脏类别
         Writeln(PatternFile,IntToStr(pattern[LiverType].Num));//记录该肝脏类别模板的个数
    for k:=1 to  Pattern[LiverType].Num do
      begin //记录每个模板的具体特征值
     Writeln(PatternFile,FloatToStr(pattern[LiverType].FeatrueValue[k][0]),
         SepChar,FloatToStr(Pattern[LiverType].FeatrueValue[k][1]),SepChar,
         FloatToStr(Pattern[LiverType].FeatrueValue[k][2]),SepChar
         ,FloatToStr(Pattern[LiverType].FeatrueValue[k][3]),SepChar
         ,FloatToStr(Pattern[LiverType].FeatrueValue[k][4]),SepChar);
     end;
 end;
  CloseFile(PatternFile);//关闭模板文件
end;
procedure TLiverRecForm.SaveCurrentlyPatternButtonClick(Sender: TObject);
var
i:integer;
begin
  for i:= 0 to 2 do
    if strtoint(LiverKindEdit.Text)= i then
       begin
       pattern[i].num:=strtoint(LiverKindIDEdit.Text);
       pattern[i].FeatrueValue[strtoint(LiverKindIDEdit.Text)][0]:=strtofloat(EnergyEdit.Text);
       pattern[i].FeatrueValue[strtoint(LiverKindIDEdit.Text)][1]:=strtofloat(EntropyEdit.Text);
       pattern[i].FeatrueValue[strtoint(LiverKindIDEdit.Text)][2]:=strtofloat(CorrelationEdit.Text);
       pattern[i].FeatrueValue[strtoint(LiverKindIDEdit.Text)][3]:=strtofloat(InertiaQuadratureEdit.Text);
       pattern[i].FeatrueValue[strtoint(LiverKindIDEdit.Text)][4]:=strtofloat(LocalCalmEdit.Text);
       end;
end;

procedure TLiverRecForm.SaveNowToolButtonClick(Sender: TObject);
begin
  SaveCurrentlyPatternButton.Click;
end;

procedure TLiverRecForm.SaveAllToolButtonClick(Sender: TObject);
begin
  SaveAllPatternButton.Click;
end;

procedure TLiverRecForm.SdudyToolButtonClick(Sender: TObject);
begin
   RecognizeToolButton.Down:=false;
   RecognizeStudyvariable:= false;
   RecLiverKindEdit.Text:='0';
end;

procedure TLiverRecForm.PatternOrderButtonClick(Sender: TObject);
begin
  LiverKindIDEdit.Text:=inttostr(pattern[strtoint(LiverKindEdit.Text)].num);
end;


function TLiverRecForm.Get_Most_LRTB: TRect;
var //得到图片上的最左、最右、最上、最下的点
    i, j:  integer;
    rect_s, rect_d: TRect;
    SaveImage: Tbitmap;
    label FindMostRight, FindMostTop,FindMostBottom, FindInMiddle;
begin
//FindMostLeft:  获得最左边的点
    for i := 1 to TempPartImage.Width - 1 do
        for j := 1 to TempPartImage.Height - 1 do
            if TempPartImage.Canvas.Pixels[i, j] <> clWhite then
            begin
                Result.Left := i;
        goto        FindMostRight;
            end;
FindMostRight:  //获得最右边的点
    for i := TempPartImage.Width - 1 downto 1 do
        for j := 1 to TempPartImage.Height - 1 do
            if TempPartImage.Canvas.Pixels[i, j] <> clWhite then
            begin
          Result.Right := i;goto FindMostTop;
            end;
FindMostTop:   // 获得最上面的点
    for j := 1 to TempPartImage.Height - 1 do
        for i := 1 to TempPartImage.Width - 1 do
            if TempPartImage.Canvas.Pixels[i, j] <> clWhite then
            begin
         Result.Top := j;goto FindMostBottom;
            end;
FindMostBottom: //获得最下面的点
    for j := TempPartImage.Height - 1 downto 1 do
        for i := 1 to TempPartImage.Width - 1 do
            if TempPartImage.Canvas.Pixels[i, j] <> clWhite then
            begin
         Result.Bottom := j; goto FindInMiddle;
            end;
FindInMiddle:
    i := Result.Right - Result.Left;//得到区域宽度
    j := Result.Bottom - Result.Top;//得到区域高度
    i := i mod 16;  i := i div 8;
    if i > 0 then  //将边缘对称于矩形的左右部分
    begin
        Dec(Result.Left, i); Inc(Result.Right, i);
    end;
    j := j mod 16; j := j div 8;
    if j > 0 then //将边缘对称于矩形的上下部分
    begin
        Dec(Result.Top, i);Inc(Result.Bottom, j);
    end;
end;
procedure TLiverRecForm.GetLiverPartImage();
var
rect_s, rect_d: TRect;
SaveImage:    Tbitmap;
begin
  SaveImage := Tbitmap.Create;
    //  取得数字图片的位置 rest_d;
  Rect_s := Get_Most_LRTB;
  Rect_d.Top  := 0;
  Rect_d.Left := 0;
  Rect_d.Right := rect_s.Right - rect_s.Left;
  Rect_d.Bottom:= rect_s.Bottom - rect_s.Top;
  SaveImage.Width := rect_d.Right;
  SaveImage.Height:= rect_d.Bottom;
  SaveImage.Canvas.CopyRect(rect_d, TempPartImage.Canvas, rect_s);
 // Clipboard.Assign(SaveImage.Picture);
  SaveImage.SaveToFile('./ade1.bmp');
end;

procedure TLiverRecForm.R2Click(Sender: TObject);
begin
  RecognizeToolButton.Click;
//  mdichild.Edit1.Text:='0';
end;

procedure TLiverRecForm.S1Click(Sender: TObject);
begin
  SdudyToolButton.Click;
end;

procedure TLiverRecForm.FormCreate(Sender: TObject);
begin
  DoubleBuffered:=true;
end;

procedure TLiverRecForm.Button1Click(Sender: TObject);
begin
datamodule.ChoiceImageMark:=false;
end;

end.

⌨️ 快捷键说明

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