Разделение изображения на каналы с помощью numpy

Я хочу разделить каналы моего изображения. Затем я хочу применить Otsu Thresholding к каждому из них и, наконец, объединить их вместе. Однако в строке 4 моего кода это дает мне следующую ошибку:

File "C:/Users/Berke/PycharmProjects/goruntu/main.py", line 28, in <module>
    image_channels = np.split(np.asarray(gradient_image), 3, axis=2)
File "C:\Users\Berke\PycharmProjects\goruntu\venv\lib\site-packages\numpy\lib\shape_base.py", line 846, in split
    N = ary.shape[axis]
IndexError: tuple index out of range

Вот мой код:

morph = mypic.copy()
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 1))
myImage = cv2.morphologyEx(morph, cv2.MORPH_GRADIENT, kernel)
myImageChannels = np.split(np.asarray(gradient_image), 3, axis=2)
for channels in range(3):
  _, myImageChannels[channels] = cv2.threshold(myImageChannels[channels],
                                               0,
                                               255,
                                               cv2.THRESH_OTSU | cv2.THRESH_BINARY)

person Türker Berke Yıldırım    schedule 02.03.2019    source источник
comment
ваша матрица данных является квадратной матрицей ???   -  person Inder    schedule 02.03.2019


Ответы (1)


arrow_upward
2
arrow_downward

Почему бы не сделать это проще?

import numpy as np
import cv2

original_image = cv2.imread(path) #expect [X,Y,3] shape
#or
original_image = np.asarray(gradient_image)

otsu_image = np.zeros(shape=original_image.shape)
for channel in range(3):
    _,otsu_image[:,:,channel]= cv2.threshold(original_image[:,:channel],0,255,cv2.THRESH_OTSU | cv2.THRESH_BINARY)

С помощью этого выбора индекса [:,:,channel] вы в основном получаете доступ к слою изображения определенного канала, не делая ничего особенного с изображением. Конечно, этому слою можно назначить изображение с пороговым значением, потому что слой 1 канала имеет тот же размер, что и изображение в градациях серого.

person Martin    schedule 02.03.2019
comment
Понял, вместо функции разделения. Я могу использовать [; , ; , индекс] обозначение. Спасибо. - person Türker Berke Yıldırım; 02.03.2019
comment
@TürkerBerkeYıldırım Я заметил, что вы не «принимаете» ответы на вопросы, которые вы публикуете в Stackoverflow. Если кто-то ответил на ваш вопрос, и вы удовлетворены, этот сайт работает, этот спрашивающий принимает ответ для дальнейших ссылок - person Martin; 02.03.2019
comment
Я доволен и ставлю +1 за это. Как я могу принять ответ? - person Türker Berke Yıldırım; 02.03.2019
comment
@TürkerBerkeYıldırım Спасибо, но то, что вы сделали, это «Проголосовать за», вам нужно выбрать символ «Проверить», который находится сразу под количеством голосов. Может быть, было бы хорошо, когда у вас будет время, принять другие ваши вопросы, но, конечно, только если на них есть ответ, который вас удовлетворил :) - person Martin; 02.03.2019
comment
Ага, понятно. Я думал об этом, модератор дает кнопку Проверить за правильные ответы :( - person Türker Berke Yıldırım; 02.03.2019