图片降噪在很多场合下都要使用到,譬如我遇到的医疗产品。
计算机通过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位。图片大小一致。
其它颜色位数的可自行改写该函数。
我称这种降噪方法为叠加降噪。