Module torpido.util.image

Utility functions to resize the frame from the video or normal image into specified width the increase the processing speed on the operations on the frames.

Expand source code
"""
Utility functions to resize the frame from the video or normal image into specified width the increase the
processing speed on the operations on the frames.
"""

import cv2
import numpy as np


def resize(image, width=None, height=None, inter=cv2.INTER_AREA):
    """
    Resize the image according the width with open cv's Interpolator. Height is automatically
    calculated based on the ratio of the original width of the frame

    Parameters
    ----------
    image : numpy array
        input image original from input video
    width : int
        width of the output frame
    height : int , optional
        the height is automatically calculated based on the ratios
    inter : int
        Interpolator to use

    Returns
    -------
    resized : numpy array
        output resized image
    """
    # initialize the dimensions of the image to be resized and
    # grab the image size
    (h, w) = image.shape[:2]

    # if both the width and height are None, then return the
    # original image
    if width is None and height is None:
        return image

    # check to see if the width is None
    if width is None:
        # calculate the ratio of the height and construct the
        # dimensions
        r = height / float(h)
        dim = (int(w * r), height)

    # otherwise, the height is None
    else:
        # calculate the ratio of the width and construct the
        # dimensions
        r = width / float(w)
        dim = (width, int(h * r))

    # resize the image
    resized = cv2.resize(image, dim, interpolation=inter)

    # return the resized image
    return resized


def nonMaxSuppression(boxes, probs=None, overlapThresh=0.3):
    """
    Supression for overlapping boxes from the co-ordinates

    Parameters
    ----------
    boxes : box list
        list of values
    probs : list
        value of the probability
    overlapThresh : float
        threshold that corrects the overlapping

    Returns
    -------
    box list
        cleaned co-ordinates
    """
    # if there are no boxes, return an empty list
    if len(boxes) == 0:
        return []

    # if the bounding boxes are integers, convert them to floats -- this
    # is important since we'll be doing a bunch of divisions
    if boxes.dtype.kind == "i":
        boxes = boxes.astype("float")

    # initialize the list of picked indexes
    pick = []

    # grab the coordinates of the bounding boxes
    x1 = boxes[:, 0]
    y1 = boxes[:, 1]
    x2 = boxes[:, 2]
    y2 = boxes[:, 3]

    # compute the area of the bounding boxes and grab the indexes to sort
    # (in the case that no probabilities are provided, simply sort on the
    # bottom-left y-coordinate)
    area = (x2 - x1 + 1) * (y2 - y1 + 1)
    idxs = y2

    # if probabilities are provided, sort on them instead
    if probs is not None:
        idxs = probs

    # sort the indexes
    idxs = np.argsort(idxs)

    # keep looping while some indexes still remain in the indexes list
    while len(idxs) > 0:
        # grab the last index in the indexes list and add the index value
        # to the list of picked indexes
        last = len(idxs) - 1
        i = idxs[last]
        pick.append(i)

        # find the largest (x, y) coordinates for the start of the bounding
        # box and the smallest (x, y) coordinates for the end of the bounding
        # box
        xx1 = np.maximum(x1[i], x1[idxs[:last]])
        yy1 = np.maximum(y1[i], y1[idxs[:last]])
        xx2 = np.minimum(x2[i], x2[idxs[:last]])
        yy2 = np.minimum(y2[i], y2[idxs[:last]])

        # compute the width and height of the bounding box
        w = np.maximum(0, xx2 - xx1 + 1)
        h = np.maximum(0, yy2 - yy1 + 1)

        # compute the ratio of overlap
        overlap = (w * h) / area[idxs[:last]]

        # delete all indexes from the index list that have overlap greater
        # than the provided overlap threshold
        idxs = np.delete(idxs, np.concatenate(([last],
                                               np.where(overlap > overlapThresh)[0])))

    # return only the bounding boxes that were picked
    return boxes[pick].astype("int")

Functions

def nonMaxSuppression(boxes, probs=None, overlapThresh=0.3)

Supression for overlapping boxes from the co-ordinates

Parameters

