Imagerで小ネギの画像を2値化する

前回は「しめじ」の統計を取ったんだけど、
2値化した時点でアレだったので、「小ネギ」でやり直そうと思う。

まず、用意した画像を0.25倍する。(*1)(*2)
20140727-1

次に、統計を取る。
$ perl aaa.pl 20140727-1.jpg
w = 1000, h = 750
==== Hue ====
0:
1:
2: *
3: *
4:
5: *
6: ********************
7:
8:
9:
==== Sat ====
0: ********************
1:
2:
3:
4:
5:
6:
7:
8:
9:
==== Value ====
0:
1: *
2:
3:
4:
5:
6:
7:
8: *
9: ********************
==== Time ====
2.63sec
sum = 750000

これだけ見ると、どれを使っても2値化できそうだけど、
小ネギの暗いところは彩度が低いのと、
光沢が存在するので明るさをしきい値にするとしても気を使う必要がある。

use v5.14;
use strict;
use warnings;
use Imager;

if ( (not @ARGV) or (not -e $ARGV[0]) ) {
    say "Usage:
    perl $0 file_path";
    exit( 0 );
}

my $img_src = Imager->new( file => $ARGV[0] )
    or die Imager->errstr();
say 'w = ', $img_src->getwidth(), ', h = ', $img_src->getheight();

$img_src->filter( type => "gaussian", stddev => .5 )
    or die $img_src->errstr;
$img_src->write( file => $0 . '_gaussian.jpg' );

my $img_dst = Imager::transform2( {
    channels => 1,
    constants => { vv => 0.7 },
    rpnexpr => 'x y getp1 !pix @pix value vv lt 255 255 255 rgb 0 0 0 rgb ifp'
}, $img_src );

$img_dst or die $Imager::ERRSTR;
$img_dst->write( file => $0 . '.png' );

境界が滑らかになるようにフィルタを掛けて、
明るさが0.7未満のところをR:255,G:255,B:255にして、
その他をR:0,G:0,B:0にするとこうなる。
20140727-2

次回はラベリングかなー、なんて。

おしまい。

(*1) きれいに拭いたiPadに乗せて撮影
(*2) このあとスタッフが美味しく頂きました

Leave a Comment