[docs]classFragileType(str,Enum):"""Makes wrapper for params."""cartesian="cartesian"polar="polar"
[docs]classFragileBitRefinement(Algorithm):"""Calculate fragile bits for mask. Algorithm: Thresholding by the given parameter value_threshold at each bit, set the corresponding mask response to 0 if iris response is outside the thresholds. """
__parameters_type__=Parametersdef__init__(self,value_threshold:Tuple[confloat(ge=0),confloat(ge=0),confloat(ge=0)],fragile_type:FragileType=FragileType.polar,callbacks:List[Callback]=[],)->None:"""Create Fragile Bit Refinement object. Args: value_threshold (Tuple[confloat(ge=0), confloat(ge=0), confloat(ge=0)]): Threshold at which response is strong enough such that the bit is valued as 1 in the mask. fragile_type (FragileType, optional): The Fragile bits can be either calculated in cartesian or polar coordinates. In the first, the values of value_threshold denote to x and y axis, in the case of polar coordinates, the values denote to radius and angle. Defaults to FragileType.polar. callbacks(List[Callback]): List of callbacks. Defaults to []. """super().__init__(value_threshold=value_threshold,fragile_type=fragile_type,callbacks=callbacks)
[docs]defrun(self,response:IrisFilterResponse)->IrisFilterResponse:"""Generate refined IrisFilterResponse. Args: response (IrisFilterResponse): Filter bank response Returns: IrisFilterResponse: Filter bank response. """fragile_masks=[]foriris_response,iris_maskinzip(response.iris_responses,response.mask_responses):ifself.params.fragile_type==FragileType.cartesian:mask_value_real=(np.logical_and(np.abs(iris_response.real)>=self.params.value_threshold[0],np.abs(iris_response.real)<=self.params.value_threshold[1],)*iris_mask.real)mask_value_imag=(np.logical_and(np.abs(iris_response.imag)>=self.params.value_threshold[0],np.abs(iris_response.imag)<=self.params.value_threshold[2],)*iris_mask.imag)ifself.params.fragile_type==FragileType.polar:# transform from cartesian to polar system# radiusiris_response_r=np.abs(iris_response)# angleiris_response_phi=np.angle(iris_response)# min radiusmask_value_r=np.logical_and(iris_response_r>=self.params.value_threshold[0],iris_response_r<=self.params.value_threshold[1])# min angle away from the coordinate lines# cosine requirement: makes sure that angle is different enough from x-axiscos_mask=np.abs(np.cos(iris_response_phi))<=np.abs(np.cos(self.params.value_threshold[2]))# sine requirement: makes sure that angle is different enough from y-axissine_mask=np.abs(np.sin(iris_response_phi))<=np.abs(np.cos(self.params.value_threshold[2]))# combinemask_value_real=mask_value_r*sine_mask*iris_mask.real# combine with radiusmask_value_imag=mask_value_r*cos_mask*iris_mask.imag# combine with mask for responsemask_value=mask_value_real+1j*mask_value_imagfragile_masks.append(mask_value)returnIrisFilterResponse(iris_responses=response.iris_responses,mask_responses=fragile_masks,iris_code_version=response.iris_code_version,)