
    
3j+              
           S SK r S SKJs  Jr  S SKJr  S SKJr   " S S\R                  5      r
S\ R                  S\S\ R                  4S	 jrS
\S\ R                  S\ R                  S\ R                  4S jrS\ R                  S
\S\ R                  4S jrS\ R                  S\S\S\S\ R                  4
S jrS\ R                  S\S\S\ R                  4S jrS\ R                  S\S\S\S\ R                  4
S jrg)    N)model_management)ioc                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)ImageSharpenKJ   c                    [         R                  " SSS/ SQS[         R                  R                  S[         R                  R	                  S[         R
                  [         R                  /5      5      [         R                  R                  S[         R                  R                  S	[         R                  R                  S
SSSSSS9/S9[         R                  R                  S[         R                  R                  S
SSSSSS9[         R                  R                  SSSSSSS9[         R                  R                  SSSSSSS9/S9[         R                  R                  S[         R                  R                  S
SSSSSS9[         R                  R                  SSSSSSS9/S9[         R                  R                  S [         R                  R                  S
SSSSS!S9[         R                  R                  SSSSSS"S9[         R                  R                  S#S$S%S&S%S'S9/S9/S(9/[         R                  R                  [         R                  R	                  S[         R
                  [         R                  /5      S)S*9/S+9$ ),Nr   zKJNodes/imagezImage Sharpen KJ)sharpenzunsharp maskdeconvolutioncasrcasz	high-passpostprocessingu  GPU-accelerated image sharpening with multiple methods.

**RCAS** — AMD's Robust Contrast-Adaptive Sharpening (from FSR).
Single 5-tap cross filter that adapts to local contrast.
Minimal artifacts, good for general use with little tuning.

**Adaptive USM** — Unsharp mask with local variance modulation.
Sharpens detail-rich areas more, flat/noisy areas less.
More controllable than RCAS via radius and threshold parameters.

**High-Pass** — Extracts high-frequency detail and blends it back.
Gives a "clarity" enhancement feel. Uses radius to control detail scale.

**Deconvolution** — Richardson-Lucy iterative deconvolution.
Can recover actual lost detail from blur, not just enhance edges.
Uses radius as the estimated blur kernel and iterations to control convergence.imageimg_or_maskmethodr   strengthg?              ?g{Gz?z,0 = no sharpening, 1 = full RCAS sharpening.)defaultminmaxsteptooltip)keyinputsadaptive_usm      ?      @zCSharpening multiplier. Values above 1.0 give aggressive sharpening.radiusg      @g?zKGaussian blur sigma for the unsharp mask. Larger = enhances coarser detail.	threshold皙?zYNoise gate. Higher = only sharpen areas with more texture/detail. 0 = sharpen everything.	high_passzPBlend factor for high-frequency detail. Values above 1.0 give a punchier effect.zTGaussian blur sigma defining the frequency cutoff. Larger = enhances coarser detail.r
   z5Blend between original (0) and fully deconvolved (1).z.Sigma of the assumed Gaussian blur to reverse.
iterations
      d   zTRichardson-Lucy iterations. More = sharper but slower, diminishing returns past ~20.)optionsoutput)display_name)node_idcategoryr(   search_aliasesdescriptionr   outputs)r   Schema	MatchTypeInputTemplateImageMaskDynamicComboOptionFloatIntOutput)clss    P/home/wildlama/comfy/ComfyUI/custom_nodes/ComfyUI-KJNodes/nodes/sharpen_nodes.pydefine_schemaImageSharpenKJ.define_schema   s   yy$$+uS" ""7BLL,A,A-RTRZRZ\^\c\cQd,ef%%hOO**vz3CSW[/] ' _?*  OO**~z3CSW[/t ' vx#3UX/| ' ~{DcsY] 0K ' LG*  OO**{z3CSW[ 0B ' Cx#3UX 0F ' GD*  OO**z3CSW[/f ' hx#3UX/_ ' a\21#TU .D % EH* '9% @ ##BLL$9$9-"((TVT[T[I\$]lt#ui7
 7	
    returnc                    US   nUR                  SS5      nUS:X  a  [        R                  " U5      $ UR                  S:H  nU(       a  UR	                  S5      nUR                  SS5      nUR                  S	S
5      nUR                  SS5      nUS:X  a  [        X5      n	O2US:X  a  [        XXg5      n	OUS:X  a  [        XU5      n	O[        XXh5      n	U(       a  U	R                  S5      n	[        R                  " U	5      $ )Nr   r   r   r      r   r   r   r    r"   r#   r   r   r!   )
getr   
NodeOutputndim	unsqueeze_rcas_adaptive_usm
_high_pass_deconvolutionsqueeze)
r9   r   r   selectedr   is_maskr   r   r"   results
             r:   executeImageSharpenKJ.executeC   s    (#::j#.q===''**/OOB'EHc*JJ{D1	ZZb1
v5+F'"5FFF$8F#EVHF^^B'F}}V$$r=    N)
__name__
__module____qualname____firstlineno__classmethodr;   r   rC   rN   __static_attributes__rP   r=   r:   r   r      s4    8
 8
t %r}} % %r=   r   r   r   r>   c                    [         R                  " 5       n[         R                  " 5       n[         R                  " 5       nU R                  u  pVpx[
        R                  " XVXxX4S9n	Un
[        U5       GH  nXUS-    R                  X$S9R                  SSSS5      n[        R                  " USSS9nUS	S	2S	S	2SU2SUS-   24   nUS	S	2S	S	2SUS-   2SUS-   24   nUS	S	2S	S	2SUS-   2SU24   nUS	S	2S	S	2SUS-   2SUS-   24   nUn[
        R                  " [
        R                  " [
        R                  " [
        R                  " X5      U5      U5      U5      n[
        R                  " [
        R                  " [
        R                  " [
        R                  " X5      U5      U5      U5      nUR                  US
-  S-   5      R                  5       nUR!                  5       R#                  S5      R%                  UR!                  5       R#                  S5      R'                  S
5      R#                  S5      5      R                  5       n[
        R                  " UUUS9  UR                  SSS9R(                  nUR'                  U
5        UR+                  SS5        UR-                  S
5      R#                  S5      R/                  5       nX-   nUR#                  U5      R#                  U5        UR'                  U5      R#                  U5      R'                  U5        UR+                  SS5        UR                  SSSS5      R                  US9XUS-   & GM     U	$ )uG   AMD FidelityFX RCAS — 5-tap cross filter with contrast-adaptive lobe.devicedtyper$   r   r@      )r$   r$   r$   r$   reflectmodeNg      @ư>r   outTdimkeepdimg      ȿr   rY   )r   get_torch_deviceintermediate_deviceintermediate_dtypeshapetorchemptyrangetopermuteFpadr   r   divneg_negadd_div_mul_valuesclamp_mulreciprocal_)r   r   rY   rg   rZ   BHWCra   attenuationiimgpaddednswecentermnmxhit_minhit_maxlobenorm	neighborss                             r:   rF   rF   `   s   ..0F*>>@//1EJA!
++aA)<
JCK1XaclooVo9AA!Q1MsLy91a1a!e#$1a1Q3!A#%&1a1Q3!#$1a1Q3!A#%&YYuyy599Q?A!>BFKYYuyy599Q?A!>BFK &&cD)..0&&(--$))"&&(--*<*A*A#*F*K*KD*QRWWY		'70{{q${/66		+GS! xx}!!#&224E	qq!t!!&)..t4c"&&q!Q255=P5Qac
= @ Jr=   sigmarY   rZ   c                     [        [        SU -  S-   5      S5      n[        R                  " U* US-   XS9n[        R                  " SX@-  S-  -  5      nUR                  UR                  5       5        U$ )Nr   r   r$   rX   g      r[   )r   intrj   arangeexpru   sum)r   rY   rZ   r   xkernels         r:   _gaussian_kernel_1dr      se    S5[3&'+FfWfqjEAYYtqyQ../F
KK

Mr=   r   c           	         [        XR                  U R                  5      nUR                  S   nU R                  S   nUS-  nUR	                  SSSU5      R                  USSS5      n[        R                  " [        R                  " XUSS4SS9XdS9nUR	                  SSUS5      R                  USSS5      n[        R                  " [        R                  " USSXU4SS9XS9nU$ )z'Separable Gaussian blur on BCHW tensor.r   r$   r[   rA   r\   r]   groups)	r   rY   rZ   ri   viewexpandro   conv2drp   )	r   r   	kernel_1dkr~   rp   khblurredkvs	            r:   _gaussian_blurr      s    #E::syyAIA		!A
q&C	1a	#	*	*1b"b	9BhhquuSQ"2CRRG	1a	#	*	*1b"b	9BhhquuWq!S&6YGVGNr=   r   r   c           	      4   [         R                  " 5       n[         R                  " 5       n[         R                  " 5       nU R                  u  pxp[
        R                  " XxXXVS9nUS-  n[        U5       GH  nXUS-    R                  XFSS9R                  SSSS5      n[        X5      nX-
  n[        X5      n[        UR                  5       U5      nUR                  UU-  5      R                  S	S
9  UR                  SSS9R                  5       nUS:  a"  UR!                  U5      R                  S	S5        OUR#                  S5        UR%                  UUUS9R                  S	S5        UR                  SSSS5      R                  US9XUS-   & GM!     U$ )uP   Unsharp mask modulated by local variance — sharpens texture, skips flat areas.rX   g      ?r$   T)rY   rZ   copyr   r@   r[   r   )r   rb   r   )valuere   )r   rf   rg   rh   ri   rj   rk   rl   rm   rn   r   squaresub_rx   meansqrt_ru   fill_addcmul_)r   r   r   r   rY   rg   rZ   r{   r|   r}   r~   ra   	var_sigmar   r   r   detail
local_meanlocal_mean_sq
modulations                       r:   rG   rG      s   ..0F*>>@//1EJA!
++aA)<
JCI1XaclooVtoDLLQPQSTVWX - $C3
&szz|Y?:
23::s:C #''At'<BBD
q=OOI&--c37S!VZx8??SI[[Aq!,//7J/Kac
+ . Jr=   c           	      :   [         R                  " 5       n[         R                  " 5       n[         R                  " 5       nU R                  u  pgp[
        R                  " XgXXES9n
[        U5       H  nXUS-    R                  X5S9R                  SSSS5      n[        X5      nUR                  5       R                  U5      R                  U5      R                  U5      R                  SS5        UR                  SSSS5      R                  US9XUS-   & M     U
$ )	z>High-pass sharpening: original + strength * (original - blur).rX   r$   r   r@   r[   r   r   re   )r   rf   rg   rh   ri   rj   rk   rl   rm   rn   r   rr   rt   rv   rx   )r   r   r   rY   rg   rZ   r{   r|   r}   r~   ra   r   r   low_passs                 r:   rH   rH      s    ..0F*>>@//1EJA!
++aA)<
JC1XaclooVo9AA!Q1M!#.S!&&x055c:AA#sK%%aAq144<O4Pac
  Jr=   r"   c                    [         R                  " 5       n[         R                  " 5       n[         R                  " 5       nU R                  u  pxp[
        R                  " XxXXVS9n[        X$U5      nUR                  S   nUS-  nUR                  SSSU5      R                  U
SSS5      nUR                  SSUS5      R                  U
SSS5      n[        U5       GH  nU UUS-    R                  XFS9R                  SSSS5      nUR                  5       n[        U5       H  n[        R                  " [        R                   " UXSS4SS9XS	9n[        R                  " [        R                   " USSX4SS9UU
S	9nUR#                  S
5        [
        R$                  " UUUS9  [        R                  " [        R                   " UXSS4SS9XS	9n[        R                  " [        R                   " USSX4SS9UU
S	9nUR'                  U5        M     [
        R(                  " UUUUS9  UR+                  SS5        UR                  SSSS5      R                  US9UUUS-   & GM     U$ )z0Richardson-Lucy deconvolution with Gaussian PSF.rX   r   r[   r$   rA   r@   r\   r]   r   r_   r`   r   r   re   )r   rf   rg   rh   ri   rj   rk   r   r   r   rl   rm   rn   clonero   r   rp   rt   rq   rv   lerprx   )r   r   r   r"   rY   rg   rZ   r{   r|   r}   r~   ra   r   r   rp   r   r   r   r   estimate_r   
corrections                          r:   rI   rI      s)   ..0F*>>@//1EJA!
++aA)<
JC $FE:IA
q&C	1a	#	*	*1b"b	9B	1a	#	*	*1b"b	9B1XAaclooVo9AA!Q1M99;z"AhhquuX!Q/?iPRT_GhhquuWq!S.>YOQS\]^GLLIIc70!%%#Aq1A	"RTVaJ!%%
Q34D9"UWYbcdJMM*% # 	

3(9S!%%aAq144<O4PAac
) , Jr=   )rj   torch.nn.functionalnn
functionalro   comfyr   comfy_api.latestr   	ComfyNoder   TensorfloatrF   rY   rZ   r   r   rG   rH   r   rI   rP   r=   r:   <module>r      s.      " V%R\\ V%r* * *5<< *Zu ell 5;; SXS_S_  U u||  ! ! ! !RW !\a\h\h !Hell e U u|| (&%,, &% & &TW &\a\h\h &r=   