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

📄 imageprocessmainunit.~pas

📁 数字图像预出处理系统
💻 ~PAS
📖 第 1 页 / 共 5 页
字号:
            p4[3 * (i + 1) + 2]))));
         G := min(255, max(0, ((-p2[3 * (i - 1) + 1] - 2 * p2[3 * i +
            1] -  p2[3 * (i + 1) + 1] - 0 * p3[3 * (i - 1) + 1]
            + 0 * p3[3 * i + 1]- 0 * p3[3 * (i + 1) + 1]
            + p4[3 * (i - 1) + 1] + 2 * p4[3 * i + 1]
            + p4[3 * (i + 1) +  1]))));
         B := min(255, max(0, ((-p2[3 * (i - 1)] - 2 * p2[3 * i]
             - p2[3* (i + 1)]- 0 * p3[3 * (i - 1)]
             + 0 * p3[3 * i] - 0 * p3[3 * (i + 1)]
             +  p4[3 * (i - 1)] + 2 * p4[3 * i + 2] + p4[3 * (i + 1)]))));
            // 采用检测水平边缘的sobel算子[-1,-2,1,0,0,0,1,2,1]
            p1[3 * i + 2] := min(255, max(0, ((-p2[3 * (i - 1) + 2] + 0 *
            p2[3* i + 2] + P2[3 * (i + 1) + 2] - 2 * p3[3 * (i - 1) + 2] + 0 * p3[3
               * i + 2] + 2 * p3[3 * (i+ 1) + 2] - p4[3 * (i - 1) + 2]
               - 0 * p4[3 * i + 2] + p4[3* (i + 1) + 2]))));
            p1[3 * i + 1] := min(255, max(0, ((-p2[3 * (i - 1) + 1] + 0 *
            p2[3* i + 1]+ p2[3 * (i + 1) + 1] - 2 * p3[3 * (i - 1) + 1]
            + 0 * p3[3* i + 1] + 2 * p3[3 * (i+ 1) + 1] -
            p4[3 * (i - 1) + 1] - 0 * p4[3 * i + 1] +
            p4[3* (i + 1) +  1]))));
            p1[3 * i] := min(255, max(0, ((-p2[3 * (i - 1)] + 0 * p2[3 *
            i] +  p2[3 * (i + 1)] - 2 * p3[3 * (i - 1)] + 0 * p3[3 * i] + 2
            * p3[3 * (i + 1)] - p4[3 * (i - 1)] - 0 * p4[3 * i]
            + p4[3 * (i +1)]))));
            //采用检测水平边缘的sobel算子[-1,0,1,-2,0,2,-1,0,1]
         p1[3 * i + 2] := (Max(R, p1[3 * i + 2]));
         p1[3 * i + 1] := (Max(G, p1[3 * i + 1]));
         p1[3 * i] :=     (Max(B, p1[3 * i]));
      end;
   end;
     ChangedBmp.Assign(TestBMP);
     ShowChangedBmp;
end;

procedure TImageProcessForm.PrewittClick(Sender: TObject);
var
   p1, p3, p2, p4: pByteArray;
   I,J: integer;
   R,G,B: Byte;
begin
  self.DoubleBuffered := true; //采用双缓冲模式
    TestBMP.Assign(WillbeChangedBmp);
    ProcessedBmp.Assign(WillbeChangedBmp);
 for j := 1 to TestBMP.Height - 2 do
   begin
      p1 := TestBMP.ScanLine[j];
      p2 := ProcessedBmp.ScanLine[j - 1];
      p3 := ProcessedBmp.ScanLine[j];
      p4 := ProcessedBmp.ScanLine[j + 1];
        for i := 1 to TestBMP.Width - 2 do
      begin
        //采用sobal边缘算子  {( -1 -1 -1)
      // (0  0  0 ) ( 1  1  1) }和{(1 0 -1)(1 0 -1)(1 0 -1)
         r := min(255, max(0, ((-p2[3 * (i - 1) + 2] - p2[3 * i + 2] -
            p2[3 * (i + 1) + 2] - 0 * p3[3 * (i - 1) + 2] + 0 * p3[3 * i + 2]
               - 0 *  p3[3 * (i + 1)+ 2] + p4[3 * (i - 1) + 2] + p4[3 * i + 2]
            + p4[3 * (i +  1) +2]))));
         g := min(255, max(0, ((-p2[3 * (i - 1) + 1] - p2[3 * i + 1] -
            p2[3* (i + 1) + 1] - 0 * p3[3 * (i - 1) + 1] + 0 * p3[3 * i + 1]
               - 0 *  p3[3 * (i+ 1)+ 1] + p4[3 * (i - 1) + 1] + p4[3 * i + 1]
         + p4[3 * (i + 1) + 1]))));
         b := min(255, max(0, ((-p2[3 * (i - 1)] - p2[3 * i] - p2[3 *
            (i + 1)] - 0* p3[3 * (i - 1)] + 0 * p3[3 * i] - 0 * p3[3 * (i + 1)]
             + p4[3* (i - 1)]+ p4[3 * i + 2] + p4[3 * (i + 1)]))));
          begin
            p1[3 * i + 2] := min(255, max(0, ((p2[3 * (i - 1) + 2] - 0
               *  p2[3 * i + 2] - p2[3 * (i + 1) + 2] + p3[3 * (i - 1) + 2] + 0 *
                  p3[3 * i + 2] -  p3[3* (i + 1) + 2] + p4[3 * (i - 1) + 2] +
                  0 * p4[3 * i + 2] - p4[3 * (i + 1)+ 2]))));
            p1[3 * i + 1] := min(255, max(0, ((p2[3 * (i - 1) + 1] - 0* p2[3 * i +
               1] - p2[3 * (i + 1) + 1] + p3[3 * (i - 1) + 1] + 0 *
                  p3[3 * i + 1] - p3[3* (i + 1) + 1] + p4[3 * (i - 1) + 1] +
                  0 * p4[3 * i + 1] -p4[3 * (i+ 1)+ 1]))));
            p1[3 * i] := min(255, max(0, ((p2[3 * (i - 1)] - 0 * p2[3
               * i]- p2[3 *(i + 1)] + p3[3 * (i - 1)] + 0 * p3[3 * i] - p3[3 * (i
                  + 1)]+ p4[3 * (i - 1)] + 0 * p4[3 * i] - p4[3 * (i + 1)]))));
            p1[3 * i + 2] := (max(r, p1[3 * i + 2]));
            p1[3 * i + 1] := (max(g, p1[3 * i + 1]));
            p1[3 * i] := (max(b, p1[3 * i]));
         end;
      end;
   end;
    ChangedBmp.Assign(TestBMP);
    ShowChangedBmp;
end;

procedure TImageProcessForm.ExchangeToolButtonClick(Sender: TObject);
begin
 WillbeChangedBmp.Assign(ChangedBmp);
  showOriginalbmp;
end;


procedure TImageProcessForm.MarrClick(Sender: TObject);
var
   i,j:integer;
   p1,p2,p3,p4,p5,p:pByteArray;
begin
   self.DoubleBuffered := true; //采用双缓冲模式
    TestBMP.Assign(WillbeChangedBmp);
    ProcessedBmp.Assign(WillbeChangedBmp);
   for j:=2 to TestBMP.Height-3 do
   begin
      p:=TestBMP.ScanLine[j];
      p1:=ProcessedBmp.ScanLine[j-2];
      p2:=ProcessedBmp.ScanLine[j-1];
      p3:=ProcessedBmp.ScanLine[j];
      p4:=ProcessedBmp.ScanLine[j+1];
      p5:=ProcessedBmp.ScanLine[j+2];
      for i:=2 to TestBMP.Width-3 do
      begin
         p[i*3]:=min(255,max(0,(
                     -2*p1[(i-2)*3]-4*p1[(i-1)*3]- 4*p1[i*3]-4*p1[(i+1)*3]-2*p1[(i+2)*3]
                     -4*p2[(i-2)*3]              + 8*p2[i*3]              -4*p2[(i+2)*3]
                     -4*p3[(i-2)*3]+8*p3[(i-1)*3]+24*p3[i*3]+8*p3[(i+1)*3]-4*p3[(i+2)*3]
                     -4*p4[(i-2)*3]              + 8*p4[i*3]              -4*p4[(i+2)*3]
                     -2*p5[(i-2)*3]-4*p5[(i-1)*3]- 4*p5[i*3]-4*p5[(i+1)*3]-2*p5[(i+2)*3])
                     ));
         p[i*3+1]:=min(255,max(0,(
                     -2*p1[(i-2)*3+1]-4*p1[(i-1)*3+1]-4*p1[i*3+1]-4*p1[(i+1)*3+1]-2*p1[(i+2)*3+1]
                     -4*p2[(i-2)*3+1]+8*p2[i*3+1]-4*p2[(i+2)*3+1]
                     -4*p3[(i-2)*3+1]+8*p3[(i-1)*3+1]+24*p3[i*3+1]+8*p3[(i+1)*3+1]-4*p3[(i+2)*3+1]
                     -4*p4[(i-2)*3+1]+8*p4[i*3+1]-4*p4[(i+2)*3+1]
                     -2*p5[(i-2)*3+1]-4*p5[(i-1)*3+1]-4*p5[i*3+1]-4*p5[(i+1)*3+1]-2*p5[(i+2)*3+1])
                     ));
         p[i*3+2]:=min(255,max(0,(
                     -2*p1[(i-2)*3+2]-4*p1[(i-1)*3+2]-4*p1[i*3+2]-4*p1[(i+1)*3+2]-2*p1[(i+2)*3+2]
                     -4*p2[(i-2)*3+2]+8*p2[i*3+2]-4*p2[(i+2)*3+2]
                     -4*p3[(i-2)*3+2]+8*p3[(i-1)*3+2]+24*p3[i*3+2]+8*p3[(i+1)*3+2]-4*p3[(i+2)*3+2]
                     -4*p4[(i-2)*3+2]+8*p4[i*3+2]-4*p4[(i+2)*3+2]
                     -2*p5[(i-2)*3+2]-4*p5[(i-1)*3+2]-4*p5[i*3+2]-4*p5[(i+1)*3+2]-2*p5[(i+2)*3]+2)
                     ));
      end;
   end;
   ChangedBmp.Assign(TestBMP);
   ShowChangedBmp;
