我正在尝试自动化大量扫描胶片的清理过程。我有48位RGBI TIFF文件(RGB +红外)中的所有图像,我可以使用红外通道创建除尘功能。我想知道是否有任何体面的开源实现可以用来实现这一点(我用于批量处理的所有其他软件都是我通过Ruby接口访问的开源库)。
我的第一个选择是ImageMagick,但我在其中找不到任何高级绘画选项(可能我错了)。我听说过这可以用MagickWand库完成,但我还没有找到具体的例子。
我也看过OpenCV,但似乎OpenCV's in-paint method只接受每通道8位的图像,而我必须保留16。 有没有其他的库,甚至是一个我不知道的有趣的代码片段?任何帮助表示赞赏。
样品:
完整图片
IR频道
灰尘和划痕面具
我想自动删除
我认为在没有用户干预的情况下无法移除
您还可以下载原始TIFF文件here。它包含两个alpha通道。一个是原始的红外通道,另一个是已准备好除尘的红外通道。
答案 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:
答案 1 :(得分:1)
我无法评论,所以我写了一个答案。
我建议使用G'Mic和过滤器“inpaint”。
您应该加载图像,拍摄红外图像并将其转换为黑白,然后告诉滤镜使用填充红外图像中标记的区域。
答案 2 :(得分:0)
OpenCV有一个很好的算法可以消除图像,这基本上就是您要搜索的算法。 https://docs.opencv.org/3.3.1/df/d3d/tutorial_py_inpainting.html
如果那没有帮助,那么只有神经网络算法