
    1-Ph '                     t    d dl Zd dlmZ ddlmZ ddlmZm	Z	m
Z
 ddlmZmZ ddlmZ d ZddZ	 	 	 	 ddZdS )    N)ndimage   )_supported_float_type)dilationerosionfootprint_rectangle)img_as_floatview_as_windows)gray2rgbc                 r   | j         }t          j        | j                  j        }t          j        d | j        D             | j                  }t          ddd          f|z  }| ||<   t          j        |j        t                    }d||<   |||<   t          t          j        |dd          d	|z            }t          j        |          }t          j        |j                  D ]N}||         rDt          j        ||                                                   }	t!          |	          dk    rd
||<   O|S )a#  See ``find_boundaries(..., mode='subpixel')``.

    Notes
    -----
    This function puts in an empty row and column between each *actual*
    row and column of the image, for a corresponding shape of ``2s - 1``
    for every image dimension of size ``s``. These "interstitial" rows
    and columns are filled as ``True`` if they separate two labels in
    `label_img`, ``False`` otherwise.

    I used ``view_as_windows`` to get the neighborhood of each pixel.
    Then I check whether there are two labels or more in that
    neighborhood.
    c                     g | ]
}d |z  dz
  S r       .0ss     _/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/skimage/segmentation/boundaries.py
<listcomp>z-_find_boundaries_subpixel.<locals>.<listcomp>   s     ...!a%!)...    Nr   )dtypeFr   edgemode)   T)ndimnpiinfor   maxzerosshapesliceonesboolr
   pad
zeros_likendindexuniqueravellen)
	label_imgr   	max_labellabel_img_expandedpixelsedgeswindows
boundariesindexvaluess
             r   _find_boundaries_subpixelr4   
   s7    >D))-I..io...	  D$""$t+F!*vG&,D999EE&M )ubf%7HHH$QU+VVGu%%J.455 ) )< 	)Ywu~335566F6{{Q$(
5!r   r   thickc                 8   | j         dk    r|                     t          j                  } | j        }t          j        ||          }|dk    rt          | |          t          | |          k    }|dk    r| |k    }||z  }n|dk    rt          j	        | j                   j
        }| |k    }	t          j        ||          }t          j        | d          }