end;
procedure TImageProcessForm.CannyClick(Sender: TObject);
var
   x,y,i,g: integer;
   LowBmp,HighBmp: TBitmap;
   p0,p1,p2,p3,p4,plow,phigh: pByteArray;
   p,q,m,angle: array [0..2] of Extended;
   tlow,thigh: Extended;
   gray:array [0..255] of integer;
begin
   self.DoubleBuffered := true; //采用双缓冲模式
   TestBMP.Assign(WillbeChangedBmp);
   ProcessedBmp.Assign(WillbeChangedBmp);
   LowBmp:=TBitmap.Create;
   LowBmp.Assign(TestBMP);
   LowBmp.PixelFormat:=pf24bit;
   LowBmp.Height:=TestBMP.Height;
   LowBmp.Width:=TestBMP.Width;
   HighBmp:=TBitmap.Create;
   HighBmp.Assign(TestBMP);
   HighBmp.PixelFormat:=pf24bit;
   HighBmp.Height:=TestBMP.Height;
   HighBmp.Width:=TestBMP.Width;
    g:=0;
   for x:=0 to 255 do Gray[x]:=0;
   for y:=1 to TestBMP.Height-3 do
   begin
      p0:=ProcessedBmp.ScanLine[y];
      plow:=lowBmp.ScanLine[y];
      phigh:=HighBmp.ScanLine[y];
      p1:=TestBMP.ScanLine[y-1];
      p2:=TestBMP.ScanLine[y];
      p3:=TestBMP.ScanLine[y+1];
      p4:=TestBMP.ScanLine[y+2];
      for x:=1 to TestBMP.Width-3 do
      begin
         inc(g);
         for i:=0 to 2 do
         begin
            p[i]:=0;   q[i]:=0;
            m[i]:=0;  angle[i]:=0;
         end;
         p[0]:=(p2[3*(x+1)]-p2[3*x]+p3[3*(x+1)]-p3[3*x])/2;
         q[0]:=(p2[3*(x+1)]+p2[3*x]-p3[3*(x+1)]-p3[3*x])/2;
         m[0]:=sqrt(sqr(p[0])+sqr(q[0]));
         Inc(Gray[round(m[0])]);
         if m[0]<>0 then   //若m=0,则x点灰度已经最小,不必再处理
         begin
            if ((q[0]<>0) and (p[0]=0)) then angle[0]:=90         //angle为90度
            else angle[0]:=ArcTan(q[0]/p[0])*4*45/pi;
            if (angle[0]<-22.5) then angle[0]:=angle[0]+180;
             //NMS区域判断
            if ((angle[0]>=-22.5) and (angle[0]< 22.5)) then
            begin
               p[1]:=(p2[3*(x+2)]-p2[3*(x+1)]+p3[3*(x+2)]-p3[3*(x+1)])/2;
               q[1]:=(p2[3*(x+1)]+p2[3*(x+2)]-p3[3*(x+1)]-p3[3*(x+2)])/2;
               m[1]:=sqrt(sqr(p[1])+sqr(q[1]));
               p[2]:=(p2[3*x]-p2[3*(x-1)]+p3[3*x]-p3[3*(x-1)])/2;
               q[2]:=(p2[3*x]+p2[3*(x-1)]-p3[3*x]-p3[3*(x-1)])/2;
               m[2]:=sqrt(sqr(p[2])+sqr(q[2]));
            end;
            if ((angle[0]>= 22.5) and (angle[0]< 67.5)) then
            begin
               p[1]:=(p1[3*(x+2)]-p1[3*(x+1)]+p2[3*(x+2)]-p2[3*(x+1)])/2;
               q[1]:=(p1[3*(x+2)]+p2[3*(x+2)]-p1[3*(x+1)]-p2[3*(x+1)])/2;
               m[1]:=sqrt(sqr(p[1])+sqr(q[1]));
               p[2]:=(p3[3*x]-p3[3*(x-1)]+p4[3*x]-p4[3*(x-1)])/2;
               q[2]:=(p3[3*x]+p3[3*(x-1)]-p4[3*x]-p4[3*(x-1)])/2;
               m[2]:=sqrt(sqr(p[2])+sqr(q[2]));
            end;
            if ((angle[0]>= 67.5) and (angle[0]<112.5)) then
            begin
               p[1]:=(p1[3*(x+1)]-p1[3*x]+p2[3*(x+1)]-p2[3*x])/2;
               q[1]:=(p1[3*(x+1)]+p1[3*x]-p2[3*(x+1)]-p2[3*x])/2;
               m[1]:=sqrt(sqr(p[1])+sqr(q[1]));

               p[1]:=(p3[3*(x+1)]-p3[3*x]+p4[3*(x+1)]-p4[3*x])/2;
               q[1]:=(p3[3*(x+1)]+p3[3*x]-p4[3*(x+1)]-p4[3*x])/2;
               m[2]:=sqrt(sqr(p[2])+sqr(q[2]));
            end;
            if ((angle[0]>=122.5) and (angle[0]<157.5)) then
            begin
               p[1]:=(p1[3*x]-p1[3*(x-1)]+p2[3*x]-p2[3*(x-1)])/2;
               q[1]:=(p1[3*x]+p1[3*(x-1)]-p2[3*x]-p2[3*(x-1)])/2;
               m[1]:=sqrt(sqr(p[1])+sqr(q[1]));

               p[1]:=(p3[3*(x+2)]-p3[3*(x+1)]+p4[3*(x+2)]-p4[3*(x+1)])/2;
               q[1]:=(p3[3*(x+2)]+p3[3*(x+1)]-p4[3*(x+2)]-p4[3*(x+1)])/2;
               m[2]:=sqrt(sqr(p[2])+sqr(q[2]));
            end;
            //若不是局部最大值,则将x点灰度设置为0
            if ((m[0]<m[1]) or (m[0]<m[2])) then
            begin
               p0[3*x]:=0;
               p0[3*x+1]:=0;
               p0[3*x+2]:=0;
               plow[3*x]:=0;
               plow[3*x+1]:=0;
               plow[3*x+2]:=0;
               phigh[3*x]:=0;
               phigh[3*x+1]:=0;
               phigh[3*x+2]:=0;
          end  else
            begin
               tlow:=m[0]*0.8;
               thigh:=2*tlow;
               //设置低阈值图像
               if plow[3*x]<tlow then
               begin
     plow[3*x]:=0; plow[3*x+1]:=0; plow[3*x+2]:=0;
               end
               else
               begin
 //                 plow[3*x]:=255;
