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

📄 imageprocessmainunit.~pas

📁 数字图像预出处理系统
💻 ~PAS
📖 第 1 页 / 共 5 页
字号:
     pline[3*w+2]:=round(result);
      pline[3*w+1]:=round(result);
       pline[3*w+0]:=round(result);
     result:=0;
   GaborShowForm.image6.Picture.Bitmap.Assign(TestBMP);
   GaborShowForm.Label6.Caption:='112.5度滤波图像';
   end;
 end;
    temp5:=(1/8)*6*pi;costemp:=cos(temp5);sintemp:=sin(temp5);
 for h:=0 to ProcessedBmp.height-1 do
    begin
    progressbar1.Position:=progressbar1.Position+1;
    pline:=TestBMP.ScanLine[h];
    for w:=0 to ProcessedBmp.Width-1 do
    begin
    if(w>=5) and(h>=5) and(w<=ProcessedBmp.Width-6)
     and(h<=ProcessedBmp.Height-6) then
    begin
     for i:=-5 to 5 do
     begin
     for j:=-5 to 5 do
     begin
    plus:=power(i*costemp+j*sin(temp5),2)/9+
     power(-i*sin(temp5)+j*costemp,2);
   result:=result+(exp(-0.5*plus)*cos(1.0*
   (i*costemp +j* sin(temp5) )))*II[w+1-i,h+1-j];
        end;
       end;
     end  else
     result:=getrvalue(TestBMP.Canvas.Pixels[w,h]);
     if(result>=255) then result:=255;
     if(result<0)   then  result:=0;
     pline[3*w+2]:=round(result);
      pline[3*w+1]:=round(result);
       pline[3*w+0]:=round(result);
     result:=0;
   GaborShowForm.image7.Picture.Bitmap.Assign(TestBMP);
   GaborShowForm.Label7.Caption:='135度滤波图像';
   end;
 end;
      temp5:=(1/8)*7*pi;costemp:=cos(temp5);sintemp:=sin(temp5);
 for h:=0 to ProcessedBmp.height-1 do
    begin
     progressbar1.Position:=progressbar1.Position+1;
    pline:=TestBMP.ScanLine[h];
    for w:=0 to ProcessedBmp.Width-1 do
    begin
    if(w>=5) and(h>=5) and(w<=ProcessedBmp.Width-6)
    and(h<=ProcessedBmp.Height-6) then
    begin
     for i:=-5 to 5 do
     begin
     for j:=-5 to 5 do
     begin
    plus:=power(i*costemp+j*sin(temp5),2)/9+
     power(-i*sin(temp5)+j*costemp,2);
   result:=result+(exp(-0.5*plus)*cos(1.0*
   (i*costemp +j* sintemp )))*II[w+1-i,h+1-j];
       end;
     end;
    end  else
     result:=getrvalue(TestBMP.Canvas.Pixels[w,h]);
     if(result>=255) then result:=255;
     if(result<0)   then  result:=0;
     pline[3*w+2]:=round(result);
      pline[3*w+1]:=round(result);
       pline[3*w+0]:=round(result);
     result:=0;
   GaborShowForm.image8.Picture.Bitmap.Assign(TestBMP);
   GaborShowForm.Label8.Caption:='157.5度滤波图像';
   end;
 end;
 for h:=0 to ProcessedBmp.height-1 do
    for w:=0 to ProcessedBmp.Width-1 do
    begin //取八个方向滤波结果的最大值
      progressbar1.Position:=progressbar1.Position+1;
      RvalueArray[0]:=getrvalue(ProcessedBmp.Canvas.Pixels[w,h]);
      RvalueArray[1]:=getrvalue(GaborShowForm.image1.Canvas.Pixels[w,h]);
      RvalueArray[2]:=getrvalue(GaborShowForm.image2.Canvas.Pixels[w,h]);
      RvalueArray[3]:=getrvalue(GaborShowForm.image3.Canvas.Pixels[w,h]);
      RvalueArray[4]:=getrvalue(GaborShowForm.image4.Canvas.Pixels[w,h]);
      RvalueArray[5]:=getrvalue(GaborShowForm.image5.Canvas.Pixels[w,h]);
      RvalueArray[6]:=getrvalue(GaborShowForm.image6.Canvas.Pixels[w,h]);
      RvalueArray[7]:=getrvalue(GaborShowForm.image7.Canvas.Pixels[w,h]);
      RvalueArray[8]:=getrvalue(GaborShowForm.image8.Canvas.Pixels[w,h]);
      SelectionSort(RvalueArray);
      temp:=RvalueArray[8];
      if(temp>=220) then temp:=255;
      ProcessedBmp.Canvas.Pixels[w,h]:=RGB(temp,temp,temp);
       end;
     ChangedBmp.Assign(ProcessedBmp);
     ShowChangedBmp;
