📄 liverrec.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 + -