//                  plow[3*x+1]:=255;
//                  plow[3*x+2]:=255;
               end;
               //设置高阈值图像
               if phigh[3*x]<thigh then
               begin
                  phigh[3*x]:=0;
                  phigh[3*x+1]:=0;
                  phigh[3*x+2]:=0;
               end
               else
               begin
       //           phigh[3*x]:=255;
       //           phigh[3*x+1]:=255;
       //            phigh[3*x+2]:=255;
               end;
            end;
         end;//end m[0] judge
        end;
   end;
    ChangedBmp.Assign(lowBMP);
    ShowChangedBmp;
end;
//////////////////////////////////////////////////////////////
procedure TImageProcessForm.GaussFilterClick(Sender: TObject);
var //图像高斯滤波处理程序
   i,j: integer;
   p1, p2, p3, p4: pByteArray;
begin
    TestBMP.Assign(WillbeChangedBmp);
    ProcessedBmp.Assign(WillbeChangedBmp);
   for j:=1 to TestBMP.Height-2 do
   begin
      p1:=ProcessedBmp.ScanLine[j];
      p2:=TestBMP.ScanLine[j-1];
      p3:=TestBMP.ScanLine[j];
      p4:=TestBMP.ScanLine[j+1];
      for i:=1 to TestBMP.Width-2 do
