a
    ¤Â=bØ5  ã                   @   sÒ   d Z ddlZddlmZ ddlmZmZ ddlm	Z	 ddl
mZmZmZmZ dd	lmZ dd
lmZmZmZmZmZ ddlmZmZ ddlmZ ddlmZ ddgZdd„ ZG dd„ dej ƒZ!G dd„ de!ƒZ"dS )z<
ImageViewer class for viewing and interacting with images.
é    Né   )Úio)Údtype_rangeÚimg_as_float)Úrescale_intensityé   )Ú	QtWidgetsÚQtGuiÚQtÚSignal)ÚSlider)ÚdialogsÚ
init_qtappÚfigimageÚstart_qtappÚupdate_axes_image)ÚBlitManagerÚEventManager)ÚPlugin)ÚwarnÚImageViewerÚCollectionViewerc                 C   sr   |   ¡ }|jdkr>| jj| jjf}t||d}|  t|ƒ¡}n,|jdkrj|jd dkrjt	 
|t	 |¡f¡}t|ƒS )a¶  Return RGB image from the given matplotlib image object.

    Each image in a matplotlib figure has its own colormap and normalization
    function. Return RGBA (RGB + alpha channel) image with float dtype.

    Parameters
    ----------
    mpl_image : matplotlib.image.AxesImage object
        The image being converted.

    Returns
    -------
    img : array of float, shape (M, N, 4)
        An image of float values in [0, 1].
    r   )Zin_ranger   )Z	get_arrayÚndimZnormZvminZvmaxr   Zcmapr   ÚshapeÚnpZdstackÚ	ones_like)Z	mpl_imageÚimageZinput_range© r   ú:lib/python3.9/site-packages/skimage/viewer/viewers/core.pyÚmpl_image_to_rgba   s    
r   c                       sò   e Zd ZdZejejejejdœZ	e
ejƒZd.‡ fdd„	Zdd„ Zd/d	d
„Zd0dd„Zdd„ Zdd„ Zd1dd„Zdd„ Zd2‡ fdd„	Zd3dd„Zdd„ Zedd„ ƒZejdd„ ƒZd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Z d*d+„ Z!d,d-„ Z"‡  Z#S )4r   a,  Viewer for displaying images.

    This viewer is a simple container object that holds a Matplotlib axes
    for showing images. `ImageViewer` doesn't subclass the Matplotlib axes (or
    figure) because of the high probability of name collisions.

    Subclasses and plugins will likely extend the `update_image` method to add
    custom overlays or filter the displayed image.

    Parameters
    ----------
    image : array
        Image being viewed.

    Attributes
    ----------
    canvas, fig, ax : Matplotlib canvas, figure, and axes
        Matplotlib canvas, figure, and axes used to display image.
    image : array
        Image being viewed. Setting this value will update the displayed frame.
    original_image : array
        Plugins typically operate on (but don't change) the *original* image.
    plugins : list
        List of attached plugins.

    Examples
    --------
    >>> from skimage import data
    >>> image = data.coins()
    >>> viewer = ImageViewer(image) # doctest: +SKIP
    >>> viewer.show()               # doctest: +SKIP

    )ÚtopZbottomÚleftÚrightTc                    sÒ  t dtdd tƒ  tt| ƒ ¡  |  tj¡ |  	d¡ t
 d| ¡| _| j d| jtjtj ¡ | j d| jtjtj ¡ | j d| jtjtj ¡ |  ¡  | j¡ t
 ¡ | _|  | j¡ t|tƒrê|}|j}|j | j¡ |j  | j!¡ t"|ƒ\| _#| _$| j#j%| _%| j% &| ¡ | j$j'd	d
 g | _(|| _)|r<t*| j$ƒ| _+t,| j$ƒ| _-| j$j.d | _/|  |¡ g | _0t
 1| j¡| _2| j2 3| j%¡ |  4¡ }|j5| _6| 7¡ }| j% 7¡ }|  8| 9¡ | :¡ | :¡  ¡ |  ;d| j<¡ d S )Nz‘`viewer` is deprecated and will be removed in 0.20. For alternatives, refer to https://scikit-image.org/docs/stable/user_guide/visualization.htmlr   ©Ú
stacklevelzImage Viewerz&Filez	Open filezSave to fileZQuitF)Úenabler   Zmotion_notify_event)=r   ÚFutureWarningr   Úsuperr   Ú__init__ZsetAttributer
   ZWA_DeleteOnCloseÚsetWindowTitler   ZQMenuZ	file_menuZ	addActionÚ	open_fileZCTRLZKey_OÚsave_to_fileZKey_SÚcloseZKey_QZmenuBarZaddMenuZQWidgetZmain_widgetZsetCentralWidgetÚ
