Skip to content

Commit f71cfd2

Browse files
Add an experimental node to sharpen latents.
Can be used with LatentApplyOperationCFG for interesting results.
1 parent c695c4a commit f71cfd2

1 file changed

Lines changed: 50 additions & 0 deletions

File tree

comfy_extras/nodes_latent.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,55 @@ def tonemap_reinhard(latent, **kwargs):
221221
return normalized_latent * new_magnitude
222222
return (tonemap_reinhard,)
223223

224+
class LatentOperationSharpen:
225+
@classmethod
226+
def INPUT_TYPES(s):
227+
return {"required": {
228+
"sharpen_radius": ("INT", {
229+
"default": 9,
230+
"min": 1,
231+
"max": 31,
232+
"step": 1
233+
}),
234+
"sigma": ("FLOAT", {
235+
"default": 1.0,
236+
"min": 0.1,
237+
"max": 10.0,
238+
"step": 0.1
239+
}),
240+
"alpha": ("FLOAT", {
241+
"default": 0.1,
242+
"min": 0.0,
243+
"max": 5.0,
244+
"step": 0.01
245+
}),
246+
}}
247+
248+
RETURN_TYPES = ("LATENT_OPERATION",)
249+
FUNCTION = "op"
250+
251+
CATEGORY = "latent/advanced/operations"
252+
EXPERIMENTAL = True
253+
254+
def op(self, sharpen_radius, sigma, alpha):
255+
def sharpen(latent, **kwargs):
256+
luminance = (torch.linalg.vector_norm(latent, dim=(1)) + 1e-6)[:,None]
257+
normalized_latent = latent / luminance
258+
channels = latent.shape[1]
259+
260+
kernel_size = sharpen_radius * 2 + 1
261+
kernel = comfy_extras.nodes_post_processing.gaussian_kernel(kernel_size, sigma, device=luminance.device)
262+
center = kernel_size // 2
263+
264+
kernel *= alpha * -10
265+
kernel[center, center] = kernel[center, center] - kernel.sum() + 1.0
266+
267+
padded_image = torch.nn.functional.pad(normalized_latent, (sharpen_radius,sharpen_radius,sharpen_radius,sharpen_radius), 'reflect')
268+
sharpened = torch.nn.functional.conv2d(padded_image, kernel.repeat(channels, 1, 1).unsqueeze(1), padding=kernel_size // 2, groups=channels)[:,:,sharpen_radius:-sharpen_radius, sharpen_radius:-sharpen_radius]
269+
270+
return luminance * sharpened
271+
return (sharpen,)
272+
224273
NODE_CLASS_MAPPINGS = {
225274
"LatentAdd": LatentAdd,
226275
"LatentSubtract": LatentSubtract,
@@ -231,4 +280,5 @@ def tonemap_reinhard(latent, **kwargs):
231280
"LatentApplyOperation": LatentApplyOperation,
232281
"LatentApplyOperationCFG": LatentApplyOperationCFG,
233282
"LatentOperationTonemapReinhard": LatentOperationTonemapReinhard,
283+
"LatentOperationSharpen": LatentOperationSharpen,
234284
}

0 commit comments

Comments
 (0)