【问题标题】:Using Image::Magick to split an image into smaller chunks and get relative position of each chunk使用 Image::Magick 将图像分割成更小的块并获取每个块的相对位置
【发布时间】:2014-09-23 03:16:30
【问题描述】:

我需要将一个大的(最大为 16384x16384 像素)图像分割成更小的块,通常是 512x512。为此,我使用下面的简单 perl 脚本:

#!/usr/bin/perl
use warnings;
use strict;

my $size = '512x512';

unless ($ARGV[0]) { die "Missing filename as arg" }
unless (-e $ARGV[0]) { die "$ARGV[0] not found.\n" }
my ($newfile, undef) = split(/\./,$ARGV[0]);

system("convert $ARGV[0] -crop $size $newfile" . "_%03d.png");

现在,问题是,我需要建立一个包含原始图像中位置偏移的较小片段的索引,例如在 1024x1024 源图像的情况下:

image_000.png    0,0
image_001.png    512,0
image_002.png    0,512 
image_003.png    512,512

...或类似的东西。基本上,只是为了跟踪每个特定块在原始图像中的位置。

自从convert 命令传递给system() 以来,我一直在考虑只对文件进行全局处理并对其进行排序,因为一些快速实验表明,较小的块按从左到右、从上到下的顺序编号(直观地)并基于此构建索引,但我认为必须有一些更简单的涉及perls own interface to ImageMagick


那么我的问题是:

1.什么是Image::Magick 相当于convert $ARGV[0] -crop $size $newfile" . "_%03d.png

2.一旦我设法避免了 system() 调用,是否可以根据来自 $image 对象的数据构建索引?

PS:

  • 块大小不会经常变化。硬编码 512 很好,所以没有必要从$size 中提取它...事实上,我根本不知道我为什么选择使用那个变量。
  • 原始图像大小始终可以被块大小整除,因此无需担心剩余部分。
  • 为了使 glob() 方法变得棘手,图像并不总是方形的。也许可以以某种方式考虑使用identify 命令的第三列?

【问题讨论】:

    标签: perl imagemagick perlmagick


    【解决方案1】:

    我用我知道的唯一方法解决了这个问题:拧 perlmagic,然后通过命令行来解决。以下脚本适用于矩形和方形图像。索引打印到屏幕上。

    use warnings;
    use strict;
    
    my $size = '512x512';
    my $offset = 512;
    
    unless ($ARGV[0]) { die "Missing filename as arg" }
    unless (-e $ARGV[0]) { die "$ARGV[0] not found.\n" }
    
    my ($newfile, undef) = split(/\./,$ARGV[0]);
    system("convert $ARGV[0] -crop $size $newfile" . "_%03d.png");
    
    my @files = glob($newfile . "_*");
    @files = sort(@files);
    
    my (undef, undef, $origsize) = split(/\s+/,`identify $ARGV[0]`);
    my ($maxX, $maxY) = split(/x/,$origsize);
    
    $maxX /= $offset;
    $maxY /= $offset;
    
    my $x = 0;
    my $y = 0;
    foreach my $file (@files)
    {
            print "$file\t" . $x * $offset . "\t" . $y * $offset . "\n";
            $x++;
    
            if ($x >= $maxX)
            {
                    $x = 0;
                    $y++;
            }
    }
    
    
    __END__
    

    【讨论】:

      猜你喜欢
      • 2020-02-05
      • 2017-05-24
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-30
      • 2014-04-11
      • 1970-01-01
      相关资源
      最近更新 更多