isinstancer   Zfiltered_imageZimage_changedÚconnectÚ_update_original_imageZ_startedÚ_showr   ZfigÚaxÚcanvasZ	setParentZ	autoscaleÚ_toolsÚuseblitr   Ú_blit_managerr   Ú_event_managerÚimagesÚ_image_plotÚpluginsZQVBoxLayoutÚlayoutÚ	addWidgetZ	statusBarZshowMessageÚstatus_messageÚsizeHintÚresizeÚwidthÚheightÚconnect_eventÚ_update_status_bar)Úselfr   r4   ÚpluginZ
status_barZsb_sizeZcs_size©Ú	__class__r   r   r(   \   sZ    ý

ÿ
ÿ
ÿ




zImageViewer.__init__c                 C   s”   |  | ¡ | j |j¡ |jr| j|j }t |¡}t 	¡ }| 
|¡ | |j¡ |  ||¡ | jd | jd f}||v r~dnd}| j||d | S )zAdd plugin to ImageViewerr!   r"   r?   r@   )Ú	dimension)ÚattachÚoriginal_image_changedr.   r/   ÚdockÚ
dock_areasr
   ZDockWidgetArear   ZQDockWidgetZ	setWidgetr)   ÚnameZaddDockWidgetÚ_add_widget_size)rC   rD   ÚlocationZdock_locationrJ   ZhorizrG   r   r   r   Ú__add__™   s    


zImageViewer.__add__r?   c           	      C   sb   |  ¡ }|  ¡ }d }}|dkr*| ¡ }n|dkr:| ¡ }| ¡ }| ¡ }|  || || ¡ d S )Nr   r?   r@   )r=   ZframeGeometryr?   r@   r>   )	rC   ZwidgetrG   Zwidget_sizeZviewer_sizeZdxZdyÚwÚhr   r   r   rM   ¬   s    
zImageViewer._add_widget_sizeNc                 C   s4   |du rt  ¡ }|du rdS t |¡}|  |¡ dS )z&Open image file and display in viewer.N)r   Zopen_file_dialogr   Zimreadr/   )rC   Úfilenamer   r   r   r   r*   º   s    
zImageViewer.open_filec                 C   s   |   |¡ dS )zUpdate displayed image.

        This method can be overridden or extended in subclasses and plugins to
        react to image changes.
        N)r/   ©rC   r   r   r   r   Úupdate_imageÃ   s    zImageViewer.update_imagec                 C   s    || _ | ¡ | _| j |¡ d S ©N)Úoriginal_imageÚcopyr   rI   ÚemitrS   r   r   r   r/   Ë   s    
z"ImageViewer._update_original_imagec                 C   s  |du rt  ¡ }|du rdS t| jjƒdkr<t || j¡ nÂt| jjd ƒ}t| jjd ƒ}|dd…dd…df }t	 
|dk¡ršt	 |¡| jjd  ¡  }|dd…dd…t	jf }|dd…dd…dd…f | |dd…dd…dd…f d|   }t ||¡ dS )a!  Save current image to file.

        The current behavior is not ideal: It saves the image displayed on
        screen, so all images will be converted to RGB, and the image size is
        not preserved (resizing the viewer window will alter the size of the
        saved image).
        Né   r   r   )r   Zsave_file_dialogÚlenr1   r7   r   Zimsaver   r   r   Úallr   Z	get_alphaZnewaxis)rC   rR   ZunderlayZoverlayZalphaZ	compositer   r   r   r+   Ð   s      ÿzImageViewer.save_to_filec                 C   s   |   ¡  d S rU   )r,   ©rC   Úeventr   r   r   Ú
closeEventí   s    zImageViewer.closeEventr   c                    sB   |   |d¡ | jD ]}| ¡  qtt| ƒ ¡  |  ¡  |  ¡  d S )Nr   )Úmover9   Úshowr'   r   ZactivateWindowZraise_)rC   ÚxÚprE   r   r   r0   ð   s    

zImageViewer._showc                 C   s"   |   ¡  |rtƒ  dd„ | jD ƒS )z|Show ImageViewer and attached plugins.

        This behaves much like `matplotlib.pyplot.show` and `QWidget.show`.
        c                 S   s   g | ]}|  ¡ ‘qS r   )Úoutput)Ú.0rb   r   r   r   Ú
