Задать вопрос
@homus32
учусь

Как понять [:,: 0] в python?

на сайте https://realpython.com/pysimplegui-python/ где то далеко внизу есть кусок кода

Код:
while True:

        event, values = window.read(timeout=20)

        if event == "Exit" or event == sg.WIN_CLOSED:

            break


        ret, frame = cap.read()


        if values["-THRESH-"]:

            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2LAB)[:, :, 0]

            frame = cv2.threshold(

                frame, values["-THRESH SLIDER-"], 255, cv2.THRESH_BINARY

            )[1]

        elif values["-CANNY-"]:

            frame = cv2.Canny(

                frame, values["-CANNY SLIDER A-"], values["-CANNY SLIDER B-"]

            )

        elif values["-BLUR-"]:

            frame = cv2.GaussianBlur(frame, (21, 21), values["-BLUR SLIDER-"])

        elif values["-HUE-"]:

            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

            frame[:, :, 0] += int(values["-HUE SLIDER-"])

            frame = cv2.cvtColor(frame, cv2.COLOR_HSV2BGR)

        elif values["-ENHANCE-"]:

            enh_val = values["-ENHANCE SLIDER-"] / 40

            clahe = cv2.createCLAHE(clipLimit=enh_val, tileGridSize=(8, 8))

            lab = cv2.cvtColor(frame, cv2.COLOR_BGR2LAB)

            lab[:, :, 0] = clahe.apply(lab[:, :, 0])

            frame = cv2.cvtColor(lab, cv2.COLOR_LAB2BGR)


        imgbytes = cv2.imencode(".png", frame)[1].tobytes()

        window["-IMAGE-"].update(data=imgbytes)


    window.close()


main()

и я не могу понять, как работают строчки кода 104 и 110
frame[:, :, 0] += int(values["-HUE SLIDER-"]) # 104
lab[:, :, 0] = clahe.apply(lab[:, :, 0]) # 110

Что за [:. :. 0]?? Первый раз такое вижу
Какой должен быть массив(или не массив) чтоб это работало?
  • Вопрос задан
  • 5308 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Дополню немного ответ @sergey-gornostaev
Это срез, вернее даже два.
Дело в том, что в питоне объекты могут поддерживать протокол __getitem__, этот метод вызывается когда объект употребляется с квадратными скобками справа. Значение, указанное в квадратных скобках, будет передано в качестве аргумента этому методу.
Тут есть два нюанса:
В обычном выражении на питоне запятая означает что результат выражения - это кортеж. То. что вычислилось между запятыми, будет элементами кортежа:
x=1,2,3
Второй нюанс заключается в том, что в квадратных скобках питон поддерживает особый такой "синтаксический сахар" называемый срезами (slice).
Вам действительно лучше почитать про срезы в книге. В общем у среза есть три аргумента и все необязательные. Если аргумента три то срез "под сахаром" выглядит так: 3:10:2 - "с третьего включительно по десятый исключительно с шагом 2".
Срез 3::2 - означает "с третьего включительно до последнего включительно с шагом 2"
Шаг можно опустить, по умолчанию он равен 1 и тогда не нужно второе двоеточие. Можно также не указывать и начало среза (типа сначала). Так : означает срез "от начала включительно до конца включительно с шагом 1".
Такие срезы можно указать через запятую.
Фактически фрейм - это трёхмерный массив. Первые два измерения - это высота и ширина, третье - это компоненты цвета.
В вашем примере операцию проводят над всеми пикселями от верха и до низа, по всей ширине но в определённом канале.

Правда, почитайте книгу. Такие вещи нужно осваивать последовательно, а не наскоком.
Ответ написан
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Это называется срез. Похоже, что в данном случае срез по массиву NumPy.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы