weiren119's picture
Feat: app.py
34acdd0
raw
history blame
3.15 kB
#!/usr/bin/env python3
"""
Copyright (c) 2020, Carleton University Biomedical Informatics Collaboratory
This source code is licensed under the MIT license found in the
LICENSE file in the root directory of this source tree.
"""
from typing import List, Optional, Type
import PIL.ImageDraw
from interfaces import SymbolDict
from .line import Line
from .label import Label
import utils.audiology as Audiology
from utils.geometry import get_bounding_box_relative_to_original_report
class Symbol(object):
def __init__(self, symbol_dict: dict, audiogram_coordinates: dict, correction_angle: float):
bbox = symbol_dict["boundingBox"]
self.p1 = {
"x": bbox["x"],
"y": bbox["y"]
}
self.p2 = {
"x": bbox["x"] + bbox["width"],
"y": bbox["y"] + bbox["height"]
}
self.dimensions = {
"width": bbox["width"],
"height": bbox["height"]
}
self.absolute_bounding_box = get_bounding_box_relative_to_original_report(bbox, audiogram_coordinates, correction_angle)
self.ear = "left" if "left" in symbol_dict["measurementType"].lower() else "right"
self.masking = False if "unmasked" in symbol_dict["measurementType"].lower() else True
self.conduction = "air" if "air" in symbol_dict["measurementType"].lower() else "bone"
self.measurement_type = symbol_dict["measurementType"]
self.confidence = symbol_dict["confidence"]
def draw(self, canvas: PIL.ImageDraw):
"""Draws the symbol's bounding box on the canvas (image) passed.
Parameters
----------
canvas : PIL.ImageDraw
The PIL.ImageDraw on which the symbol is to be displayed.
"""
color = "rgb(255,0,0)" if self.is_frequency() else "rgb(0,0,255)"
canvas.rectangle(
(self.p1["x"], self.p1["y"], self.p2["x"], self.p2["y"]),
outline=color,
width=3
)
canvas.text((self.p1["x"], self.p1["y"] - 10), str(self.get_value()), fill=color)
def get_center(self):
"""Returns the center of the symbol's bounding box.
Returns
-------
dict
A dictionary describing the center of the symbol's bounding box
of the form { "x": int, "y": int }.
"""
center = {
"x": (self.p1["x"] + self.p2["x"]) / 2,
"y": (self.p1["y"] + self.p2["y"]) / 2
}
return center
def to_dict(self) -> dict:
"""Serializes the symbol to a dictionary.
Returns
-------
dict
A dictionary representing the symbol.
"""
return {
"boundingBox": self.absolute_bounding_box,
"ear": self.ear,
"conduction": self.conduction,
"masking": self.masking,
"confidence": self.confidence,
"response": True,
"measurementType": self.measurement_type
}
def __str__(self):
return f"Threshold(ear={self.ear}, conduction={self.conduction})"
def __repr__(self):
return self.__str__()