81 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			81 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | import bpy, os | ||
|  | 
 | ||
|  | class TLM_Integrated_Denoise: | ||
|  | 
 | ||
|  |     image_array = [] | ||
|  |     image_output_destination = "" | ||
|  | 
 | ||
|  |     def load(self, images): | ||
|  |         self.image_array = images | ||
|  | 
 | ||
|  |         self.cull_undefined() | ||
|  | 
 | ||
|  |     def setOutputDir(self, dir): | ||
|  |         self.image_output_destination = dir | ||
|  | 
 | ||
|  |     def cull_undefined(self): | ||
|  |          | ||
|  |         #Do a validation check before denoising | ||
|  | 
 | ||
|  |         cam = bpy.context.scene.camera | ||
|  |         if not cam: | ||
|  |             bpy.ops.object.camera_add() | ||
|  | 
 | ||
|  |             #Just select the first camera we find, needed for the compositor | ||
|  |             for obj in bpy.context.scene.objects: | ||
|  |                 if obj.type == "CAMERA": | ||
|  |                     bpy.context.scene.camera = obj | ||
|  |                     return | ||
|  | 
 | ||
|  |     def denoise(self): | ||
|  | 
 | ||
|  |         if not bpy.context.scene.use_nodes: | ||
|  |             bpy.context.scene.use_nodes = True | ||
|  | 
 | ||
|  |         tree = bpy.context.scene.node_tree | ||
|  | 
 | ||
|  |         for image in self.image_array: | ||
|  | 
 | ||
|  |             if bpy.context.scene.TLM_SceneProperties.tlm_verbose: | ||
|  |                 print("Image...: " + image) | ||
|  | 
 | ||
|  |             img = bpy.data.images.load(self.image_output_destination + "/" + image) | ||
|  | 
 | ||
|  |             image_node = tree.nodes.new(type='CompositorNodeImage') | ||
|  |             image_node.image = img | ||
|  |             image_node.location = 0, 0 | ||
|  | 
 | ||
|  |             denoise_node = tree.nodes.new(type='CompositorNodeDenoise') | ||
|  |             denoise_node.location = 300, 0 | ||
|  | 
 | ||
|  |             comp_node = tree.nodes.new('CompositorNodeComposite') | ||
|  |             comp_node.location = 600, 0 | ||
|  | 
 | ||
|  |             links = tree.links | ||
|  |             links.new(image_node.outputs[0], denoise_node.inputs[0]) | ||
|  |             links.new(denoise_node.outputs[0], comp_node.inputs[0]) | ||
|  | 
 | ||
|  |             # set output resolution to image res | ||
|  |             bpy.context.scene.render.resolution_x = img.size[0] | ||
|  |             bpy.context.scene.render.resolution_y = img.size[1] | ||
|  |             bpy.context.scene.render.resolution_percentage = 100 | ||
|  | 
 | ||
|  |             filePath = bpy.data.filepath | ||
|  |             path = os.path.dirname(filePath) | ||
|  | 
 | ||
|  |             base = os.path.basename(image) | ||
|  |             filename, file_extension = os.path.splitext(image) | ||
|  |             filename = filename[:-6] | ||
|  | 
 | ||
|  |             bpy.context.scene.render.filepath = self.image_output_destination + "/" + filename + "_denoised" + file_extension | ||
|  | 
 | ||
|  |             denoised_image_path = self.image_output_destination | ||
|  |             bpy.context.scene.render.image_settings.file_format = "HDR" | ||
|  | 
 | ||
|  |             bpy.ops.render.render(write_still=True) | ||
|  | 
 | ||
|  |             #Cleanup | ||
|  |             comp_nodes = [image_node, denoise_node, comp_node] | ||
|  |             for node in comp_nodes: | ||
|  |                 tree.nodes.remove(node) |