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

Я довольно новичок в Python и в настоящее время работаю над программой обнаружения краев для класса (конкретно я определяю линии улиц).

Я читаю на изображении и обнаруживаю некоторые края (через грубость). Обнаруженные края затем накладываются на исходное изображение. При этом данные изображения сохраняются как 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)

Это необработанное изображение: натуральные цвета

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

Ваша помощь будет принята с благодарностью!

1 ответ

Решение

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

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

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

cv2.imwrite(new_file_name, image_to_write)

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

Другие вопросы по тегам