class NlmeansController(): """ s: double Denoising strength (from 1 to 30) (default 1) Trade-off between noise removal and detail retention. Comparable to gaussian sigma. p: int patch size (from 0 to 99) (default 7) Catches larger areas reducing broader noise patterns, but costly pc: int patch size for chroma planes (from 0 to 99) (default 0) r: int research window (from 0 to 99) (default 15) Range to search for comparable patches. Better filtering but costly rc: int research window for chroma planes (from 0 to 99) (default 0) Good values to denoise film grain that was subobtimally encoded: strength: float = 2.8 patchSize: int = 12 chromaPatchSize: int = 8 researchWindow: int = 22 chromaResearchWindow: int= 16 """ DEFAULT_STRENGTH: float = 2.8 DEFAULT_PATCH_SIZE: int = 13 DEFAULT_CHROMA_PATCH_SIZE: int = 9 DEFAULT_RESEARCH_WINDOW: int = 23 DEFAULT_CHROMA_RESEARCH_WINDOW: int= 17 def __init__(self, parameters: str = "none", strength: str = "", patchSize: str = "", chromaPatchSize: str = "", researchWindow: str = "", chromaResearchWindow: str = "", useHardware: bool = False): self.__isActive = (parameters != "none" or strength or patchSize or chromaPatchSize or researchWindow or chromaResearchWindow) self.__useHardware = useHardware parameterTokens = parameters.split(',') self.__strengthList = [] if strength: strengthTokens = strength.split(',') for st in strengthTokens: try: strengthValue = float(st) except: raise ValueError('NlmeansController: Strength value has to be of type float') if strengthValue < 1.0 or strengthValue > 30.0: raise ValueError('NlmeansController: Strength value has to be between 1.0 and 30.0') self.__strengthList.append(strengthValue) else: self.__strengthList = [NlmeansController.DEFAULT_STRENGTH] self.__patchSizeList = [] if patchSize: patchSizeTokens = patchSize.split(',') for pst in patchSizeTokens: try: patchSizeValue = int(pst) except: raise ValueError('NlmeansController: Patch size value has to be of type int') if patchSizeValue < 0 or patchSizeValue > 99: raise ValueError('NlmeansController: Patch size value has to be between 0 and 99') if patchSizeValue % 2 == 0: raise ValueError('NlmeansController: Patch size value has to an odd number') self.__patchSizeList.append(patchSizeValue) else: self.__patchSizeList = [NlmeansController.DEFAULT_PATCH_SIZE] self.__chromaPatchSizeList = [] if chromaPatchSize: chromaPatchSizeTokens = chromaPatchSize.split(',') for cpst in chromaPatchSizeTokens: try: chromaPatchSizeValue = int(pst) except: raise ValueError('NlmeansController: Chroma patch size value has to be of type int') if chromaPatchSizeValue < 0 or chromaPatchSizeValue > 99: raise ValueError('NlmeansController: Chroma patch value has to be between 0 and 99') if chromaPatchSizeValue % 2 == 0: raise ValueError('NlmeansController: Chroma patch value has to an odd number') self.__chromaPatchSizeList.append(chromaPatchSizeValue) else: self.__chromaPatchSizeList = [NlmeansController.DEFAULT_CHROMA_PATCH_SIZE] self.__researchWindowList = [] if researchWindow: researchWindowTokens = researchWindow.split(',') for rwt in researchWindowTokens: try: researchWindowValue = int(rwt) except: raise ValueError('NlmeansController: Research window value has to be of type int') if researchWindowValue < 0 or researchWindowValue > 99: raise ValueError('NlmeansController: Research window value has to be between 0 and 99') if researchWindowValue % 2 == 0: raise ValueError('NlmeansController: Research window value has to an odd number') self.__researchWindowList.append(researchWindowValue) else: self.__researchWindowList = [NlmeansController.DEFAULT_RESEARCH_WINDOW] self.__chromaResearchWindowList = [] if chromaResearchWindow: chromaResearchWindowTokens = chromaResearchWindow.split(',') for crwt in chromaResearchWindowTokens: try: chromaResearchWindowValue = int(crwt) except: raise ValueError('NlmeansController: Chroma research window value has to be of type int') if chromaResearchWindowValue < 0 or chromaResearchWindowValue > 99: raise ValueError('NlmeansController: Chroma research window value has to be between 0 and 99') if chromaResearchWindowValue % 2 == 0: raise ValueError('NlmeansController: Chroma research window value has to an odd number') self.__chromaResearchWindowList.append(chromaResearchWindowValue) else: self.__chromaResearchWindowList = [NlmeansController.DEFAULT_CHROMA_RESEARCH_WINDOW] def isActive(self): return self.__isActive def generateDenoiseTokens(self): filterName = 'nlmeans_opencl' if self.__useHardware else 'nlmeans' return ['-vf', f"{filterName}=s={self.__strengthList[0]}" + f":p={self.__patchSizeList[0]}" + f":pc={self.__chromaPatchSizeList[0]}" + f":r={self.__researchWindowList[0]}" + f":rc={self.__chromaResearchWindowList[0]}"] if self.__isActive else []