
    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JrJrJr  \R                  R!                  S5        \R"                  " 5       rSr\R(                  " \\\R                  R*                  " \R,                  6 -  -   S S5      r\R1                  \R2                  5      rS	 r\R6                  R9                  S
\R:                  \R<                  \R>                  /5      S 5       r S r!\R6                  R9                  S
\R:                  \R<                  \R>                  /5      S 5       r"S r#S r$S r%S r&\R6                  R9                  S
\R:                  \R<                  \R>                  /5      S 5       r'S r(g)    N)assert_equalassert_almost_equal)data)expected_warnings)peak_signal_noise_rationormalized_root_msemean_squared_errornormalized_mutual_information   g      4@   c                  D    Sn [        [        [        5      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 p_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 psnr <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ah6@   decimalN)r   cam	cam_noisyr   )p_IPOLps     i/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/skimage/metrics/tests/test_simple_metrics.pytest_PSNR_vs_IPOLr      s    $  FY/A1-    dtypec                    [        [        [        5      n[        S-  R                  U SS9n[        S-  R                  U SS9n[        X#SS9nUR                  [
        R                  :X  d   eU [
        R                  :X  a  SOSn[        XUS9  [        [        S-  [
        R                  " [        S-  5      SS9n[        XdUS9  [        S	/5         [        [        S-  [
        R                  " [        S-  5      5      nS S S 5        [        XdUS9  [        S	/5         [        [        S-  [
        R                  " [        S-  5      5      nS S S 5        [        XdUS9  g ! , (       d  f       Nf= f! , (       d  f       N*= f)
Ng     o@F)copy   )
data_range   r   r   zInputs have mismatched dtype)r   r   r   astyper   npfloat64float16r   float32r   )r   p_uint8camf
camf_noisy	p_float64r   p_mixeds          r   test_PSNR_floatr(   -   s8   %c95G%KE2De#++E+>J'QGI??bjj(((BJJ&aAGG< &eRZZ	E 12qG G< 
:;	<)#+rzz)eBS7TU 
=G< 
:;	<)#+rzz)eBS7TU 
=G< 
=	<
 
=	<s   /E!/E2!
E/2
F c                      [         R                  " [        5         [        [        [        S S2S S 24   5        S S S 5        g ! , (       d  f       g = f)N)pytestraises
ValueErrorr   r    r   r   test_PSNR_errorsr/   I   s0    	z	"S"a[1 
#	"	"s   A
Ac           	      h   [         R                  " SU S9n[         R                  " / SQU S9n[        X!SS9nUR                  [         R
                  :X  d   e[        US[         R                  " U[         R
                  S9-  5        [        [        X!SS9S[         R                  " S5      -  5        [        [        X!S	S9SUR                  5       UR                  5       -
  -  5        [        [        U[         R                  " U5      S	S9SUR                  5       UR                  5       -
  -  5        g )
Nr   )r   )g               @r1   r1   meannormalizationr   	euclideanr   zmin-max)r   onesasarrayr   r   r    r   r2   sqrtmaxminr   r"   )r   xynrmses       r   
test_NRMSEr>   O   s    
A


'u5AF;E;;"**$$$BGGARZZ889$QEq277ST:~VA	:A1557AR<S
 Arzz!}IF	QUUWquuwr   c                  ,   [         R                  [        R                  5      n [        R                  [        R                  5      n[        [        [         [        5      [        X5      5        [        [        [         [        5      [        X5      5        g )N)r   r   r   r"   r   r   r	   r   )r$   
cam_noisyfs     r   test_NRMSE_no_int_overflowrA   b   s^    ::bjj!D!!"**-J3	*,>t,P C+-@-Rr   c                  2   [         R                  " S5      n [        R                  " [        5         [        U S S U 5        S S S 5        [        R                  " [        5         [        X SS9  S S S 5        g ! , (       d  f       N<= f! , (       d  f       g = f)Nr   r*   foor3   )r   r6   r+   r,   r-   r   )r;   s    r   test_NRMSE_errorsrD   m   sb    

A	z	"AcrFA& 
# 
z	"A6 
#	" 
#	" 
#	"s   A7#B7
B
Bc                      [        [        [        [        5      S5        [        [        [        5      [        [        [        5      :  d   eg )N   )r   r
   r   r   r.   r   r   test_nmirG   w   s:    5c3?C(Y%c3/0 0 0r   c                  \    [        [        S S 2S S24   [        S S2S S 24   5      S:  d   eg )Ni  r   )r
   r   r.   r   r   test_nmi_different_sizesrI   ~   s/    (QWs4C47|DqHHHr   c                 *   [         R                  R                  5       nUR                  S5      R                  U 5      nUR                  S5      R                  U 5      n[	        X#SS9nUR
                  [         R                  :X  d   e[        USSS9  g )N)d   rK   
   binsr   rF   r   )r   randomdefault_rngr   r
   r   r    r   )r   rngrandom1random2nmis        r   test_nmi_randomrU      st    
))


!Cjj$++E2Gjj$++E2G
'r
BC99

"""Q*r   c                  l    [         R                  R                  S5      u  p[        [        XSS9SSS9  g )N)rF   rL   rK   rK   rL   rM   r   rF   r   )r   rO   r   r
   )rR   rS   s     r   test_nmi_random_3drW      s2    yy''(9:G%gR@	r   ))numpyr   r+   numpy.testingr   r   skimager   skimage._shared._warningsr   skimage.metricsr   r   r	   r
   rO   seedcamerar   sigmacliprandnshaper   r   r   r   markparametrizer!   r"   r    r(   r/   r>   rA   rD   rG   rI   rU   rW   r.   r   r   <module>re      sP     ;  7  		q 
kkmGGC%"))//399"===q#F	SYY'	.. 2::rzz2::"FG= H=62 2::rzz2::"FG H$70I 2::rzz2::"FG+ H+r   