end;
////////////////////////////////////////////////////////////
procedure TImageProcessForm.N8Gabor1Click(Sender: TObject);
begin
 GaborShowForm.ShowModal;
end;
//////////////////////////////////////////////////////////
procedure TImageProcessForm.FourAnisotropicClick(Sender: TObject);
var //4向各向异性扩散程序
  p1,p2,p3,p4,p5:pbytearray;
  x,y:integer;
  c:array[1..5]of real;
  k,t:real;
  i,n:integer;
begin
  n:=StrToInt(ParameterForm.Edit1.Text);
  k:=StrToFloat(ParameterForm.Edit2.Text);
  t:=StrToFloat(ParameterForm.Edit3.Text);
 ProcessedBmp.assign(WillbeChangedBmp);
 TestBMP.Assign(WillbeChangedBmp);
  for i:=1 to n do
  begin
   TestBMP.Assign(ProcessedBmp);
    for y:=2 to ProcessedBmp.Height-3 do
    begin
      p1:=ProcessedBmp.ScanLine[y];
      p2:=ProcessedBmp.ScanLine[y-1];
      p3:=ProcessedBmp.ScanLine[y+1];
      p4:=ProcessedBmp.ScanLine[y-2];
      p5:=TestBMP.ScanLine[y];
      for x:=2 to ProcessedBmp.Width-3 do
      begin
  c[1]:=1/(1+k*((p1[3*x]-p1[3*(x-1)])*(p1[3*x]-p1[3*(x-1)])+(p1[3*x]-p2[3*x])*(p1[3*x]-p2[3*x])));
  c[2]:=1/(1+k*((p2[3*x]-p2[3*(x-1)])*(p2[3*x]-p2[3*(x-1)])+(p2[3*x]-p4[3*x])*(p2[3*x]-p4[3*x])));
  c[3]:=1/(1+k*((p3[3*x]-p3[3*(x-1)])*(p3[3*x]-p3[3*(x-1)])+(p1[3*x]-p3[3*x])*(p1[3*x]-p3[3*x])));
  c[4]:=1/(1+k*((p1[3*(x-1)]-p1[3*(x-2)])*(p1[3*(x-1)]-p1[3*(x-2)])+(p1[3*(x-1)]-p2[3*(x-1)])*(p1[3*(x-1)]-p2[3*(x-1)])));
  c[5]:=1/(1+k*((p1[3*(x+1)]-p1[3*x])*(p1[3*(x+1)]-p1[3*x])+(p1[3*(x+1)]-p2[3*(x+1)])*(p1[3*(x+1)]-p2[3*(x+1)])));
     p5[3*x]:=round(p1[3*x]+t*((c[4]+c[1])*p1[3*(x-1)]/2+(c[5]+c[1])*p1[3*(x+1)]/2+
              (c[3]+c[1])*p3[3*x]/2+(c[2]+c[1])*p2[3*x]/2-(c[1]*4+c[2]+c[3]+c[4]+c[5])*p1[3*x]/2));
    p5[3*x+1]:=p5[3*x];
    p5[3*x+2]:=p5[3*x];
      end;
    end;
    ProcessedBmp.Assign(TestBMP);
  end;
    ChangedBmp.Assign(TestBMP);
    ShowChangedBmp;
end;
////////////////////////////////////////////////////////////
procedure TImageProcessForm.EightAnisotropicClick(Sender: TObject);
var //8向各向异性扩散程序
  p1,p2,p3,p4,p5:pbytearray;
  x,y,i,n:integer;
  c:array[1..9]of real;
  k,t:real;
