使用开源图形库删除灰尘和划痕

时间:2014-11-30 20:31:50

标签: image opencv image-processing imagemagick

我正在尝试自动化大量扫描胶片的清理过程。我有48位RGBI TIFF文件(RGB +红外)中的所有图像,我可以使用红外通道创建除尘功能。我想知道是否有任何体面的开源实现可以用来实现这一点(我用于批量处理的所有其他软件都是我通过Ruby接口访问的开源库)。

我的第一个选择是ImageMagick,但我在其中找不到任何高级绘画选项(可能我错了)。我听说过这可以用MagickWand库完成,但我还没有找到具体的例子。

我也看过OpenCV,但似乎OpenCV's in-paint method只接受每通道8位的图像,而我必须保留16。 有没有其他的库,甚至是一个我不知道的有趣的代码片段?任何帮助表示赞赏。

样品:

完整图片

Full Picture

IR频道

IR Channel

灰尘和划痕面具

The Mask

我想自动删除

To be removed

我认为在没有用户干预的情况下无法移除

To be removed manually

您还可以下载原始TIFF文件here。它包含两个alpha通道。一个是原始的红外通道,另一个是已准备好除尘的红外通道。

3 个答案:

答案 0 :(得分:1)

我已尝试过这个,并且可以通过某种方式实现您的一些目标...我可以读取您的16位图像,使用IR通道数据检测灰尘像素,并替换它们,以及写出没有任何alpha通道的结果,同时保留你的16位数据。

缺少的部分是替换算法 - 我刚从上面传播了下一个像素。 Stack Overflow上你或者比我聪明的人可能能够实现更好的算法,但这可能是一个开始。

它在Perl中,但我想它可以很容易地转换成另一种语言。这是代码:

#!/usr/bin/perl
use strict;
use warnings;
use Image::Magick;

# Open the input image
my $image = Image::Magick->new;
$image->ReadImage("pa.tiff");
my $v=0;
# Get its width and height
my ($width,$height)=$image->Get('width','height');

# Create output image of matching size
my $out= $image->Clone();

# Remove alpha channel from output image
$out->Set(alpha=>'off');

# Load Red, Green, Blue and Alpha channels of input image into arrays, values normalised to 1.0
my (@R,@G,@B,@A);
for my $y (0..($height-1)){
   my $j=0;
   my @RGBA=$image->GetPixels(map=>'RGBA',height=>1,width=>$width,x=>0,y=>$y,normalize=>1);
   for my $x (0..($width-1)){
      $R[$x][$y]=$RGBA[$j++];
      $G[$x][$y]=$RGBA[$j++];
      $B[$x][$y]=$RGBA[$j++];
      $A[$x][$y]=$RGBA[$j++];
   }
}

# Now process image
my ($d,$r,$s,@colours);
for my $y (0..($height-1)){
   for my $x (0..($width-1)){
      # See if IR channel says this is dust, and if so, replace with pixel above
      if($A[$x][$y]<0.01){
         $colours[0]=$R[$x][$y-1];
         $colours[1]=$G[$x][$y-1];
         $colours[2]=$B[$x][$y-1];
         $R[$x][$y]=$R[$x][$y-1];
         $G[$x][$y]=$G[$x][$y-1];
         $B[$x][$y]=$B[$x][$y-1];
         $out->SetPixel(x=>$x,y=>$y,color=>\@colours);
      }
   }
}

$out->write(filename=>'out.tif',compression=>'lzw');

结果看起来像这样,但我必须使它只是为了适合SO:

enter image description here

答案 1 :(得分:1)

我无法评论,所以我写了一个答案。

我建议使用G'Mic和过滤器“inpaint”。

您应该加载图像,拍摄红外图像并将其转换为黑白,然后告诉滤镜使用填充红外图像中标记的区域。

答案 2 :(得分:0)

OpenCV有一个很好的算法可以消除图像,这基本上就是您要搜索的算法。 https://docs.opencv.org/3.3.1/df/d3d/tutorial_py_inpainting.html

如果那没有帮助,那么只有神经网络算法