<listcomp>   ó    z$ImageViewer.show.<locals>.<listcomp>)r0   r   r9   )rC   Zmain_windowr   r   r   r`   ø   s    zImageViewer.showc                 C   s    | j r| j ¡  n
| j ¡  d S rU   )r4   r5   Úredrawr2   Z	draw_idle©rC   r   r   r   rg     s    zImageViewer.redrawc                 C   s   | j S rU   )Ú_imgrh   r   r   r   r     s    zImageViewer.imagec                 C   s–   || _ t| j|ƒ |jd d… \}}| j d|¡ | j |d¡ t|jj	 }|d dk rp| 
¡ dkrpd|d f}| j |¡ | jrŠd | j_|  ¡  d S )Nr   r   rY   )ri   r   r8   r   r1   Zset_xlimZset_ylimr   ZdtypeÚtypeÚminZset_climr4   r5   Z
backgroundrg   )rC   r   rQ   rP   Zclimr   r   r   r     s    c                 C   s   | j  ¡ | _d S rU   )rV   rW   r   rh   r   r   r   Úreset_image!  s    zImageViewer.reset_imagec                 C   s   | j  ||¡}|S )z<Connect callback function to matplotlib event and return id.)r2   Zmpl_connect)rC   r]   ÚcallbackZcidr   r   r   rA   $  s    zImageViewer.connect_eventc                 C   s   | j  |¡ dS )z<Disconnect callback by its id (returned by `connect_event`).N)r2   Zmpl_disconnect)rC   Zcallback_idr   r   r   Údisconnect_event)  s    zImageViewer.disconnect_eventc                 C   s6   |j r(|j  ¡ r(|  |  |j|j¡¡ n
|  d¡ d S )NÚ )ZinaxesZget_navigater<   Ú_format_coordZxdataZydatar\   r   r   r   rB   -  s    zImageViewer._update_status_barc                 C   s0   | j r| j |j¡ | j |¡ | j |¡ d S rU   )r4   r5   Zadd_artistsÚartistsr3   Úappendr6   rH   ©rC   Ztoolr   r   r   Úadd_tool3  s    zImageViewer.add_toolc                 C   s>   || j vrd S | jr"| j |j¡ | j  |¡ | j |¡ d S rU   )r3   r4   r5   Zremove_artistsrq   Úremover6   Údetachrs   r   r   r   Úremove_tool9  s    
zImageViewer.remove_toolc                 C   sL   t |d ƒ}t |d ƒ}zd| j||f ||f W S  tyF   Y dS 0 d S )Ng      à?z%4s @ [%4s, %4s]ro   )Úintr   Ú
IndexError)rC   ra   Úyr   r   r   rp   A  s    zImageViewer._format_coord)T)r?   )N)N)r   )T)$Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   ZTopDockWidgetAreaZBottomDockWidgetAreaZLeftDockWidgetAreaZRightDockWidgetArearK   r   r   ZndarrayrI   r(   rO   rM   r*   rT   r/   r+   r^   r0   r`   rg   Úpropertyr   Úsetterrl   rA   rn   rB   rt   rw   rp   Ú__classcell__r   r   rE   r   r   1   s:   "ý
=

	




c                       s2   e Zd ZdZd	‡ fdd„	Zdd„ Zdd„ Z‡  ZS )
r   aU  Viewer for displaying image collections.

    Select the displayed frame of the image collection using the slider or
    with the following keyboard shortcuts:

        left/right arrows
            Previous/next image in collection.
        number keys, 0--9
            0% to 90% of collection. For example, "5" goes to the image in the
            middle (i.e. 50%) of the collection.
        home/end keys
            First/last image in collection.

    Parameters
    ----------
    image_collection : list of images
        List of images to be displayed.
    update_on : {'move' | 'release'}
        Control whether image is updated on slide or release of the image
        slider. Using 'on_release' will give smoother behavior when displaying
        large images or when writing a plugin/subclass that requires heavy
        computation.
    r_   c                    sŽ   t dtdd || _d| _t| jƒ| _|d }tt| ƒ |¡ t	dd| jd d}||d< | j
|d< d	|d
< tdi |¤Ž| _| j | j¡ d S )Nz›`CollectionViewer` is deprecated and will be removed in 0.20. For alternatives, refer to https://scikit-image.org/docs/stable/user_guide/visualization.htmlr   r#   r   rY   )ÚvalueZlowZhighÚ	update_onrm   rx   Z
value_typeÚframe)r„   )r   r&   Úimage_collectionÚindexrZ   Ú
num_imagesr'   r   r(   ÚdictÚupdate_indexr   Úsliderr:   r;   )rC   r…   rƒ   ÚkwargsZfirst_imageZ
slider_kwsrE   r   r   r(   d  s    ý
zCollectionViewer.__init__c                 C   sV   t t|ƒƒ}|| jkrdS t|dƒ}t|| jd ƒ}|| _|| j_|  | j	| ¡ dS )z:Select image on display using index into image collection.Nr   rY   )
rx   Úroundr†   Úmaxrk   r‡   rŠ   ÚvalrT   r…   )rC   rL   r†   r   r   r   r‰   }  s    

zCollectionViewer.update_indexc                 C   sp   t |ƒtjkrd| ¡ }d|  kr*dk rZn n,td|d  | j ƒ}|  d|¡ | ¡  ql| ¡  n| ¡  d S )Né0   é:   gš™™™™™¹?ro   )	rj   r	   Z	QKeyEventÚkeyrx   r‡   r‰   ZacceptÚignore)rC   r]   r‘   r†   r   r   r   ÚkeyPressEventŒ  s    

zCollectionViewer.keyPressEvent)r_   )r{   r|   r}   r~   r(   r‰   r“   r   r   r   rE   r   r   K  s   )#r~   Znumpyr   ro   r   Z
util.dtyper   r   Zexposurer   Zqtr   r	   r
   r   Zwidgetsr   Zutilsr   r   r   r   r   Zutils.canvasr   r   Zplugins.baser   Úwarningsr   Ú__all__r   ZQMainWindowr   r   r   r   r   r   Ú<module>   s      