begin
  n:=StrToInt(ParameterForm.edit1.Text);
  k:=StrToFloat(ParameterForm.edit2.Text);
  t:=StrToFloat(ParameterForm.edit3.Text);
  for i:=1 to n do
  begin
    TestBMP.Assign( ProcessedBmp);
    for y:=2 to  ProcessedBmp.Height-3 do
    begin
      p1:= ProcessedBmp.ScanLine[y];
      p2:= ProcessedBmp.ScanLine[y-1];
      p3:= ProcessedBmp.ScanLine[y+1];
      p4:= ProcessedBmp.ScanLine[y-2];
      p5:=TestBMP.ScanLine[y];
      for x:=2 to ProcessedBmp.Width-3 do
 begin
  c[1]:=1/(1+k*((p1[3*x]-p1[3*(x-1)])*(p1[3*x]-p1[3*(x-1)])+(p1[3*x]-p2[3*x])*(p1[3*x]-p2[3*x]))); //u[i,j]
  c[2]:=1/(1+k*((p2[3*x]-p2[3*(x-1)])*(p2[3*x]-p2[3*(x-1)])+(p2[3*x]-p4[3*x])*(p2[3*x]-p4[3*x]))); //u[i,j-1]
  c[3]:=1/(1+k*((p3[3*x]-p3[3*(x-1)])*(p3[3*x]-p3[3*(x-1)])+(p1[3*x]-p3[3*x])*(p1[3*x]-p3[3*x]))); //u[i,j+1]
  c[4]:=1/(1+k*((p1[3*(x-1)]-p1[3*(x-2)])*(p1[3*(x-1)]-p1[3*(x-2)])+(p1[3*(x-1)]-p2[3*(x-1)])*(p1[3*(x-1)]-p2[3*(x-1)])));//u[i-1,j]
  c[5]:=1/(1+k*((p1[3*(x+1)]-p1[3*x])*(p1[3*(x+1)]-p1[3*x])+(p1[3*(x+1)]-p2[3*(x+1)])*(p1[3*(x+1)]-p2[3*(x+1)])));//u[i+1,j]
  c[6]:=1/(1+k*((p2[3*(x-1)]-p2[3*(x-2)])*(p2[3*(x-1)]-p2[3*(x-2)])+(p2[3*(x-1)]-p4[3*(x-1)])*(p2[3*(x-1)]-p4[3*(x-1)])));//u[i-1,j-1]
  c[7]:=1/(1+k*((p2[3*(x+1)]-p2[3*x])*(p2[3*(x+1)]-p2[3*x])+(p2[3*(x+1)]-p4[3*(x+1)])*(p2[3*(x+1)]-p4[3*(x+1)])));//u[i+1,j-1]
  c[8]:=1/(1+k*((p3[3*(x-1)]-p3[3*(x-2)])*(p3[3*(x-1)]-p3[3*(x-2)])+(p3[3*(x-1)]-p2[3*(x-1)])*(p3[3*(x-1)]-p2[3*(x-1)])));//u[i-1,j+1]
  c[9]:=1/(1+k*((p3[3*(x+1)]-p3[3*x])*(p3[3*(x+1)]-p3[3*x])+(p3[3*(x+1)]-p2[3*(x+1)])*(p3[3*(x+1)]-p2[3*(x+1)])));;//u[i+1,j+1]
     p5[3*x]:=round(p1[3*x]+t*((c[4]+c[1])*p1[3*(x-1)]/2+(c[5]+c[1])*p1[3*(x+1)]/2+ (c[3]+c[1])*p3[3*x]/2+
          (c[2]+c[1])*p2[3*x]/2+ (c[6]+c[1])*p2[3*(x-1)]/2+(c[7]+c[1])*p2[3*(x+1)]/2+(c[8]+c[1])*p3[3*(x-1)]/2+
          (c[9]+c[1])*p2[3*(x+1)]/2-(c[1]*8+c[2]+c[3]+c[4]+c[5]+c[6]+c[7]+c[8]+c[9])*p1[3*x]/2));
     p5[3*x+1]:=p5[3*x];
     p5[3*x+2]:=p5[3*x];
      end;
    end;
    ProcessedBmp.Assign(TestBMP);
  end;
   ChangedBmp.Assign(TestBMP);
   ShowChangedBmp;
