Source code for iris.nodes.eye_properties_estimation.sharpness_estimation
from typing import List, Tuple
import cv2
import numpy as np
from pydantic import Field, validator
import iris.io.validators as pydantic_v
from iris.callbacks.callback_interface import Callback
from iris.io.class_configs import Algorithm
from iris.io.dataclasses import NormalizedIris, Sharpness
[docs]
class SharpnessEstimation(Algorithm):
"""Calculate sharpness of the normalized iris.
The goal of this algorithm is to calculate the sharpness of the normalized iris using the variance of Laplacian.
LIMITATIONS:
This method may be biased against dark images with inadequate lighting.
"""
[docs]
class Parameters(Algorithm.Parameters):
"""Parameters class for SharpnessEstimation objects.
lap_ksize (int): Laplacian kernel size, must be odd integer no larger than 31.
erosion_ksize (Tuple[int, int]): Mask erosion kernel size, must be odd integers.
"""
lap_ksize: int = Field(..., gt=0, le=31)
erosion_ksize: Tuple[int, int] = Field(..., gt=0)
_is_odd0 = validator("lap_ksize", allow_reuse=True)(pydantic_v.is_odd)
_is_odd = validator("erosion_ksize", allow_reuse=True, each_item=True)(pydantic_v.is_odd)
__parameters_type__ = Parameters
def __init__(
self,
lap_ksize: int = 11,
erosion_ksize: Tuple[int, int] = (29, 15),
callbacks: List[Callback] = [],
) -> None:
"""Assign parameters.
Args:
lap_ksize (int, optional): kernal size for Laplacian. Defaults to 11.
erosion_ksize (Tuple[int, int], optional): kernal size for mask erosion. Defaults to (29,15).
callbacks (List[Callback]): callbacks list. Defaults to [].
"""
super().__init__(lap_ksize=lap_ksize, erosion_ksize=erosion_ksize, callbacks=callbacks)
[docs]
def run(self, normalization_output: NormalizedIris) -> Sharpness:
"""Calculate sharpness of the normalized iris.
Args:
normalization_output (NormalizedIris): Normalized iris.
Returns:
Sharpness: Sharpness object.
"""
output_im = cv2.Laplacian(normalization_output.normalized_image / 255, cv2.CV_32F, ksize=self.params.lap_ksize)
mask_im = cv2.erode(
normalization_output.normalized_mask.astype(np.uint8), kernel=np.ones(self.params.erosion_ksize, np.uint8)
)
sharpness_score = output_im[mask_im == 1].std() if np.sum(mask_im == 1) > 0 else 0.0
return Sharpness(score=sharpness_score)