cv2.PCACompute () поиск ярких и темных объектов на сером фоне изображения - PullRequest
0 голосов
/ 07 сентября 2018

Я хочу найти объекты на изображениях и провести красную линию через их оси. Проблема в том, что есть изображения ярких и темных объектов. Освещение изображений не является оптимальным. Я могу настроить значения в cv2.threshold(), чтобы программа могла находить яркие или темные объекты, но как мне найти оба? Я думал о выражении if, но на что оно будет похоже?

Код:

    img = cv2.imread('image.png')
    img_gs = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    img_gs = cv2.GaussianBlur(img_gs,(5,5),0)
    _, thresh = cv2.threshold(img_gs,
                              0,
                              255,
                              cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    mat = np.argwhere(thresh != 0)
    mat[:, [0, 1]] = mat[:, [1, 0]]
    mat = np.array(mat).astype(np.float32)
    m, e = cv2.PCACompute(mat, mean = np.array([]))
    center = tuple(m[0])
    endpoint1 = tuple(m[0] + e[0]*100)
    endpoint3 = tuple(m[0] - e[0]*100)
    red_color = (0, 0, 255)
    cv2.circle(img, center, 5, red_color)
    cv2.line(img, center, endpoint1, red_color)
    cv2.line(img, center, endpoint3, red_color)
    cv2.imwrite('savedimage.png', img)

ErrorMessage:

m, e = cv2.PCACompute(mat, mean = np.array([]))
cv2.error: OpenCV(3.4.2) /io/opencv/modules/core/src/matmul.cpp:2557: error: (-215:Assertion failed) nsamples > 0 in function 'calcCovarMatrix'

Хорошее изображение:

enter image description here

Плохое изображение (ErrorMessage):

enter image description here

Результат должен быть таким:

enter image description here

...