||
|	<   t          | |          t          |
|          k    |	 z  }||	|z  z  }|S t          |           }|S )a#  Return bool array where boundaries between labeled regions are True.

    Parameters
    ----------
    label_img : array of int or bool
        An array in which different regions are labeled with either different
        integers or boolean values.
    connectivity : int in {1, ..., `label_img.ndim`}, optional
        A pixel is considered a boundary pixel if any of its neighbors
        has a different label. `connectivity` controls which pixels are
        considered neighbors. A connectivity of 1 (default) means
        pixels sharing an edge (in 2D) or a face (in 3D) will be
        considered neighbors. A connectivity of `label_img.ndim` means
        pixels sharing a corner will be considered neighbors.
    mode : string in {'thick', 'inner', 'outer', 'subpixel'}
        How to mark the boundaries:

        - thick: any pixel not completely surrounded by pixels of the
          same label (defined by `connectivity`) is marked as a boundary.
          This results in boundaries that are 2 pixels thick.
        - inner: outline the pixels *just inside* of objects, leaving
          background pixels untouched.
        - outer: outline pixels in the background around object
          boundaries. When two objects touch, their boundary is also
          marked.
        - subpixel: return a doubled image, with pixels *between* the
          original pixels marked as boundary where appropriate.
    background : int, optional
        For modes 'inner' and 'outer', a definition of a background
        label is required. See `mode` for descriptions of these two.

    Returns
    -------
    boundaries : array of bool, same shape as `label_img`
        A bool image where ``True`` represents a boundary pixel. For
        `mode` equal to 'subpixel', ``boundaries.shape[i]`` is equal
        to ``2 * label_img.shape[i] - 1`` for all ``i`` (a pixel is
        inserted in between all other pairs of pixels).

    Examples
    --------
    >>> labels = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    ...                    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    ...                    [0, 0, 0, 0, 0, 5, 5, 5, 0, 0],
    ...                    [0, 0, 1, 1, 1, 5, 5, 5, 0, 0],
    ...                    [0, 0, 1, 1, 1, 5, 5, 5, 0, 0],
    ...                    [0, 0, 1, 1, 1, 5, 5, 5, 0, 0],
    ...                    [0, 0, 0, 0, 0, 5, 5, 5, 0, 0],
    ...                    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    ...                    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=np.uint8)
    >>> find_boundaries(labels, mode='thick').astype(np.uint8)
    array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
           [0, 0, 1, 1, 1, 1, 1, 1, 1, 0],
           [0, 1, 1, 1, 1, 1, 0, 1, 1, 0],
           [0, 1, 1, 0, 1, 1, 0, 1, 1, 0],
           [0, 1, 1, 1, 1, 1, 0, 1, 1, 0],
           [0, 0, 1, 1, 1, 1, 1, 1, 1, 0],
           [0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
    >>> find_boundaries(labels, mode='inner').astype(np.uint8)
    array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
           [0, 0, 1, 1, 1, 1, 0, 1, 0, 0],
           [0, 0, 1, 0, 1, 1, 0, 1, 0, 0],
           [0, 0, 1, 1, 1, 1, 0, 1, 0, 0],
           [0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
    >>> find_boundaries(labels, mode='outer').astype(np.uint8)
    array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
           [0, 0, 1, 1, 1, 1, 0, 0, 1, 0],
           [0, 1, 0, 0, 1, 1, 0, 0, 1, 0],
           [0, 1, 0, 0, 1, 1, 0, 0, 1, 0],
           [0, 1, 0, 0, 1, 1, 0, 0, 1, 0],
           [0, 0, 1, 1, 1, 1, 0, 0, 1, 0],
           [0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
    >>> labels_small = labels[::2, ::3]
    >>> labels_small
    array([[0, 0, 0, 0],
           [0, 0, 5, 0],
           [0, 1, 5, 0],
           [0, 0, 5, 0],
           [0, 0, 0, 0]], dtype=uint8)
    >>> find_boundaries(labels_small, mode='subpixel').astype(np.uint8)
    array([[0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 1, 1, 1, 0],
           [0, 0, 0, 1, 0, 1, 0],
           [0, 1, 1, 1, 0, 1, 0],
           [0, 1, 0, 1, 0, 1, 0],
           [0, 1, 1, 1, 0, 1, 0],
           [0, 0, 0, 1, 0, 1, 0],
           [0, 0, 0, 1, 1, 1, 0],
           [0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
    >>> bool_image = np.array([[False, False, False, False, False],
    ...                        [False, False, False, False, False],
    ...                        [False, False,  True,  True,  True],
    ...                        [False, False,  True,  True,  True],
    ...                        [False, False,  True,  True,  True]],
    ...                       dtype=bool)
    >>> find_boundaries(bool_image)
    array([[False, False, False, False, False],
           [False, False,  True,  True,  True],
           [False,  True,  True,  True,  True],
           [False,  True,  True, False, False],
           [False,  True,  True, False, False]])
    r$   subpixelinnerouterTcopy)r   astyper   uint8r   ndigenerate_binary_structurer   r   r   r   arrayr4   )r+   connectivityr   
backgroundr   	footprintr1   foreground_imager,   background_imageinverted_backgroundadjacent_objectss               r   find_boundariesrH   0   s?   ^ &  $$RX..	>D-dLAAIzi33wy)7T7TT
7??(J6**JJW__115I(J65dDAAI"$(94"@"@"@4= 01I...	::;!! " *-===J.y99
r   r   r   r   r9   c                    t          | j                  }t          | d          }|                    |d          }|j        dk    rt          |          }|dk    r2t          j        |d |j        dd	         D             d
gz   d          }t          |||          }|"t          |t          d                    }	|||	<   |||<   |S )a  Return image with boundaries between labeled regions highlighted.

    Parameters
    ----------
    image : (M, N[, 3]) array
        Grayscale or RGB image.
    label_img : (M, N) array of int
        Label array where regions are marked by different integer values.
    color : length-3 sequence, optional
        RGB color of boundaries in the output image.
    outline_color : length-3 sequence, optional
        RGB color surrounding boundaries in the output image. If None, no
        outline is drawn.
    mode : string in {'thick', 'inner', 'outer', 'subpixel'}, optional
        The mode for finding boundaries.
    background_label : int, optional
        Which label to consider background (this is only useful for
        modes ``inner`` and ``outer``).

    Returns
    -------
    marked : (M, N, 3) array of float
        An image in which the boundaries between labels are
        superimposed on the original image.

    See Also
    --------
    find_boundaries
    T)
force_copyFr:   r   r7   c                     g | ]
}d d|z  z
  S r   r   r   s     r   r   z#mark_boundaries.<locals>.<listcomp>   s     :::1QQY:::r   Nr   mirrorr   )r   rB   )r   r   )r   r   r	   r<   r   r   r>   zoomr!   rH   r   r   )
imager+   coloroutline_colorr   background_labelfloat_dtypemarkedr1   outliness
             r   mark_boundariesrW      s    J (44K%D111F]];U]33F{a&!!z
 ::SbS(9:::aS@x
 
 
 !BRSSSJ J(;F(C(CDD(xF:Mr   )r   r5   r   )rI   Nr9   r   )numpyr   scipyr   r>   _shared.utilsr   
morphologyr   r   r   utilr	   r
   rQ   r   r4   rH   rW   r   r   r   <module>r]      s                    1 1 1 1 1 1 ? ? ? ? ? ? ? ? ? ? 0 0 0 0 0 0 0 0      # # #LF F F FX 	7 7 7 7 7 7r   