
    9i&                        S SK rS SKrS SKJrJr  S SKJr  S SKJ	r	  S SK
Jr  S SKJr  \R                  R                  S5        \R                   " 5       rSr\R&                  " \\\R                  R(                  " \R*                  6 -  -   S S	5      r\R/                  \R0                  5      r\R                  R                  S
5        S rS r\R6                  R9                  S/ SQ5      \R6                  R9                  S\R:                  \R<                  \R>                  /5      S 5       5       r \R6                  R9                  S\RB                  \RD                  \R:                  \R<                  \R>                  /5      S 5       r#\R6                  R9                  S/ SQ5      S 5       r$\R6                  R9                  S\RB                  \R<                  \R>                  /5      S 5       r%S r&S r'\R6                  R9                  S\RB                  \RD                  \R:                  \R<                  \R>                  /5      S 5       r(S r)\R6                  R9                  S\R:                  \R<                  \R>                  /5      S 5       r*\R6                  R9                  S\R:                  \R<                  \R>                  /5      S 5       r+S r,g)    N)assert_equalassert_almost_equal)data)expected_warnings)_supported_float_type)structural_similarity   g      4@   i  c                  L   Sn [         R                  R                  X 5      S-  R                  [         R                  5      n[         R                  R                  X 5      S-  R                  [         R                  5      n[        XU S9S:  d   e[        [        XU S9S5        g )N3   r
   win_size皙?   )nprandomrandastypeuint8r   r   )NXYs      p/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/skimage/metrics/tests/test_structural_similarity.py&test_structural_similarity_patch_ranger      sz    
A			#++BHH5A			#++BHH5A 2S888&qa8!<    c                  (   Sn [         R                  R                  X 5      S-  R                  [         R                  5      n[         R                  R                  X 5      S-  R                  [         R                  5      n[        XSS9n[        US5        [        XSS9nUS:  d   e[        XSSS	9nUS:  d   e[        XSS
9u  pg[        UR                  UR                  5        [        X5      n[        Xh5        [        [        X5      S5        g )Nd   r
      r   r   g333333?   T)r   gaussian_weights)full      ?)r   r   r   r   r   r   r   shape)	r   r   r   S0S1S2mssim0S3mssims	            r    test_structural_similarity_imager*      s    A			#++BHH5A			#++BHH5A	qa	0BQ	qa	0B8O8	qb4	HB8O8&q$7JF177#!!'E &q,c2r   seed)r      r   r	         dtypec                 2   Sn[         R                  R                  U 5      nUR                  X"45      R                  USS9S-  nUR                  X"45      R                  USS9S-  n[	        XESS9n[	        XESSS9nUS:  d   eUS	   S:  d   e[         R
                  " US
   S:  5      (       d   e[	        XESSSS9u  pn
U
R                  [        U5      :X  d   eU	R                  [        U5      :X  d   e[         R
                  " U	S:  5      (       d   eg )N<   Fcopyr
   
data_rangeT)r5   gradient皙?r   r   )r5   r6   r!   )r   r   default_rngr   r   allr/   r   )r+   r/   r   rngr   r   fgr)   gradss              r   test_structural_similarity_gradr?   5   s    	A ))


%C

A6!!%e!4s:A

