Ускорение порогового значения / фильтрации цвета изображения Python - PullRequest
0 голосов
/ 19 сентября 2018

Я работаю над проблемой, когда мне нужно найти ограничивающие рамки для белой области на изображении.Поскольку я имею дело с реальными изображениями, я установил порог для значений RGB, я создаю маску из этого, а затем маркирую ее и получаю из нее координаты ограничивающего прямоугольника.Вот код.

import numpy as np
from skimage import io, measure

def bin_labelled_img_to_bboxes(bin_image_labelled):
        bboxes = []
        for j in np.unique(bin_image_labelled):
            if j == 0:
                continue
            curr = (bin_image_labelled == j)
            if np.sum(curr) < 50*50:
                continue
            indices = np.nonzero(curr)
            miny = np.min(indices[0])
            minx = np.min(indices[1])
            maxy = np.max(indices[0])
            maxx = np.max(indices[1])
            bboxes.append(((miny, minx), (maxy, maxx)))
        return bboxes


class WhiteSeperator(object):
    def __init__ (self, img_path):
        self.img_path = img_path
        self.img = io.imread(self.img_path)
        self.bin_image_labelled = np.zeros((self.img.shape[0], self.img.shape[1]))
        self.bboxes = []

    def get_bin_labelled_img(self):
        img = self.img
        chan1 = (img[:,:,0] > 200) * (img[:,:,0] <= 255)
        chan2 = (img[:,:,0] > 180) * (img[:,:,0] <= 255)
        chan3 = (img[:,:,0] > 140) * (img[:,:,0] <= 255)

        bin_img = (chan1*chan2*chan3)
        bin_image_labelled = measure.label(bin_img)

        return bin_image_labelled

    def get_white_bboxes(self):
        final_white_bboxes = []
        self.bin_image_labelled = self.get_bin_labelled_img()
        white_bboxes = bin_labelled_img_to_bboxes(self.bin_image_labelled)

        for bbox in white_bboxes:
            width = bbox[1][1]-bbox[0][1]
            height = bbox[1][0]-bbox[0][0]
            if height > 80 and width > 200:
                self.bboxes.append(bbox)
                final_white_bboxes.append(bbox)
        return final_white_bboxes

Для изображений с высоким разрешением требуется около 3-11 секунд на изображение (3000 что-то x 2000 что-то).Я предполагаю, что дисперсия во времени для каждого изображения зависит от количества найденных белых ограничивающих рамок (здесь обвиняется функция bin_labelled_img_to_bboxes) Так как я должен делать это на видеокадрах, даже 3 секунды очень медленные.Можно ли сделать вышесказанное более эффективным способом?

...