Комбинированный вывод различного типа из преобразователя scikit-learn: изображение, включающее дополнительные данные - PullRequest
0 голосов
/ 19 января 2020

Подходят ли преобразователи sklearn для преобразования входного изображения в некоторый преобразованный вывод, включая дополнительную информацию? Например, возможно ли применить преобразование Хафа Круга к изображению, используя opencv , и вывести изображение, включающее найденные окружность (и) и информацию о окружности (центр и радиус)? Есть ли подходящий python тип данных или pandas (например, DataFrame), полезный для возврата значений другого типа (изображение / матрица и список значений с плавающей запятой), или есть лучший способ, например использование numpy?

from sklearn.base import BaseEstimator, TransformerMixin
import cv2
import numpy as np
#import pandas as pd # Is pandas helpful?

class HoughTransformer(BaseEstimator, TransformerMixin):

    def __init__(self):
        pass

    def fit(self, X, y=None):
        return self

    def transform(self, X, y=None):
        """perform the transformation and return an array with different types"""

        # Prepare transformed output
        # What's a suitable data type to use for the transformed output?
        # Should include image with circles and circle information (center and radius) for each image
        Xt = [] # Python lists work, but is there are more efficient way?
        for img in X:
            cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
            circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20,
                            param1=50,param2=30,minRadius=0,maxRadius=0)


            circles = np.uint16(np.around(circles))
            for i in circles[0,:]:
                # draw the outer circle
                cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
                # draw the center of the circle
                cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)

            Xt.append([cimg, circles])
        return Xt

Другой способ, о котором я мог подумать, - это использовать два преобразователя: один для вывода только изображения с кружками в нем, а другой для вывода информации о окружностях (центр и радиус) , Затем используйте sklearn FeatureUnion , чтобы объединить результаты. Однако каждый из этих преобразователей будет использовать преобразование кругов Хафа из opencv, что будет избыточным вычислением. Поэтому я хотел бы использовать изображение и побочный результат круговой информации от одного преобразователя. Пожалуйста, дайте мне знать лучшие практики для решения этой проблемы.

...