简单高效的图片降噪方法

来源:互联网 发布:怎么植入php一句话木马 编辑:程序博客网 时间:2024/05/03 03:23

图片降噪在很多场合下都要使用到,譬如我遇到的医疗产品。

计算机通过USB口从医疗产品中获取图像,但由于硬件的原因,清晰度一直不够,有很多噪点。

降噪不可避免。降噪算法就是主要问题了。

下面介绍一种简单高效的降噪方法。

由于硬件拍照造成的噪点是随机的,要去除这些随机噪点的方法,其实很简单,多拍几张,5张、10张。

对现在的拍照设备来说,拍个10张图片,也花费不了多长时间,都在毫秒级别。

然后对这几张图片进行叠加,这样的话,那些随机噪点就会被去除掉。原理我就不说了。可以参考随机信号理论。

而且效率也很高,都是在内存中操作。


下面给出Delphi叠加图片函数:


procedure OverlyBmp(const bmp: TArray<TBitmap>; bmpResult: TBitmap);var  III, JJJ, KKK   : Integer;  P               : TArray<PRGBTriple>;  Q               : PRGBTriple;  intR, intG, intB: Integer;  intLen          : Integer;begin  intLen := Length(bmp);  SetLength(P, intLen);  for III := 0 to bmp[0].Height - 1 do  begin    for KKK := 0 to intLen - 1 do    begin      P[KKK] := bmp[KKK].ScanLine[III];    end;    Q       := bmpResult.ScanLine[III];    for JJJ := 0 to bmp[0].Width - 1 do    begin      intR    := 0;      intG    := 0;      intB    := 0;      for KKK := 0 to intLen - 1 do      begin        intR := intR + P[KKK]^.rgbtRed;        intG := intG + P[KKK]^.rgbtGreen;        intB := intB + P[KKK]^.rgbtBlue;      end;      intR         := Byte(intR div intLen);      intG         := Byte(intG div intLen);      intB         := Byte(intB div intLen);      Q^.rgbtRed   := intR;      Q^.rgbtGreen := intG;      Q^.rgbtBlue  := intB;      for KKK      := 0 to intLen - 1 do      begin        Inc(P[KKK]);      end;      Inc(Q);    end;  end;  bmpResult.HandleType := bmDDB;end;

上面的函数,要求图片是BMP位图,24位。图片大小一致。


其它颜色位数的可自行改写该函数。


我称这种降噪方法为叠加降噪。


1 0