Ë
     \;j(  ã                   ór   — 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y)é    N)Úndimageé   )Ú_supported_float_type)ÚdilationÚerosionÚfootprint_rectangle)Úimg_as_floatÚview_as_windows)Úgray2rgbc                 ó¼  — | j                   }t        j                  | j                  «      j                  }t        j
                  | j                  D �cg c]
  }d|z  dz
  ‘Œ c}| 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 ]B  }	||	   sŒ	t        j                  ||	   j                  «       «      }
t!        |
«      dkD  sŒ>d	||	<   ŒD |S c c}w )
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.
    r   é   N)ÚdtypeFÚedge©Úmode)é   T)ÚndimÚnpÚiinfor   ÚmaxÚzerosÚshapeÚsliceÚonesÚboolr
   ÚpadÚ
zeros_likeÚndindexÚuniqueÚravelÚlen)Ú	label_imgr   Ú	max_labelÚsÚlabel_img_expandedÚpixelsÚedgesÚwindowsÚ
boundariesÚindexÚvaluess              úhG:\00. PROJECTS\API\Inventory\templateJSON\kerjaOCR\Lib\site-packages\skimage/segmentation/boundaries.pyÚ_find_boundaries_subpixelr-   
   s1  € ð �>‰>€DÜ—‘˜Ÿ™Ó)×-Ñ-€IäŸ™Ø'ŸošoÓ.™o˜ˆ!ˆa‰%�!‹)˜oÑ.°	·±óÐô �D˜$ Ó"Ð$ tÑ+€FØ!*Ð�vÑä�G‰GÐ&×,Ñ,´DÔ9€EØ€Eˆ&�MØ )Ð�uÑÜœbŸf™fÐ%7¸ÀÔHÈ$ÐQUÉ+ÓV€Gä—‘˜uÓ%€JÜ—‘Ð.×4Ñ4Ö5ˆØ�‹<Ü—Y‘Y˜w u™~×3Ñ3Ó5Ó6ˆFÜ�6‹{˜Q‹Ø$(�
˜5Ò!ð	 6ð
 Ðùò! 	/s   ÁEc                 ó2  — | j                   dk(  r| j                  t        j                  «      } | j                  }t        j                  ||«      }|dk7  r¶t        | |«      t        | |«      k7  }|dk(  r| |k7  }||z  }|S |dk(  r…t        j                  | j                   «      j                  }| |k(  }	t        j                  ||«      }t        j                  | d¬«      }
||
|	<   t        | |«      t        |
|«      k7  |	 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   Úarrayr-   )r"   Úconnectivityr   Ú
backgroundr   Ú	footprintr)   Úforeground_imager#   Úbackground_imageÚinverted_backgroundÚadjacent_objectss               r,   Úfind_boundariesr@   0   s1  € ð^ ‡�˜&Ò Ø×$Ñ$¤R§X¡XÓ.ˆ	Ø�>‰>€DÜ×-Ñ-¨d°LÓA€IØˆzÒÜ˜i¨Ó3´w¸yÈ)Ó7TÑTˆ
Ø�7Š?Ø(¨JÑ6ÐØÐ*Ñ*ˆJð Ðð �WŠ_ÜŸ™ §¡Ó1×5Ñ5ˆIØ(¨JÑ6ÐÜ×5Ñ5°d¸DÓAˆIÜ"$§(¡(¨9¸4Ô"@ÐØ4=ÐÐ 0Ñ1ä˜ IÓ.ÜÐ.°	Ó:ñ;à!Ð!ñ "Ðð Ð*Ð-=Ñ=Ñ=ˆJØÐä.¨yÓ9ˆ
ØÐó    c           	      ó�  — t        | j                  «      }t        | d¬«      }|j                  |d¬«      }|j                  dk(  rt        |«      }|dk(  r=t        j                  ||j                  dd D �cg c]
  }dd	|z  z
  ‘Œ c}d	gz   d
¬«      }t        |||¬«      }	|�t        |	t        d«      «      }
|||
<   |||	<   |S c c}w )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_copyFr2   r   r/   Néÿÿÿÿr   Úmirrorr   )r   r:   )r   r   )r   r   r	   r4   r   r   r6   Úzoomr   r@   r   r   )Úimager"   ÚcolorÚoutline_colorr   Úbackground_labelÚfloat_dtypeÚmarkedr$   r)   Úoutliness              r,   Úmark_boundariesrN   ¹   sØ   € ôJ (¨¯©Ó4€KÜ˜%¨DÔ1€FØ�]‰]˜;¨Uˆ]Ó3€FØ‡{�{�aÒÜ˜&Ó!ˆØˆzÒô
 —‘Ø¨¯©°S°bÑ(9Ó:Ñ(9 1�Q˜˜Q™“YÐ(9Ñ:¸a¸SÑ@Àxô
ˆô ! °ÐBRÔS€JØÐ Ü˜JÔ(;¸FÓ(CÓDˆØ(ˆˆxÑØ€Fˆ:ÑØ€Mùò ;s   Á6C
)r   Úthickr   ))r   r   r   Nr1   r   )Únumpyr   Úscipyr   r6   Ú_shared.utilsr   Ú
morphologyr   r   r   Úutilr	   r
   rH   r   r-   r@   rN   © rA   r,   Ú<module>rV      s:   ðÛ Ý  å 1ß ?Ñ ?ß 0Ý ò#óLFðX ØØ	Øô7rA   