boxes : box list
list of values
probs : list
value of the probability
overlapThresh : float
threshold that corrects the overlapping

Returns

box list
cleaned co-ordinates
Expand source code
def nonMaxSuppression(boxes, probs=None, overlapThresh=0.3):
    """
    Supression for overlapping boxes from the co-ordinates

    Parameters
    ----------
    boxes : box list
        list of values
    probs : list
        value of the probability
    overlapThresh : float
        threshold that corrects the overlapping

    Returns
    -------
    box list
        cleaned co-ordinates
    """
    # if there are no boxes, return an empty list
    if len(boxes) == 0:
        return []

    # if the bounding boxes are integers, convert them to floats -- this
    # is important since we'll be doing a bunch of divisions
    if boxes.dtype.kind == "i":
        boxes = boxes.astype("float")

    # initialize the list of picked indexes
    pick = []

    # grab the coordinates of the bounding boxes
    x1 = boxes[:, 0]
    y1 = boxes[:, 1]
    x2 = boxes[:, 2]
    y2 = boxes[:, 3]

    # compute the area of the bounding boxes and grab the indexes to sort
    # (in the case that no probabilities are provided, simply sort on the
    # bottom-left y-coordinate)
    area = (x2 - x1 + 1) * (y2 - y1 + 1)
    idxs = y2

    # if probabilities are provided, sort on them instead
    if probs is not None:
        idxs = probs

    # sort the indexes
    idxs = np.argsort(idxs)

    # keep looping while some indexes still remain in the indexes list
    while len(idxs) > 0:
        # grab the last index in the indexes list and add the index value
        # to the list of picked indexes
        last = len(idxs) - 1
        i = idxs[last]
        pick.append(i)

        # find the largest (x, y) coordinates for the start of the bounding
        # box and the smallest (x, y) coordinates for the end of the bounding
        # box
        xx1 = np.maximum(x1[i], x1[idxs[:last]])
        yy1 = np.maximum(y1[i], y1[idxs[:last]])
        xx2 = np.minimum(x2[i], x2[idxs[:last]])
        yy2 = np.minimum(y2[i], y2[idxs[:last]])

        # compute the width and height of the bounding box
        w = np.maximum(0, xx2 - xx1 + 1)
        h = np.maximum(0, yy2 - yy1 + 1)

        # compute the ratio of overlap
        overlap = (w * h) / area[idxs[:last]]

        # delete all indexes from the index list that have overlap greater
        # than the provided overlap threshold
        idxs = np.delete(idxs, np.concatenate(([last],
                                               np.where(overlap > overlapThresh)[0])))

    # return only the bounding boxes that were picked
    return boxes[pick].astype("int")
def resize(image, width=None, height=None, inter=3)

Resize the image according the width with open cv's Interpolator. Height is automatically calculated based on the ratio of the original width of the frame

Parameters

image : numpy array
input image original from input video
width : int
width of the output frame
height : int , optional
the height is automatically calculated based on the ratios
inter : int
Interpolator to use

Returns

resized : numpy array
output resized image
Expand source code
def resize(image, width=None, height=None, inter=cv2.INTER_AREA):
    """
    Resize the image according the width with open cv's Interpolator. Height is automatically
    calculated based on the ratio of the original width of the frame

    Parameters
    ----------
    image : numpy array
        input image original from input video
    width : int
        width of the output frame
    height : int , optional
        the height is automatically calculated based on the ratios
    inter : int
        Interpolator to use

    Returns
    -------
    resized : numpy array
        output resized image
    """
    # initialize the dimensions of the image to be resized and
    # grab the image size
    (h, w) = image.shape[:2]

    # if both the width and height are None, then return the
    # original image
    if width is None and height is None:
        return image

    # check to see if the width is None
    if width is None:
        # calculate the ratio of the height and construct the
        # dimensions
        r = height / float(h)
        dim = (int(w * r), height)

    # otherwise, the height is None
    else:
        # calculate the ratio of the width and construct the
        # dimensions
        r = width / float(w)
        dim = (width, int(h * r))

    # resize the image
    resized = cv2.resize(image, dim, interpolation=inter)

    # return the resized image
    return resized