ret*_*phy 5 opencv image imagemagick image-processing
我正在尝试自动化大量扫描胶片的清理过程。我拥有 48 位 RGBI TIFF 文件(RGB + 红外)中的所有图像,并且我可以使用红外通道创建用于除尘的蒙版。我想知道是否有任何不错的开源修复实现可以用来实现这一目标(我用于批处理的所有其他软件都是我通过 Ruby 接口访问的开源库)。
我的第一个选择是 ImageMagick,但我在其中找不到任何高级的绘画选项(不过,也许我错了)。我听说这可以用 MagickWand 库来完成,但我还没有找到具体的例子。
我也看过 OpenCV,但似乎OpenCV 的 in-paint 方法只接受每通道 8 位图像,而我必须保留 16 位。有没有其他库,甚至是一个有趣的代码片段不知道吗?任何帮助表示赞赏。
样品:
完整的图片

红外通道

防尘防刮面罩

我想要自动删除的内容

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

您还可以在此处下载原始 TIFF 文件。它包含两个 Alpha 通道。一个是原来的红外通道,另一个是已经准备好除尘的红外通道。
我已经尝试过,并且可以通过某种方式实现您的一些目标...我可以读入您的 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 才能适合:
