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