简单高效的图片降噪方法

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

计算机通过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位。图片大小一致。


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


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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章