The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

Name

Image::Find::Loops - Find loops in an image.

Synopsis

Use new to create and analyze a new image, then print to visualize the loops detected, or loop to get the coordinates of points in each loop in sequential order.

Description

Find loops in an image.

The following sections describe the methods in each functional area of this module. For an alphabetic listing of all methods by name see Index.

Methods

Find loops in an image.

new($)

Find loops in an image represented as a string.

     Parameter  Description
  1  $string    String of blanks; non blanks; new lines defining the image

Example:

  my $d = new (<<END);

       11                       11111111111        11111111111
      1111                      1         1        1         1
     11  11    1111             1   111   1        1         1              1
     11  11    11 11            1   1 1   1        1         1
     11  11    11 11            1   1 1   1        1         1
      1111     11111            1   1 1   1        1         1
       11      1111             1   1 1   1111111111         1                  1
                 1111           1   1 1   1111111111         1            1
                11111           1   1 1   1        1         1
        111111111111111111      1   1 1   1        1         1
        11    1111111111        1   111   1        1         1                1
        1      11111111         1         1        1         1
       11111111111              1         1        1         1
                111             11111111111        11111111111

  END

  ok nws($d->print) eq nws(<<END);
       0         1         2         3         4         5         6         7
       0123456789012345678901234567890123456789012345678901234567890123456789012345678
     0
     1      56                       12345678901        23456789012
     2     3478                      8         2        1         3
     3    12  90    1234             7   432   3        0         4
     4    2    1    09 5             6   5 1   4        9         5
     5    10  32    78 67            5   6 0   5        8         6
     6     9854     63298            4   7 9   6        7         7
     7      76      5410             3   8 8   7890123456         8
     8                0123           2   9 7   0987654321         9
     9               89  4           1   0 6   1        0         0
    10       123412367   5678        0   1 5   2        9         1
    11       0     45      09        9   234   3        8         2
    12       9        654321         8         4        7         3
    13       8765432107              7         5        6         4
    14               98              65432109876        54321098765

  Image: X = 79, Y = 15, Loops = 4
  END

  ok nws($d->printLoop(2)) eq nws(<<END);
           1         2
       678901234567890123

     3        1111
     4        22 1
     5        22 22
     6        22412
     7        1334
     8          3411
     9         11  1
    10 111111111   1111
    11 1     22      22
    12 1        111111
    13 1111111122
    14         21

  Image: X = 79, Y = 15, Loop = 2
  END

  ok nws($d->printLoop(3)) eq nws(<<END);
       3         4         5
       012345678901234567890123456789

     1 11111111111        11111111111
     2 1         1        1         1
     3 1         1        1         1
     4 1         1        1         1
     5 1         1        1         1
     6 1         1        1         1
     7 1         1222222221         1
     8 1         1222222221         1
     9 1         1        1         1
    10 1         1        1         1
    11 1         1        1         1
    12 1         1        1         1
    13 1         1        1         1
    14 11111111111        11111111111

  Image: X = 79, Y = 15, Loop = 3
  END

  ok nws($d->printLoop(4)) eq nws(<<END);
        3         4
       9012345678901

     0
     1
     2
     3      111
     4      1 1
     5      1 1
     6      1 1
     7      1 1
     8      1 1
     9      1 1
    10      1 1
    11      111
    12
    13
    14

  Image: X = 79, Y = 15, Loop = 4
  END

This is a static method and so should be invoked as:

  Image::Find::Loops::new

numberOfLoops($)

Number of loops in the image. The partitions and loops are numbered from 1.

     Parameter  Description
  1  $i         Image

Example:

  is_deeply [$d->count, $d->x, $d->y, $d->numberOfLoops],

  [239,       79,    15,    4];

loop($$)

Return an array of arrays [x, y] of sequentially touching pixels describing the largest loop in the specified partition where the loops in an image are numbered from 1.

     Parameter   Description
  1  $i          Image
  2  $partition  Partition