A6!!%e!4s:Aas3AasTBAt8O8Q4$;;66!A$+*	t$NE 77+E2222::.u555566$+r   c                    Sn[         R                  R                  X5      n[         R                  R                  X5      n[         R                  " U 5      R                  S;   aG  SnUS-  R                  [         R                  5      nUS-  R                  [         R                  5      nO"SnUR                  U SS9nUR                  U SS9n[        X#US9nUR                  [         R                  :X  d   eUS	:  d   eg )
N   iub     o@r
   r"   Fr2   r4   r   )	r   r   r   r/   kindr   r   r   float64)r/   r   r   r   r5   r%   s         r    test_structural_similarity_dtyperF   S   s     	A
		qA
		qA	xxu$
WRXX&WRXX&
HHUH'HHUH'	q
	;B88rzz!!!8O8r   channel_axis)r   r   r,   c                   ^  Sn[         R                  R                  X5      S-  R                  [         R                  5      n[         R                  R                  X5      S-  R                  [         R                  5      n[        X#SS9n[         R                  " US[         R                  4   S5      n[         R                  " US[         R                  4   S5      nU 4S jXV4 5       u  pV[        XVT SS9n[        XG5        [        XVT S	S
9u  p[        U	R                  UR                  5        [        XVT S	S9u  p[        U
R                  UR                  5        [        XVT S	S	S9u  pn	[        U
R                  UR                  5        [        U	R                  UR                  5        [        R                  " [        5         [        XVSS S9  S S S 5        g ! , (       d  f       g = f)Nr   r
   r   r   .)r   r   r   c              3   T   >#    U  H  n[         R                  " US T5      v   M     g7f)rH   N)r   moveaxis).0_arrrG   s     r   	<genexpr>:test_structural_similarity_multichannel.<locals>.<genexpr>v   s!     Ghdbkk$L11hs   %()rG   r   T)rG   r!   )rG   r6   )rG   r!   r6      )r   rG   )r   r   r   r   r   r   tilenewaxisr   r   r#   pytestraises
ValueError)rG   r   r   r   r%   XcYcr&   mr(   r=   s   `          r   'test_structural_similarity_multichannelrY   i   sq   A			#++BHH5A			#++BHH5A	qa	0B 
3

?#Y	/B	3

?#Y	/B HrhGFB	rL1	MB ""|$OEA288$ $BPTUGARXX& (
\tKAR RXX&288$ 
z	"bqtD 
#	"	"s   G
G+c                 \   Sn[        SS5       H  nU/S-  n[        R                  R                  " U6 S-  R	                  U 5      n[        R                  R                  " U6 S-  R	                  U 5      n[        XESSS9nUR                  [        R                  :X  d   eUS:  a  M   e   g )	N
   r   r	   r
   r   rC   r   r5   r7   )ranger   r   r   r   r   r/   rE   )r/   r   ndimxsizer   r   r)   s          r   test_structural_similarity_nDr`      s     	Aa
 YY^^U#c)11%8YY^^U#c)11%8%aQ5I{{bjj(((t|| r   c            	         [         R                  " 5       n Sn[        R                  " X[        R                  R
                  " U R                  6 -  -   SS5      nUR                  U R                  5      n[        XSS9n[        U R                  S   5       Vs/ s H  n[        USU4   U SU4   5      PM     nn[        U[        R                  " U5      5        [        [        X SS9S5        g s  snf )Ng      .@r   r
   rH   )rG   .r"   )r   chelsear   clipr   randnr#   r   r/   r   r]   r   meanr   )rV   sigmarW   r)   c	mssim_seps         r   /test_structural_similarity_multichannel_chelseari      s    	BE	biioorxx888!S	AB	288	B ""r:E?DRXXb\?R?R!baj"S!V*5?R   rwwy12 &rB?Es    C0c                      Sn [         R                  [        R                  :X  d   e[        R                  [        R                  :X  d   e[        [         [        SSS9n[        XSS9  g)a  Tests vs. imdiff result from the following IPOL article and code:
https://www.ipol.im/pub/art/2011/g_lmii/.

Notes
-----
To generate mssim_IPOL, we need a local copy of cam_noisy::

  from skimage import io
  io.imsave('/tmp/cam_noisy.png', cam_noisy)

Then, we use the following command:
$ ./imdiff -m mssim <path to camera.png>/camera.png /tmp/cam_noisy.png

Values for current data.camera() calculated by Gregory Lee on Sep, 2020.
Available at:
https://github.com/scikit-image/scikit-image/pull/4913#issuecomment-700653165
g  @?TF)r    use_sample_covariancer   )decimalN)camr/   r   r   	cam_noisyr   r   )
mssim_IPOLr)   s     r   +test_gaussian_structural_similarity_vs_IPOLrp      sT    $ #J99   ??bhh&&&!YUE 15r   c                    Sn[         R                  [        R                  :X  d   e[        R                  [        R                  :X  d   e[        [         R                  U 5      [        R                  U 5      SS9n[        X!5        g )Ng;V,T?r
   r4   )rm   r/   r   r   rn   r   r   r   )r/   mssim_skimage_0pt17r)   s      r   test_mssim_vs_legacyrs      se    
 -99   ??bhh&&&!

59++E2sE 3r   c                  L   [        [        [        5      n [        S/5         [        [        R	                  [
        R                  5      [        R	                  [
        R                  5      5      nUS:  d   e S S S 5        [        SS/5         [        [        [        R	                  [
        R                  5      5      nS S S 5        [        [        [        R	                  [
        R                  5      SS9n[        X5        g ! , (       d  f       N= f! , (       d  f       N[= f)Nz%Setting data_range based on im1.dtypegGz?zInputs have mismatched dtypesr
   r4   )
r   rm   rn   r   r   r   uint16int32float32r   )r)   mssim_uint16mssim_mixeds      r    test_ssim_warns_about_data_rangerz      s    !#y1E	CD	E,JJryy!9#3#3BII#>
 d""" 
F 
	02QR
 ,C1A1A"((1KL
 (Ybjj)cK +' 
F	E
 
s   AD2D
D
D#c           	          [         R                  " SU S9n[        [        XSSS9S5        [        [        XSSS9S5        [        R
                  " [        5         [        X5        S S S 5        g ! , (       d  f       g = f)N)r	   r	   r/   r   r"   r\   r	   )r   zerosr   r   rS   rT   rU   r/   r   s     r   &test_structural_similarity_small_imager      s^    
u%A &qaCH#N&qaCH#N 
z	"a# 
#	"	"s   A//
A=c                     [         R                  " SU S9n[        R                  " [        5         [        X5        S S S 5        g ! , (       d  f       g = f)N)@   r   r|   )r   r}   rS   rT   rU   r   r~   s     r   =test_structural_similarity_errors_on_float_without_data_ranger      s2    
'A	z	"a# 
#	"	"s   A
Ac                     [         R                  " S[         R                  S9n [         R                  " S[         R                  S9n[        R                  " [
        5         [        X5        S S S 5        [        R                  " [
        5         [        X U R                  S   S-   S9  S S S 5        [        R                  " [
        5         [        X SS9  S S S 5        [        R                  " [
        5         [        X SS	9  S S S 5        [        R                  " [
        5         [        X S
S9  S S S 5        g ! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       No= f! , (       d  f       g = f)N)	   r   r|   )r-   r-   r   r   r   g)K1)K2g      )rf   )r   r}   rE   rS   rT   rU   r   r#   )r   r   s     r   test_invalid_inputr     s    
rzz*A
rzz*A	z	"a# 
# 
z	"aQWWQZ!^< 
# 
z	"at, 
#	z	"at, 
#	z	"a$/ 
#	" 
#	" 
#	" 
#	"	"	"	"	"s<   !D:EE9E-&E>:
E
E
E*-
E;>
F)-numpyr   rS   numpy.testingr   r   skimager   skimage._shared._warningsr   skimage._shared.utilsr   skimage.metricsr   r   r+   camerarm   rf   rc   rd   r#   rn   r   r/   r   r*   markparametrizefloat16rw   rE   r?   r   rv   rF   rY   r`   ri   rp   rs   rz   r   r   r    r   r   <module>r      s^     ;  7 7 1 		q 
kkmGGC%"))//399"===q#F	SYY'	 		t =32 !452::rzz2::"FG H 68 bhh"**bjj"**E& 7"E 8"EJ 288RZZ"DE FF$66 bhh"**bjj"**E44,0 2::rzz2::"FG	$ H	$ 2::rzz2::"FG$ H$0r   