U
    3dZ/                     @   sJ  d dl Zd dlmZ d dlmZ d dlZd dlmZm	Z	 d dl
mZmZmZmZmZmZ ejdddd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zd:ddZd;ddZe ZeeZeeZdd Zdd Zdd Z d d! Z!d"d# Z"d$d% Z#d&d' Z$d(d) Z%d*d+ Z&d,d- Z'd.d/ Z(d0d1 Z)d2d3 Z*d4d5 Z+d6d7 Z,d8d9 Z-dS )<    N)ndimage)connected_components)
sp_versionparse_version)img_to_graphgrid_to_graphextract_patches_2dreconstruct_from_patches_2dPatchExtractor_extract_patchesmodule)Zscopec                  C   s>   t jtdjkr(td ddlm}  nddlm}  | ddS )N1.10poochr   faceTZgray)r   releaser   pytestimportorskipscipy.datasetsr   
scipy.miscr    r   O/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/feature_extraction/tests/test_image.pyraccoon_face   s
    
r   c                  C   sh   t jd dd df d \} }t| }t|}|j|jks>tt j|j|jdk |j|jdk  d S )N   
   r   )npZmgridr   ZnnzAssertionErrortestingassert_array_equaldata)xygrad_xZgrad_yr   r   r   test_img_to_graph    s     r$   c                  C   s   t jdtd} d| d< d| d d df< t d}d|d< d|d< d|d	< t|| d
 }t dddgdddgdddgg}t j|| d S )N      dtype   r   r   r&   )r   r&   r*   r&   maskr   )r   zerosboolr   todensearrayr   r   )r0   r!   r#   desiredr   r   r   test_img_to_graph_sparse-   s    
"r6   c                  C   s  d} d}t j| | ftd}d|d|d|f< d|| d | d f< || d }t| | |t jd}t|d dksztt jdtd}d|d< d|d d df< tdd	d| d
	 }t 
dddgdddgdddgg}t j|| t j| | ft jd}t| | | |d}t|d dks"tt | | f}t| | | |td}|jtksRtt| | | |td}|jtksttt| | | |t jd}|jt jkstd S )Nr&   r*   r(   Tr   )n_xn_yr0   Z	return_asr%   r+   r'   r/   )r7   r8   n_zr0   )r7   r8   r9   r0   r)   )r   r1   r2   reshaper   Zndarrayr   r   Zravelr3   r4   r   r   ZonesZint16r)   intZfloat64)sizeZroi_sizer0   Agraphr5   r   r   r   test_grid_to_graph<   s0    "r?   c                 C   s`   |   }|d d dd d df }dD ]6}||k}t||d}t|d t|d ks$tq$d S )Nr   )2      r/   r*   r   )copyr   r   labelr   r   )r   r   Zthrr0   r>   r   r   r   test_connect_regions`   s    rD   c                 C   s   |   }|d d dd d df }|dk}t|jd|i}t|d t|d ksVt|dk}t|j|d d}t|d t|d kstd S )Nr   r@   r0   r*   r   rA   )r0   r)   )rB   r   shaper   rC   r   r   )r   r   r0   r>   r   r   r   test_connect_regions_with_gridj   s    rF   c                  C   s"  t jtdjkr(td ddlm}  nddlm}  | dd}|t	j
}|d d dd d df |dd dd d df  |d d ddd df  |dd ddd df  }|d d dd d df |dd dd d df  |d d ddd df  |dd ddd df  }|t	j
}|d	 }|S )
Nr   r   r   r   Tr   r&   r*   g      0@)r   r   r   r   r   r   r   r   Zastyper   Zfloat32)r   r   r   r   r   _downsampled_facey   s    

``rG   c                 C   s|   | d krt  n| } t| jd }d|  |d d d d df< d| d  |d d d d df< d| d  |d d d d df< |S )Nr'      r   r&   r*   r   rG   r   r1   rE   )r   Z
face_colorr   r   r   _orange_face   s    rK   c                 C   sF   | d krt  n| } td| j }| |d< | d |d< | d |d< |S )NrH   r   r*   r&   rJ   )r   Zimagesr   r   r   _make_images   s    rL   c                  C   sT   t } | j\}}d\}}|| d || d  }t| ||f}|j|||fksPtd S )N   rN   r*   downsampled_facerE   r   r   r   i_hi_wp_hp_wexpected_n_patchespatchesr   r   r   test_extract_patches_all   s    
rX   c                  C   s^   t } | jd d \}}d\}}|| d || d  }t| ||f}|j|||dfksZtd S )Nr&   rM   r*   r'   )orange_facerE   r   r   rQ   r   r   r   test_extract_patches_all_color   s    rZ   c                  C   sh   t } | d d ddf } | j\}}d\}}|| d || d  }t| ||f}|j|||fksdtd S )N    a   )rN      r*   rO   rQ   r   r   r   test_extract_patches_all_rect   s    
r^   c               	   C   s   t } | j\}}d\}}t| ||fdd}|jd||fks<ttd|| d  || d  }t| ||fdd}|j|||fksttt t| ||fdd W 5 Q R X tt t| ||fdd W 5 Q R X d S )NrM   d   max_patches      ?r*   g       @g      )rP   rE   r   r   r;   r   raises
ValueError)r   rR   rS   rT   rU   rW   rV   r   r   r    test_extract_patches_max_patches   s    
 re   c                  C   s*   t } t| | jdd}|jd dks&td S )Nr&   r`   r   r*   )rP   r   rE   r   )r   rW   r   r   r   "test_extract_patch_same_size_image   s    rf   c                  C   sj   t } | j\}}d| d d| d  }}|| d || d  }t| ||fdd}|j|||fksftd S )Nr'   r   r*   i  r`   rO   rQ   r   r   r   *test_extract_patches_less_than_max_patches   s    