Example:

  is_deeply [grep{$_->[2] > 2} @{$d->loop(2)}],

  [[15, 8, 3],

  [15, 7, 3],

  [15, 6, 4],

  [14, 7, 3],

  [16, 7, 4],

printLoop($$)

Print a loop in the image numbering pixels with the estimated thickness of the loop.

     Parameter   Description
  1  $i          Image
  2  $partition  Partition

Example:

  ok nws($d->printLoop(2)) eq nws(<<END);
           1         2
       678901234567890123

     3        1111
     4        22 1
     5        22 22
     6        22412
     7        1334
     8          3411
     9         11  1
    10 111111111   1111
    11 1     22      22
    12 1        111111
    13 1111111122
    14         21

  Image: X = 79, Y = 15, Loop = 2
  END

  ok nws($d->printLoop(3)) eq nws(<<END);
       3         4         5
       012345678901234567890123456789

     1 11111111111        11111111111
     2 1         1        1         1
     3 1         1        1         1
     4 1         1        1         1
     5 1         1        1         1
     6 1         1        1         1
     7 1         1222222221         1
     8 1         1222222221         1
     9 1         1        1         1
    10 1         1        1         1
    11 1         1        1         1
    12 1         1        1         1
    13 1         1        1         1
    14 11111111111        11111111111

  Image: X = 79, Y = 15, Loop = 3
  END

  ok nws($d->printLoop(4)) eq nws(<<END);
        3         4
       9012345678901

     0
     1
     2
     3      111
     4      1 1
     5      1 1
     6      1 1
     7      1 1
     8      1 1
     9      1 1
    10      1 1
    11      111
    12
    13
    14

  Image: X = 79, Y = 15, Loop = 4
  END

print($)

Print the loops in an image sequentially numbering adjacent pixels in each loop from 0..9.

     Parameter  Description
  1  $i         Image

Example:

  ok nws($d->print) eq nws(<<END);
       0         1         2         3         4         5         6         7
       0123456789012345678901234567890123456789012345678901234567890123456789012345678
     0
     1      56                       12345678901        23456789012
     2     3478                      8         2        1         3
     3    12  90    1234             7   432   3        0         4
     4    2    1    09 5             6   5 1   4        9         5
     5    10  32    78 67            5   6 0   5        8         6
     6     9854     63298            4   7 9   6        7         7
     7      76      5410             3   8 8   7890123456         8
     8                0123           2   9 7   0987654321         9
     9               89  4           1   0 6   1        0         0
    10       123412367   5678        0   1 5   2        9         1
    11       0     45      09        9   234   3        8         2
    12       9        654321         8         4        7         3
    13       8765432107              7         5        6         4
    14               98              65432109876        54321098765

  Image: X = 79, Y = 15, Loops = 4
  END

Attributes

Attributes of an image

bounds :lvalue

The bounds of each partition: [$x1, $y1, $x2, $y2].

count :lvalue

Number of points in the image.

image :lvalue

Image data points.

partitions :lvalue

Number of partitions in the image.

partitionLoop :lvalue

Loop for each partition.

x :lvalue

Image dimension in x.

y :lvalue

Image dimension in y.

Private Methods

fillPartition($$)

Remove any interior voids in a partition.

     Parameter   Description
  1  $i          Image
  2  $partition  Partition

clone($)

Clone an image.

     Parameter  Description
  1  $i         Image

Example:

  is_deeply $d, $d->clone;

clonePartition($$)

Clone a partition of an image.

     Parameter   Description
  1  $i          Image
  2  $partition  Partition

partitionImage($$)

Partition the images into disjoint sets of connected points.

     Parameter  Description
  1  $i         Image
  2  $small     Minimum size of a partition - smaller partitions will be ignored

mapPartition($$$$)

Locate the pixels in the image that are connected to a pixel with a specified value.

     Parameter  Description
  1  $i         Image
  2  $x         X coordinate of first point in partition
  3  $y         Y coordinate of first point in partition
  4  $small     Delete partitions of fewer pixels

removeInteriorOfPartition($$)

Remove the interior of a partition to leave the exterior loop.

     Parameter   Description
  1  $I          Image
  2  $partition  Partition

findLongestLoop($$)

Find the longest loop in a partition.

     Parameter   Description
  1  $I          Image
  2  $partition  Partition

searchArea($$$$)

Return the pixels to search from around a given pixel.

     Parameter   Description
  1  $i          Image
  2  $partition  Partition
  3  $x          X coordinate of center of search
  4  $y          Y coordinate of center of search.

widthOfLoop($$)

Find the (estimated) width of the loop at each point.

     Parameter   Description
  1  $I          Image
  2  $partition  Partition

Index

1 bounds

2 clone

3 clonePartition

4 count

5 fillPartition

6 findLongestLoop

7 image

8 loop

9 mapPartition

10 new

11 numberOfLoops

12 partitionImage

13 partitionLoop

14 partitions

15 print

16 printLoop

17 removeInteriorOfPartition

18 searchArea

19 widthOfLoop

20 x

21 y

Installation

This module is written in 100% Pure Perl and, thus, it is easy to read, use, modify and install.

Standard Module::Build process for building and installing modules:

  perl Build.PL
  ./Build
  ./Build test
  ./Build install

Author

philiprbrenan@gmail.com

http://www.appaapps.com

Copyright

Copyright (c) 2016-2018 Philip R Brenan.

This module is free software. It may be used, redistributed and/or modified under the same terms as Perl itself.