图像降噪

// 图像二值化 
// Bmp: TBitmap;      // 输入图像 
// Gray: Integer    // 阀值 
Procedure TwoValue(Bmp: TBitmap; Gray: Integer); 
Var 
  P: PByteArray; 
  X, Y, Z: Integer; 
Begin 

  //设置为24位真彩色,这样一个象素点包含三个字节 
  Bmp.PixelFormat := pf24Bit; 
  For Y := 0 To Bmp.Height - 1 Do 
  Begin 
    P := Bmp.ScanLine[Y];    // 读取一行象素点 
    For X := 0 To Bmp.Width - 1 Do 
    Begin 
      Z := Round(P[X * 3 + 2] * 0.3 + P[x * 3 + 1] * 0.59 + P[x * 3] * 0.11);  // 计算象素点阀值 

      If Z > Gray 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; 

End; 

// 降噪 
// 根据一个点A的RGB值,与周围的8个点的RBG值比较,设定一个值N(0 // InBmpFile: String 要进行降噪的Bmm文件名 
// OutBmpFile: String 降噪后Bmm文件保存的文件名 
// G: Integer 图像二值化阀值 
// N: Integer 降噪率 0 // Z: Integer 降噪次数 
// 输出 
//  0:降噪成功 
//  1:降噪失败 
Function ClearNoise(InBmpFile, OutBmpFile: String; G, N, Z: Integer): Integer; 
Var 
  Bmp: TBitmap ; 
  Piexl : tcolor; 
  NearDots, X, Y, i, RGBz : integer; 
begin 
  Result := 1 ; 
  If Not FileExists(InBmpFile) Then Exit ; // 如果输入文件名不存在,直接退出 

  Bmp := TBitmap.Create; 
  Try 
    Bmp.LoadFromFile(InBmpFile) ;    // 载入图像 

    TwoValue(Bmp, G);  // 二值化 

    For i := 1 To Z Do  // 循环降噪 
    Begin 
      // 先将图片左上和右下角的点设置为白色 
      Bmp.Canvas.Pixels[0,0] := clWhite; 
      Bmp.Canvas.Pixels[Bmp.Width - 1, Bmp.Height - 1] := clWhite; 
      For X := 0 To Bmp.Width - 1 Do 
      Begin 
        For Y := 0 To Bmp.Height - 1 Do 
        Begin 
          Piexl := Bmp.Canvas.Pixels[X, Y];  // 读取象素点颜色 
          RGBz := GetRValue(Piexl);          // 读取象素点RGB值中的R值 

          // 因为图像已经二值化,如果R值=0,此象素点为黑色,如果R值 <>0,此象素点为白色, 
          If (RGBz = 0) Then // 处理黑点 
          Begin 
            NearDots := 0;  // 与周围8个点RGB相等的点数 
            If (GetRValue(Bmp.Canvas.Pixels[X - 1, Y - 1]) = RGBz) Then Inc(NearDots) ;    // 左上 
            If (GetRValue(Bmp.Canvas.Pixels[X,    Y - 1]) = RGBz) Then Inc(NearDots) ;    // 上 
            If (GetRValue(Bmp.Canvas.Pixels[X + 1, Y - 1]) = RGBz) Then Inc(NearDots) ;    // 右上 
            If (GetRValue(Bmp.Canvas.Pixels[X - 1, Y])    = RGBz) Then Inc(NearDots) ;    // 左 
            If (GetRValue(Bmp.Canvas.Pixels[X + 1, Y])    = RGBz) Then Inc(NearDots) ;    // 右 
            If (GetRValue(Bmp.Canvas.Pixels[X - 1, Y + 1]) = RGBz) Then Inc(NearDots) ;    // 左下 
            If (GetRValue(Bmp.Canvas.Pixels[X,    Y + 1]) = RGBz) Then Inc(NearDots) ;    // 下 
            If (GetRValue(Bmp.Canvas.Pixels[X + 1, Y + 1] )= RGBz) Then Inc(NearDots) ;    // 右下 

            // 如果 与周围8个点RGB相等的点数 < 输入的降噪率,此点为噪点 
            If (NearDots < N) Then 
              Bmp.Canvas.Pixels[x,y] := clWhite // 把噪点颜色设置为白色(降噪) 
          End ; 
        End; 
      End ; 
    End ; 
    Bmp.SaveToFile(OutBmpFile); 
    Result := 0 ; 
  Finally 
    Bmp.Free ; // 释放 TBitmap 
  End ; 
End; 

你可能感兴趣的:(图像处理)