rg   c                  C   s8   t } d\}}t| ||f}t|| j}tj| | d S NrM   )rP   r   r	   rE   r   r   assert_array_almost_equalr   rT   rU   rW   Zface_reconstructedr   r   r    test_reconstruct_patches_perfect   s
    rk   c                  C   s8   t } d\}}t| ||f}t|| j}tj| | d S rh   )rY   r   r	   rE   r   r   ri   rj   r   r   r   &test_reconstruct_patches_perfect_color   s
    rl   c                  C   s(   t } tdddd}||| ks$td S )N   rn   r_   r   
patch_sizera   random_state)face_collectionr
   Zfitr   )facesextrr   r   r   test_patch_extractor_fit   s    ru   c            	      C   s   t } | jdd \}}d\}}d}t| | }t||f|dd}|| }|j|||fks^td}t| t|| d || d  |  }t||f|dd}|| }|j|||fkstd S )Nr*   r'   rm   r_   r   ro   rb   )rr   rE   lenr
   	transformr   r;   )	rs   rR   rS   rT   rU   ra   rV   rt   rW   r   r   r    test_patch_extractor_max_patches   s.      
  
rx   c                  C   s:   t } tddd}|| }|jt| d ddfks6td S )Nr_   r   )ra   rq         )rr   r
   rw   rE   rv   r   )rs   rt   rW   r   r   r   (test_patch_extractor_max_patches_default  s    
r{   c                  C   sp   t } | jdd \}}d\}}t| || d  || d  }t||fdd}|| }|j|||fksltd S Nr*   r'   rm   r   )rp   rq   )rr   rE   rv   r
   rw   r   rs   rR   rS   rT   rU   rV   rt   rW   r   r   r    test_patch_extractor_all_patches  s     
r~   c                  C   sv   t t} | jdd \}}d\}}t| || d  || d  }t||fdd}|| }|j|||dfksrtd S r|   )rL   rY   rE   rv   r
   rw   r   r}   r   r   r   test_patch_extractor_color$  s     
r   c                  C   s  ddddg} ddddg}ddddg}ddddg}ddddg}d	d	d	d
g}ddddg}ddddg}ddddg}ddddg}	ddddg}
ddd d!g}d"d#d$d%g}d&dd'd(g}d)d#d*d+g}| | |
 }|| | }|| | }|| | }||	 | }t |||||D ]\}}}}}tt||}t|||d,}t|}|jd | |ksRtt	d-d. t ||D }|d/|  || 
 k s tq d S )0N)r   )   )r*   )r&   rH   )rn   )r   )	   )r      )r   r   )r&   r&   )r   r   )r   r   )   r   )   r   )r'   r   )r'   r   )r   r&   )r&   r   r.   )r*   r'   )r&   rn   )r      )r   r   )r   rn   )r      )r   r   r'   )r'   r'   r'   )   rn   r   )r&   r&   r'   )r&   r&   r&   )r*   r   r'   )r*   r'   r'   )r*   r&   r   )r*   r*   r*   )r&   r*   r'   )r'   r'   r   )r   r&   r*   )r   r&   r'   )r'   r&   r&   )r'   r&   r   )r   r*   r   )r   r'   r   )patch_shapeZextraction_stepc                 s   s"   | ]\}}t ||| d V  qd S )N)slice).0ijr   r   r   	<genexpr>V  s    z/test_extract_patches_strided.<locals>.<genexpr>)r,   NN)zipr   Zarangeprodr:   r   rv   rE   r   tupleZsqueezeall)Zimage_shapes_1DZpatch_sizes_1DZpatch_steps_1DZexpected_views_1DZlast_patch_1DZimage_shapes_2DZpatch_sizes_2DZpatch_steps_2DZexpected_views_2DZlast_patch_2DZimage_shapes_3DZpatch_sizes_3DZpatch_steps_3DZexpected_views_3DZlast_patch_3DZimage_shapesZpatch_sizesZpatch_stepsZexpected_viewsZlast_patchesZimage_shaperp   Z
patch_stepZexpected_viewZ
last_patchimagerW   ndimZlast_patch_slicesr   r   r   test_extract_patches_strided.  sP          r   c                  C   sX   t } | j\}}d}|| d || d f}t| |d}|j|d |d ||fksTtd S )Nrn   r*   )r   r   )rP   rE   r   r   )r   rR   rS   prV   rW   r   r   r   test_extract_patches_square^  s    
r   c               	   C   sf   t dddgdddgddd	gg} tt t| d
 W 5 Q R X tt t| d W 5 Q R X d S )Nr*   r&   r'   r   r   r   r   rn   r   )r   r*   )r*   r   )r   r4   r   rc   rd   r   )r!   r   r   r   test_width_patchh  s
    "r   )N)N).Znumpyr   Zscipyr   Zscipy.sparse.csgraphr   r   Zsklearn.utils.fixesr   r   Z sklearn.feature_extraction.imager   r   r   r	   r
   r   Zfixturer   r$   r6   r?   rD   rF   rG   rK   rL   rP   rY   rr   rX   rZ   r^   re   rf   rg   rk   rl   ru   rx   r{   r~   r   r   r   r   r   r   r   r   <module>   sD    



$

	

				

0