begin
   p1[3*i+2]:=min(255,max(0,((p2[3*(i-1)+2]+2*p2[3*i+2]+p2[3*(i+1)+2]+2*p3[3*(i-1)+2]+4*p3[3*i+2]
                  +2*p3[3*(i+1)+2]+p4[3*(i-1)+2]+2*p4[3*i+2]+p4[3*(i+1)+2])) div 16));
   p1[3*i+1]:=min(255,max(0,((p2[(i-1)+1]+2*p2[3*i+1]+p2[3*(i+1)+1]+2*p3[3*(i-1)+1]+4*p3[3*i+1]
                  +2*p3[3*(i+1)+1]+p4[3*(i-1)+1]+2*p4[3*i+1]+p4[3*(i+1)+1])) div 16));
   p1[3*i]  :=min(255,max(0,((p2[(i-1)]+2*p2[3*i]+p2[3*(i+1)]+2*p3[3*(i-1)]+4*p3[3*i]
                  +2*p3[3*(i+1)]+p4[3*(i-1)]+2*p4[3*i]+p4[3*(i+1)])) div 16));
   end;
end;
   ChangedBmp.Assign(ProcessedBmp);
   ShowChangedBmp;
end;
///////////////////////////////////////////////////////////////////////////////
procedure TImageProcessForm.GuassLaplaceClick(Sender: TObject);
var p,p1,p2,p3,p4,p5:pbytearray ;
    x,y:integer ;
begin
    TestBMP.Assign(WillbeChangedBmp);
    ProcessedBmp.Assign(WillbeChangedBmp);

//temp.Assign(original_image.Picture.Bitmap);
//buffer.Assign(original_image.Picture.Bitmap);
for y:=2 to TestBMP.Height-3 do
begin
 p:=ProcessedBmp.ScanLine[y];
 p1:=TestBMP.ScanLine[y-2];
 p2:=TestBMP.ScanLine[y-1];
 p3:=TestBMP.ScanLine[y];
 p4:=TestBMP.ScanLine[y+1];
 p5:=TestBMP.ScanLine[y+2];
 for x:=2  to TestBMP.Width-3 do
 begin
  p[x*3]:=min(255,max(0,(-p1[3*x]-p2[3*(x-1)]-2*p2[3*x]-p2[3*(x+1)]
  -p3[3*(x-2)]-2*p3[3*(x+1)]+16*p3[3*x]-2*p3[3*(x+1)]-p3[3*(x+2)]
  -p4[3*(x-1)]-2*p4[3*x]-p4[3*(x+1)]-p5[3*x])));
  p[x*3+1]:=min(255,max(0,(-p1[3*x+1]-p2[3*(x-1)+1]-2*p2[3*x+1]-p2[3*(x+1)+1]
  -p3[3*(x-2)+1]-2*p3[3*(x+1)+1]+16*p3[3*x+1]-2*p3[3*(x+1)+1]-p3[3*(x+2)+1]
  -p4[3*(x-1)]-2*p4[3*x]-p4[3*(x+1)]-p5[3*x])));
  p[x*3+2]:=min(255,max(0,(-p1[3*x+2]-p2[3*(x-1)+2]-2*p2[3*x+2]-p2[3*(x+1)+2]
  -p3[3*(x-2)+2]-2*p3[3*(x+1)+2]+16*p3[3*x+2]-2*p3[3*(x+1)+2]-p3[3*(x+2)+2]
  -p4[3*(x-1)+2]-2*p4[3*x+2]-p4[3*(x+1)+2]-p5[3*x]+2)));
 end;
end;
    ChangedBmp.Assign(ProcessedBmp);
    ShowChangedBmp;
end;

procedure TImageProcessForm.RobertClick(Sender: TObject);
var//Robert边缘检测程序
  x,y:integer;
  P,p1,p2:pbytearray;
begin
  TestBMP.Assign(WillbeChangedBmp);
    ProcessedBmp.Assign(WillbeChangedBmp);
 for y:=0 to TestBMP.Height-2 do
  begin
  p:=ProcessedBmp.ScanLine[y];
  p1:=TestBMP.ScanLine[y];
  p2:=TestBMP.ScanLine[y+1];
  for x:=0 to TestBMP.Width-2 do
   begin
  p[3*x]:=max(0,max(-p1[3*(x+1)]+p2[3*x], p1[3*x]-p2[3*(x+1)]));
  p[3*x+1]:=max(0,max(-p1[3*(x+1)+1]+p2[3*x+1], p1[3*x+1]-p2[3*(x+1)+1]));
  p[3*x+2]:=max(0,max(-p1[3*(x+1)+2]+p2[3*x+2], p1[3*x+2]-p2[3*(x+1)+2]));

⌨️ 快捷键说明

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