// 图像二值化
// 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 <N <8),当A的RGB值与周围8个点的RGB相等数小于N时,此点为噪点
// InBmpFile: String 要进行降噪的Bmm文件名
// OutBmpFile: String 降噪后Bmm文件保存的文件名
// G: Integer 图像二值化阀值
// N: Integer 降噪率 0 <N <8
// 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;
图像降噪
最新推荐文章于 2023-05-16 21:25:50 发布