Ошибка при попытке определить цвет в центре круга

Я пытаюсь определить цвет в центре обнаруженного круга из HoughCircles. Я делаю это следующим образом:

print("Center of the circle: ", i[0]," ", i[1])
print(ci[i[0]][i[1]][0]," blue")
print(ci[i[0]][i[1]][1]," green")
print(ci[i[0]][i[1]][2]," red")

Здесь ci — это массив изображений opencv, а i[0] и i[1] представляют координаты центра круга, заданные HoughCircles в приведенном ниже коде.

Но когда я это делаю, я получаю сообщение об ошибке.

IndexError: index 1034 is out of bounds for axis 0 with size 600

Я не мог понять причину этого. Я пытаюсь определить цвет в центре круга.

    import cv2
    import numpy as np
    import sys
    import math


    img = cv2.imread("images/diffc.jpeg", 0)
    ci = cv2.imread("images/diffc.jpeg")

    cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)



    minDist = 150
    param1 = 120
    param2 = 37

    minRadius = 120
    maxRadius = 140


    circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,minDist,
                                param1=param1,param2=param2,minRadius=minRadius,maxRadius=maxRadius)


    if circles is None:
            print("No circles detected!")
            sys.exit(-1)


    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)
        print("Center of the circle: ", i[0]," ", i[1])
        # STATEMENTS THAT THROW ERROR
        print(ci[i[0]][i[1]][0]," blue")
        print(ci[i[0]][i[1]][1]," green")
        print(ci[i[0]][i[1]][2]," red")

    cv2.imshow('detected circles',cimg)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

Вот изображение: Изображение


person giannete    schedule 27.01.2019    source источник
comment
пожалуйста, прикрепите исходное изображение   -  person patelnisheet    schedule 27.01.2019
comment
@NisheetPatel Добавил изображение в мой вопрос: i.stack.imgur.com/q3tJj.jpg< /а>   -  person giannete    schedule 27.01.2019
comment
@NisheetPatel Также, как я могу определить цвет в центре круга?   -  person giannete    schedule 27.01.2019


Ответы (1)


Здесь Вам нужно знать, что метод HoughCircles возвращает центр круга в виде width x height, а numpy находит изображение с rows x columns.

Итак, вам нужно пройти сначала columns, а затем rows в ci.

Итак, чтобы определить синий цвет: ci[i[1]][i[0]][0].

Ваш окончательный код:

import cv2
import numpy as np
import sys
import math


img = cv2.imread("images/diffc.jpeg", 0)
ci = cv2.imread("images/diffc.jpeg")

cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)



minDist = 150
param1 = 120
param2 = 37

minRadius = 120
maxRadius = 140


circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,minDist,
                          param1=param1,param2=param2,minRadius=minRadius,maxRadius=maxRadius)


if circles is None:
      print("No circles detected!")
      sys.exit(-1)


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)
  print("Center of the circle: ", i[0]," ", i[1])
  # STATEMENTS THAT THROW ERROR
  print(ci[i[1]][i[0]][0]," blue")
  print(ci[i[1]][i[0]][1]," green")
  print(ci[i[1]][i[0]][2]," red")

cv2.imshow('detected circles',cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()
person patelnisheet    schedule 27.01.2019
comment
Не могли бы вы объяснить это лучше? Я не понял отношения между шириной, высотой и строкой, столбцами. - person giannete; 27.01.2019
comment
изображение width показывает общее количество столбцов в массиве, а изображение height показывает общее количество строк в массиве. Здесь ширина вашего изображения равна 1279, а высота равна 959. Но массив numpy видит его как 959 rows и 1279 columns. - person patelnisheet; 27.01.2019
comment
Хорошо. Основываясь на цветах, полученных от каждого канала, могу ли я найти, какой круг наиболее освещен, предполагая, что распределение цвета для определенного круга постоянно. - person giannete; 27.01.2019
comment
Преобразуйте свое изображение в изображение HSL и определите L-канал в соответствии с вашими требованиями к освещению. - person patelnisheet; 27.01.2019
comment
Чтобы подтвердить, i[0] обозначает координату x, а i[1] обозначает координату y в цикле for i in circles[0,:] for? - person giannete; 27.01.2019
comment
Да, Но в виде изображения width x height. Но если вы хотите извлечь пиксель изображения, вы должны сначала передать строки изображения, означающие координату y, а затем столбец, означающий x- координировать. - person patelnisheet; 27.01.2019
comment
Не могли бы вы поделиться примером, где я мог бы проверить, какой цвет больше освещен? - person giannete; 27.01.2019
comment
Я прочитал этот пост stackoverflow.com/questions/48182791/, но не мог этого понять. Я хочу знать, какой круг наиболее освещен среди кругов разных цветов. - person giannete; 27.01.2019
comment
Я думаю [переполнение стека] (stackoverflow.com/questions/48182791/) вопрос поможет вам найти освещение. - person patelnisheet; 27.01.2019
comment
хорошо, вы прочитали этот пример. В вашем примере вы должны получить все значения центрального пикселя L канала, затем вам нужно выбрать среди них max. - person patelnisheet; 27.01.2019
comment
Я сделал это, но я не думаю, что результаты правильные. Результаты: ibb.co/SvTbxZg, где исходным изображением является ibb.co/qpJ1v9w Третья координата — это значение L - person giannete; 27.01.2019
comment
Чтобы напечатать значение L, я преобразовал изображение в HLS, используя hls = cv2.cvtColor(ci, cv2.COLOR_BGR2HLS), а затем поместил значение L, используя hls[i[1]][i[0]][1]. - person giannete; 27.01.2019
comment
Не означает ли это, что более высокое значение легкости означает меньшую яркость? Тогда результаты выглядят нормально. - person giannete; 27.01.2019
comment
Вот изображение ibb.co/SvTbxZg, и я рассчитал яркость, используя hls[i[1]][i[0]][1] Третья координата — это L, предполагая, что она записывается как hls[i[1]][i[0]][1] - person giannete; 27.01.2019
comment
Извините, я не могу объяснить вам всю программу здесь, в комментарии. Я думаю, вы должны сначала узнать, как работает преобразование цвета в opencv первый. - person patelnisheet; 27.01.2019
comment
В качестве предложения для будущих ответов я бы рекомендовал распаковывать неоднозначные кортежи/списки в именованные переменные и использовать переменные с более четкими именами, т. е. for circle in circles и x, y = circle вместо (i[0], i[1]), просто чтобы другие могли понять ответ более бегло. - person alkasm; 27.01.2019
comment
@giannete Вовсе нет. Просто прочитайте документацию по преобразованию цветов opencv. - person patelnisheet; 27.01.2019
comment
@ Александр Рейнольдс Хорошо, спасибо за ваше предложение. - person patelnisheet; 27.01.2019