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)
Спасибо! Пока я не приму мой собственный ответ как решение; возможно у кого-то есть более всесторонний, который она или он хотели бы отправить.