LINUX.ORG.RU

Считывание графика с картинки


0

0

Привет всем!

Меня товарищ спросил, есть какой-нибудь тул в эхотаге, который позволяет на картинку с отсканенным научным графиком (X,Y) наложить сетку, определить положение точек и записать в файл. Случаются тут научные работники? :)

Спасибо огромное!


проще заново график построить, сняв данные с имеющегося

anonymous
()

на перле это можно сделать так(замена точки с цветом аналогична определению координат точки):

#!/usr/bin/perl -w

use strict;
use Image::Size;
use GD;

my @massiv;
my $img="karta.png";
my ($w, $h) = imgsize($img);

#считали картинку
&massiv();

# определяем новое изображение
my $im = new GD::Image($w,$h);

# определяем цвета
my $black = $im->colorAllocate(0,0,0);
my $white = $im->colorAllocate(255,255,255);
# делаем заливку
$im->fill(50,50,$white);
# заменяем цвет, если в этом есть необходимость
&zamena();

# пишем новое изображение
open F, ">/var/www/html/gr/file.png"
  or die "cant write new image: $!";
binmode F;
print F $im->png;
close F;

#если необходимо заменить какой-либо цвет
sub zamena{
  foreach my $i(0 .. $w){
    foreach my $k(0 .. $h){
      $im->setPixel($i,$k,$black) if $massiv[$i][$k]==0;
    }
  }
}

# считывание цветов пикселей картинки в массив
sub massiv{
  #считываем изображение
  my $source_img = newFromPng GD::Image($img);
  foreach my $i(0 .. $w){
    foreach my $k(0 .. $h){
      my $index = $source_img->getPixel($i,$k);
      # считываем палитру цветов RGB
      # поскольку для простоты примера нас 
      # интересует только черно-белое изображение
      # считываем только один цвет
      my ($r,undef,undef) = $source_img->rgb($index);
      $r ? do{$massiv[$i][$k] = 1} : do{$massiv[$i][$k] = 0};
    }
  }
}

При помощи ImageMagick:

#!/usr/bin/perl -w

use strict;
use Image::Magick;
use Image::Size;

my $img="/var/www/html/gr/karta.png";
my ($image, $x, @massiv);
my ($w, $h) = imgsize($img);

$image = Image::Magick->new;

#считали картинку
$x = $image->Read($img);
warn "$x" if "$x";
print "Readed\n";

#занесли данные о цветах пикселей картинки в массив
&massiv();

# заменяем цвет, если в этом есть необходимость
&zamena();

# записали изменения в ту же картинку
$x = $image->Write($img);
warn "$x" if "$x";

#если необходимо заменить какой-либо цвет
sub zamena{
  foreach my $i(0 .. $w){
    foreach my $k(0 .. $h){
      $x = $image->Set("pixel[$i,$k]", '#d2691e')
        if $massiv[$i][$k]==0;
    }
  }
}

# считывание цветов пикселей картинки в массив
sub massiv{
  foreach my $i(0 .. $w){
    foreach my $k(0 .. $h){
      # опять цвет по одному параметру
      ${[split m!,! => $image->Get("pixel[$i,$k]")]}[0]
        ? do{$massiv[$i][$k] = 0} : do{$massiv[$i][$k] = 1};
    }
  }
}

vilfred ☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.