Delphi用邻域平均法对图像进行平滑处理


本文整理自网络,侵删。

 邻域平均法是一种在空间域上对图像进行平滑处理的最常用方法。该方法的核心是求出图像中以某点为中心的一个邻域范围内的图像像素之平均值,并以此平均值来作为该中心点的灰度值 。

uses Math;
procedure TForm1.Button1Click(Sender: TObject);
var
   bmp1, bmp2: Tbitmap;
   p1, p2, p3, p4: pbytearray; //定义4个pbytearray类型变量
   i, j, z: integer;
   y: array[0..8] of integer;
begin
   y[0] := 1; y[1] := 2; y[2] := 1; y[3] := 2; y[4] := 4;
   y[5] := 2; y[6] := 1; y[7] := 2; y[8] := 1; //卷积矩阵
   z := 16; //卷积核
   bmp1 := Tbitmap.Create;
   bmp2 := Tbitmap.Create;
   bmp1.Assign(Bitmap);
   bmp1.PixelFormat := pf24bit; //24位格式,便于处理
   bmp1.Width := Bitmap.Width;
   bmp1.Height := Bitmap.Height;
   bmp2.Assign(bmp1); //备用的位图
   bmp2.PixelFormat := pf24bit;
   for j := 1 to bmp1.Height - 2 do
      begin
         p1 := bmp1.ScanLine[j]; //第一条扫描线
         p2 := bmp2.ScanLine[j - 1]; //第二条扫描线,为了防止数据变化,在备用位图上操作
         p3 := bmp2.ScanLine[j];
         p4 := bmp2.ScanLine[j + 1]; //第三条扫描线
         for i := 1 to bmp1.Width - 2 do
            begin  //进行卷积操作获取新的像素值
               p1[3 * i + 2] := min(255, max(0, ((y[0] * p2[3 * (i - 1) + 2]
                  + y[1] * p2[3 * i + 2] + y[2] * p2[3 * (i + 1) + 2] + y[3]  * p3[3 * (i - 1) + 2] + y[4] * p3[3 * i + 2] 
                  + y[5] * p3[3 * (i + 1) + 2] + y[6] * p4[3 * (i - 1) + 2] + y[7] * p4[3 * i + 2] + y[8] * p4[3 * (i + 1) + 2]))
                     div z)); //重新计算出红色分量
               p1[3 * i + 1] := min(255, max(0, ((y[0] * p2[3 * (i - 1) + 1]
                  + y[1] * p2[3 * i + 1] + y[2] * p2[3 * (i + 1) + 1] + y[3] * p3[3 * (i - 1) + 1] + y[4] * p3[3 * i + 1] 
                  + y[5] * p3[3 * (i + 1) + 1] + y[6] * p4[3 * (i - 1) + 1] + y[7] * p4[3 * i + 1] + y[8] * p4[3 * (i +1) + 1]))
                     div z)); //重新计算出蓝色分量
               p1[3 * i] := min(255, max(0, ((y[0] * p2[3 * (i - 1)] + y[1] * p2[3 * i] + y[2] * p2[3 * (i + 1)] + y[3] * p3[3 * (i -1)] 
                   + y[4] * p3[3 * i] + y[5] * p3[3 * (i + 1)] + y[6] * p4[3 * (i - 1)] + y[7] * p4[3 * i] + y[8] * p4[3 * (i + 1)]))
                     div z)); //重新计算出绿色分量
            end;
      end;
   Bitmap.Assign(Bmp1); //重新显示
   Bmp1.Free;
   bmp2.Free;  //释放资源
end;

相关阅读 >>

Delphi 使用firedac tfdibbackup和tfdibrestore备份和还原firebird

Delphi 压缩带密码的access数据库的方法

Delphi如何实现模拟组合按键,如发送ctrl_f的按键消息

Delphi实现电脑桌面壁纸更换

Delphi二值图像膨胀算法

Delphi实时监视应用程序内存使用量

Delphi 收藏字符串处理单元

Delphi隐藏当前进程(新)

Delphi 清除ie缓存 internet临时文件 cookie 历史记录 表单记录 上网密码

Delphi tdictionary保存到文件

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...