end;

procedure TImageProcessForm.GrayErodeClick(Sender: TObject);
var  //灰度化图像腐蚀处理
  p1, p2, p3, p4,p5,p6: pbytearray;
  RvalueArray:array[0..24]of Integer;
  i, j: integer;
begin
  Self.DoubleBuffered := True;  //设置双缓冲
  ProcessedBmp.assign(WillbeChangedBmp);
  TestBMP.Assign(WillbeChangedBmp);
  for j := 2 to ProcessedBmp.Height - 3 do
  begin  //处理相邻五条扫描线
    p1 := TestBMP.ScanLine[j];
    p2 := ProcessedBmp.ScanLine[j - 1];
    p3 := ProcessedBmp.ScanLine[j];
    p4 := ProcessedBmp.ScanLine[j + 1];
    p5 := ProcessedBmp.ScanLine[j + 2];
    p6 := ProcessedBmp.ScanLine[j - 2];
    for i := 2 to ProcessedBmp.Width - 3 do
    begin  //对存储25个R分量的数组进行赋值
      RvalueArray[0] := p2[3 * (i - 2) + 2];
      RvalueArray[1] := p2[3 * (i-1) + 2];
      RvalueArray[2] := p2[3 * i  + 2];
      RvalueArray[3] := p2[3 * (i+1) + 2];
      RvalueArray[4] := p2[3 * (i+2) + 2];
      RvalueArray[5] := p3[3 * (i - 2) + 2];
      RvalueArray[6] := p3[3 * (i - 1) + 2];
      RvalueArray[7] := p3[3 * i + 2];
      RvalueArray[8] := p3[3 * (i + 1) + 2];
      RvalueArray[9] := p3[3 * (i + 2) + 2];
      RvalueArray[10] := p4[3 * (i - 2) + 2];
      RvalueArray[11] := p4[3 * (i - 1) + 2];
      RvalueArray[12] := p4[3 * i + 2];
      RvalueArray[13] := p4[3 * (i + 1) + 2];
      RvalueArray[14] := p4[3 * (i + 2) + 2];
      RvalueArray[15] := p5[3 * (i -2) + 2];
      RvalueArray[16] := p5[3 * (i -1) + 2];
      RvalueArray[17] := p5[3 * i + 2];
      RvalueArray[18] := p5[3 * (i + 1) + 2];
      RvalueArray[19] := p5[3 * (i + 2) + 2];
      RvalueArray[20] := p6[3 * (i - 2) + 2];
      RvalueArray[21] := p6[3 * (i - 1) + 2];
      RvalueArray[22] := p6[3 * i  + 2];
      RvalueArray[23] := p6[3 * (i + 1) + 2];
      RvalueArray[24] := p6[3 * (i + 2) + 2];
      SelectionSort(RvalueArray);  //获取R分量的最小值
      p1[3 * i + 2] := RvalueArray[0];
      p1[3 * i + 1] := RvalueArray[0];
      p1[3 * i] := RvalueArray[0];
    end;
  end;
   ChangedBmp.Assign(TestBMP);
   ShowChangedBmp;
end;

procedure TImageProcessForm.GrayDilateClick(Sender: TObject);
var  //灰度化图像膨胀处理
  p1, p2, p3, p4,p5,p6: pbytearray;
  RvalueArray:array[0..24]of Integer;
  i, j: integer;
