cv2.imwrite меняет цвет при сохранении из np.array в JPG

В настоящее время я работаю над программой обнаружения краев для класса (конкретно, я обнаруживаю уличные линии).

Я читаю изображение и обнаруживаю некоторые края (через шум). Обнаруженные края затем накладываются на исходное изображение. При этом данные изображения сохраняются как numpy.ndarry. В самом конце я хочу сохранить образ на диск (как jpg).

Если я записываю образы на диск через scipy.misc.imsave, все работает нормально. Если я сделаю это через cv2.imwrite, цвета будут искажены, превратившись в своего рода тепловую картинку.

Я прочитал несколько тем о разных цветовых каналах и необходимом масштабировании / преобразовании, но я не могу найти решение от numpy.ndarray до .jpg. Я знаю, что .jpg может иметь только 8-битные или 16-битные цветовые каналы, но не знаю, что оттуда делать. В любом случае я вслепую пытался разделить на 255 (- ›изображение почти черное) и умножить на 255 (-› беловатое тепловое изображение :-)).

Любые идеи? Это соответствующие разделы кода:

Чтение изображения (функция вызывается позже в цикле):

def read(img):
    image = mpimg.imread(img)
    return image

Функция Draw, вызываемая в цикле для рисования всех линий, определенных в массиве:

def draw_lines(img, line_coordinates, color=[255, 0, 0], thickness=4):
    for line in line_coordinates:
        for x1, y1, x2, y2 in line:
            cv2.line(img, (x1, y1), (x2, y2), color, thickness)

Эта функция вызывает функцию рисования и возвращает изображение со всеми нарисованными линиями.

def depict_lines(img, array_of_coordinates): 
    line_img = np.zeros((img.shape[0], img.shape[1], 3), dtype=np.uint8)
    draw_lines(line_img, array_of_coordinates)
    return line_img

Затем я объединяю исходное изображение и изображение, содержащее края:

def weighted_img(line_img, initial_img, α=0.95, β=1., λ=0.):
    return cv2.addWeighted(initial_img, α, line_img, β, λ)

combined_images = weighted_img(depicted_lines, original_image)

Наконец, сохраняю образ на диск. Этот вызов производит странные цвета:

cv2.imwrite(new_file_name, combined_images)

тогда как этот отлично работает:

scipy.misc.imsave('outfile.jpg', combined_images)

Это необработанное изображение: естественные цвета

И обработанный: искаженные цвета

Ваша помощь будет оценена!


person Celmar Y.    schedule 26.01.2017    source источник
comment
Можете ли вы также прикрепить сгенерированные результаты? По моей интуиции, должна быть какая-то проблема с форматом RGB или BGR изображения, которое вы пытаетесь сохранить на диске. cv2.imwrite() ожидает, что входное изображение будет в формате BGR, но я не уверен в формате ввода для scipy.misc.imsave   -  person ZdaR    schedule 27.01.2017
comment
@Marcel Можете ли вы загрузить изображение, с которым работаете?   -  person Jeru Luke    schedule 27.01.2017
comment
Эй, я прикрепил изображение до и после!   -  person Celmar Y.    schedule 27.01.2017
comment
Кстати, почему этот вопрос отклонен? Вопрос не существует, я старался быть максимально точным и следовал инструкциям, как задать вопрос. Какие-нибудь намеки?   -  person Celmar Y.    schedule 27.01.2017


Ответы (1)


@ZdaR, вы были правы, cv2.imwrite нужен BGR. Я просто включил следующую строку:

image_to_write = cv2.cvtColor(combined_images, cv2.COLOR_RGB2BGR)

И теперь это просто отлично выводит изображения:

cv2.imwrite(new_file_name, image_to_write)

Спасибо! На данный момент я не приму свой ответ как решение; может быть, у кого-то есть более подробное сообщение, которое он или она хотели бы опубликовать.

person Celmar Y.    schedule 27.01.2017
comment
Мне интересно, являются ли цветовые каналы RGB изображения результатом code image = mpimg.imread (img) code или одного из этапов обработки изображения. С помощью функций draw_lines и depict_lines я создаю новое изображение из массива. Каков цветовой канал по умолчанию для изображения, созданного на основе информации из numpy.ndarray? - person Celmar Y.; 27.01.2017
comment
Вы можете пока принять свой ответ. Если вы найдете лучший ответ, вы можете его изменить. - person Jeru Luke; 27.01.2017
comment
@MarcelB: Пожалуйста, примите свой ответ. Opencv хранит изображения как BGR в памяти (не на жестком диске). Просто подтверждаю. - person saurabheights; 30.01.2017