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)
 |