[GRASS-dev] [GRASS GIS] #3892: i.superpixels.slic: if kmeans converges, result should be one superpixel, not NULL

#3892: i.superpixels.slic: if kmeans converges, result should be one superpixel,
not NULL
-------------------------------------------------+-------------------------
Reporter: mlennert | Owner: grass-dev@…
     Type: defect | Status: new
Priority: normal | Milestone:
Component: Addons | Version: unspecified
Keywords: i.superpixels.slic convergence | CPU: Unspecified
  color |
Platform: Unspecified |
-------------------------------------------------+-------------------------
In an automated script in which I run i.superpixels.slic, I sometimes have
the situation that the zone I run the latter on is very small and very
homogeneous leading to a convergence within the very first iteration of
the kmeans in i.superpixels.slic (given the automatically determined
parameter settings). I am ok with the entire area being considered as one
single superpixel and would thus expect i.superpixels to label all pixels
with 1. However, it labels all pixels with NULL. Is there any reason not
to label a single superpixel ?

Somewhat as a side note, i.superpixels.slic crashes in that situation
because of the color definition call in main.c (lines 707+708):

{{{
             Rast_make_random_colors(&colors, 1, numlabels);
             Rast_write_colors(outname, G_mapset(), &colors);
}}}

This can be easily solved by wrapping these calls into a check:

{{{
     if (numlabels > 1) {
             Rast_make_random_colors(&colors, 1, numlabels);
             Rast_write_colors(outname, G_mapset(), &colors);
     }
}}}.

--
Ticket URL: <https://trac.osgeo.org/grass/ticket/3892&gt;
GRASS GIS <https://grass.osgeo.org>

#3892: i.superpixels.slic: if kmeans converges, result should be one superpixel,
not NULL
-------------------------+-------------------------------------------------
  Reporter: mlennert | Owner: grass-dev@…
      Type: defect | Status: new
  Priority: normal | Milestone:
Component: Addons | Version: unspecified
Resolution: | Keywords: i.superpixels.slic convergence
       CPU: | color
  Unspecified | Platform: Unspecified
-------------------------+-------------------------------------------------

Comment (by mmetz):

Replying to [ticket:3892 mlennert]:
> In an automated script in which I run i.superpixels.slic, I sometimes
have the situation that the zone I run the latter on is very small and
very homogeneous leading to a convergence within the very first iteration
of the kmeans in i.superpixels.slic (given the automatically determined
parameter settings). I am ok with the entire area being considered as one
single superpixel and would thus expect i.superpixels to label all pixels
with 1. However, it labels all pixels with NULL. Is there any reason not
to label a single superpixel ?

Homogeneous input has been fixed in a01f12c5, including your fix for color
definitions.

Note that in case of homogeneous input, i.superpixels.slic will produce as
many superpixels as there are seeds, not only one superpixel, because the
distance to a superpixel center is considered together with spectral
similarity.
>
> Somewhat as a side note, i.superpixels.slic crashes in that situation
because of the color definition call in main.c (lines 707+708):
>
> {{{
> Rast_make_random_colors(&colors, 1, numlabels);
> Rast_write_colors(outname, G_mapset(), &colors);
> }}}
>
> This can be easily solved by wrapping these calls into a check:
>
> {{{
> if (numlabels > 1) {
> Rast_make_random_colors(&colors, 1, numlabels);
> Rast_write_colors(outname, G_mapset(), &colors);
> }
> }}}.

--
Ticket URL: <https://trac.osgeo.org/grass/ticket/3892#comment:1&gt;
GRASS GIS <https://grass.osgeo.org>