begin
  Self.DoubleBuffered := True;  //设置双缓冲
  ProcessedBmp.assign(WillbeChangedBmp);
  TestBMP.Assign(WillbeChangedBmp);
  for j := 2 to ProcessedBmp.Height - 3 do
  begin  //处理相邻五条扫描线
    p1 := TestBMP.ScanLine[j];
    p2 := ProcessedBmp.ScanLine[j - 1];
    p3 := ProcessedBmp.ScanLine[j];
    p4 := ProcessedBmp.ScanLine[j + 1];
    p5 := ProcessedBmp.ScanLine[j + 2];
    p6 := ProcessedBmp.ScanLine[j - 2];
    for i := 2 to ProcessedBmp.Width - 3 do
    begin  //对存储25个R分量的数组进行赋值
      RvalueArray[0] := p2[3 * (i - 2) + 2];
      RvalueArray[1] := p2[3 * (i-1) + 2];
      RvalueArray[2] := p2[3 * i  + 2];
      RvalueArray[3] := p2[3 * (i+1) + 2];
      RvalueArray[4] := p2[3 * (i+2) + 2];
      RvalueArray[5] := p3[3 * (i - 2) + 2];
      RvalueArray[6] := p3[3 * (i - 1) + 2];
      RvalueArray[7] := p3[3 * i + 2];
      RvalueArray[8] := p3[3 * (i + 1) + 2];
      RvalueArray[9] := p3[3 * (i + 2) + 2];
      RvalueArray[10] := p4[3 * (i - 2) + 2];
      RvalueArray[11] := p4[3 * (i - 1) + 2];
      RvalueArray[12] := p4[3 * i + 2];
      RvalueArray[13] := p4[3 * (i + 1) + 2];
      RvalueArray[14] := p4[3 * (i + 2) + 2];
      RvalueArray[15] := p5[3 * (i -2) + 2];
      RvalueArray[16] := p5[3 * (i -1) + 2];
      RvalueArray[17] := p5[3 * i + 2];
      RvalueArray[18] := p5[3 * (i + 1) + 2];
      RvalueArray[19] := p5[3 * (i + 2) + 2];
      RvalueArray[20] := p6[3 * (i - 2) + 2];
      RvalueArray[21] := p6[3 * (i - 1) + 2];
      RvalueArray[22] := p6[3 * i  + 2];
      RvalueArray[23] := p6[3 * (i + 1) + 2];
      RvalueArray[24] := p6[3 * (i + 2) + 2];
      SelectionSort(RvalueArray);  //获取R分量的最大值
      p1[3 * i + 2] := RvalueArray[24];
      p1[3 * i + 1] := RvalueArray[24];
      p1[3 * i] := RvalueArray[24];
    end;
  end;
   ChangedBmp.Assign(TestBMP);
   ShowChangedBmp;
end;

procedure TImageProcessForm.N1Click(Sender: TObject);
var
   w,h:integer;
   m ,var1 :double;
   I:array[0..500,0..500] of integer;
begin
 Image10.AutoSize:=false;
   m:=0;
   var1:=0;
    for w:=0 to image10.Picture.Bitmap.Width-1
    do
    begin
    for h:=0 to image10.Picture.Bitmap.Height-1
    do
    begin
     m:=getrvalue(image10.Canvas.Pixels[w,h])+m;
     I[w,h]:=getrvalue(image10.Canvas.Pixels[w,h]);
    end;
    end;
    m:=m / ((image10.Picture.Bitmap.Width)* (image10.Picture.Bitmap.Height)); //图象的平均灰度值
  for w:=0 to image10.Picture.Bitmap.Width-1
    do
    begin
    for h:=0 to image10.Picture.Bitmap.Height-1
    do
    begin
      var1:=var1+trunc(power((getrvalue(image10.Canvas.Pixels[w,h])-m),2));
    end;
    end;
    var1:=var1 /((image10.Picture.Bitmap.Width)* (image10.Picture.Bitmap.Height));
   for w:=0 to image10.Picture.Bitmap.Width-1
    do
    begin
    for h:=0 to image10.Picture.Bitmap.Height-1
    do
    begin
    if I[w,h]>m then
    begin
    I[w,h]:= 210+trunc(sqrt(600*power((I[w,h]-m),2)/m ));
    if I[w,h]>256 then I[w,h]:=250;
    end  else
    begin
    I[w,h]:= 210-trunc(sqrt(600*power((I[w,h]-m),2)/m));
    end;
    end;
    end;
    for w:=0 to image10.Picture.Bitmap.Width-1
    do
    begin
    for h:=0 to image10.Picture.Bitmap.Height-1
    do
    begin
    Image10.Canvas.Pixels[w,h]:=rgb(I[w,h],I[w,h],I[w,h]);
    end;
    end ;  
end;

end.

⌨️ 快捷键说明

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