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

ret*_*phy 5 opencv image imagemagick image-processing

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

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

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

样品:

完整的图片

完整的图片

红外通道

红外通道

防尘防刮面罩

面具

我想要自动删除的内容

即将被删除

我认为太大而无法在没有用户干预的情况下删除的内容

需要手动删除

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

Mar*_*ell 2

我已经尝试过,并且可以通过某种方式实现您的一些目标...我可以读入您的 16 位图像,使用红外通道数据检测灰尘像素,然后替换它们,并写出结果无需任何 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');
Run Code Online (Sandbox Code Playgroud)

结果看起来像这样,但我必须将其设为 JPEG 才能适合:

在此输入图像描述