python — объединение двух изображений с OpenCV
спросил
Изменено 11 месяцев назад
Просмотрено 241 тысяч раз
Я пытаюсь использовать OpenCV 2.1 для объединения двух изображений в одно, при этом два изображения размещаются рядом друг с другом. В Python я делаю:
импортировать numpy как np, cv img1 = cv.LoadImage(fn1, 0) img2 = cv.LoadImage(fn2, 0) h2, w1 = img1.высота, img1.ширина h3, w2 = img2.высота, img2.ширина # Создайте массив, достаточно большой, чтобы разместить оба изображения рядом друг с другом. vis = np.zeros((max(h2, h3), w1+w2), np.float32) mat1 = cv.CreateMat (img1.height, img1.width, cv.CV_32FC1) cv.Convert(img1, mat1) mat2 = cv.CreateMat (img2.height, img2.width, cv.CV_32FC1) cv.Convert(img2, mat2) # Скопируйте оба изображения в составное изображение.вис[:h2, :w1] = мат1 вис[:h3, w1:w1+w2] = мат2 h,w = вид.форма vis2 = cv.CreateMat(h, w, cv.CV_32FC3) vis0 = cv.fromarray(vis) cv.CvtColor (vis0, vis2, cv.CV_GRAY2BGR) cv.ShowImage('тест', vis2) cv.WaitKey()
Два входных изображения:
https://code.ros.org/trac/opencv/browser/trunk/opencv/samples/c/box.png?rev=2270
https://code.ros .org/trac/opencv/browser/trunk/opencv/samples/c/box_in_scene.png?rev=2270
Полученное изображение:
Его может быть трудно отличить от остальной части сайта, но изображения белого цвета, что соответствует тому, где должны быть отдельные изображения. Черная область — это место, где данные изображения не записывались.
Почему все данные моего изображения преобразуются в белый цвет?
- python
- обработка изображений
- opencv
- компьютерное зрение
В случаях, когда ваши изображения имеют одинаковый размер (что является обычным случаем для отображения результатов обработки изображений), вы можете использовать конкатенацию numpy для упрощения кода.
Чтобы сложить вертикально (img1 поверх img2):
vis = np.concatenate((img1, img2), ось=0)
Чтобы расположить горизонтально (img1 слева от img2):
vis = np.concatenate((img1, img2), axis=1)
Для проверки:
импорт cv2 импортировать numpy как np img1 = cv2.imread('img1.png') img2 = cv2.imread('img2.png') vis = np.concatenate ((img1, img2), ось = 1) cv2.imwrite('out.png', вид)
Изображение out.png будет содержать img1 слева и img2 справа.
2Для тех, кто хочет совместить 2 цветных изображений в одном, это небольшая модификация ответа Андрея, которая сработала для меня:
1img1 = cv2.imread(imageFile1) img2 = cv2.imread(imageFile2) h2, w1 = img1.shape[:2] h3, w2 = img2.shape[:2] #создать пустую матрицу vis = np.zeros((max(h2, h3), w1+w2,3), np.uint8) #объединить 2 изображения вис[:h2, :w1,:3] = img1 вис[:h3, w1:w1+w2,:3] = img2
импортировать numpy как np, cv2 img1 = cv2. imread (fn1, 0) img2 = cv2.imread (fn2, 0) h2, w1 = img1.shape[:2] h3, w2 = img2.shape[:2] vis = np.zeros((max(h2, h3), w1+w2), np.uint8) вис[:h2, :w1] = img1 вис[:h3, w1:w1+w2] = изображение2 вис = cv2.cvtColor (вис, cv2.COLOR_GRAY2BGR) cv2.imshow ("тест", виз) cv2.waitKey()
или, если вы предпочитаете устаревший способ:
импортировать numpy как np, cv img1 = cv.LoadImage(fn1, 0) img2 = cv.LoadImage(fn2, 0) h2, w1 = img1.высота, img1.ширина h3, w2 = img2.высота, img2.ширина vis = np.zeros((max(h2, h3), w1+w2), np.uint8) vis[:h2, :w1] = cv.GetMat(img1) vis[:h3, w1:w1+w2] = cv.GetMat(img2) vis2 = cv.CreateMat(vis.shape[0], vis.shape[1], cv.CV_8UC3) cv.CvtColor (cv.fromarray (vis), vis2, cv.CV_GRAY2BGR) cv.ShowImage ("тест", vis2) cv.WaitKey()2
Вы также можете использовать встроенные функции OpenCV cv2.hconcat
и cv2.vconcat
, которые, как следует из их названий, используются для соединения изображений по горизонтали и вертикали соответственно.
импорт cv2 img1 = cv2.imread('opencv/lena.jpg') img2 = cv2.imread('opencv/бабуин.jpg') v_img = cv2.vconcat([img1, img2]) h_img = cv2.hconcat([img1, img2]) cv2.imshow('Горизонтальный', h_img) cv2.imshow('Вертикаль', v_img) cv2.waitKey(0) cv2.destroyAllWindows()
Горизонтальная конкатенация
Вертикальная конкатенация
1Для горизонтального стека:
imgHor = np.hstack((img, img))
Для вертикального стека:
imgVer = np.vstack((img, img))
Для отображения:
cv2.imshow("Horizontal", imgHor) # горизонтальный стек cv2.imshow("Vertical", imgVer) # вертикальный стек
Три лучших способа сделать это с помощью одной строки кода
импорт cv2 импортировать numpy как np img = cv2.imread('Imgs/Saint_Roch_new/data/Point_4_Face.jpg') тусклый = (256, 256) resizedLena = cv2.resize(img, тусклый, интерполяция = cv2.INTER_LINEAR) X, Y = изменен размер Лены, изменен размер Лены # Метод 1: Использование Numpy (hstack, vstack) Fusion_Horizontal = np. hstack((изменен размер Лены, Y, X)) Fusion_Vertical = np.vstack((newIMG, X)) cv2.imshow('Fusion_Vertical с использованием vstack', Fusion_Vertical) cv2.waitKey(0) # Метод 2: Использование Numpy (контанат) Fusion_Vertical = np.concatenate((resizedLena, X, Y), ось = 0) Fusion_Horizontal = np.concatenate ((измененный размер Лены, X, Y), ось = 1) cv2.imshow("Fusion_Horizontal с использованием конкатенации", Fusion_Horizontal) cv2.waitKey(0) # Метод 3: Использование OpenCV (vconcat, hconcat) Fusion_Vertical = cv2.vconcat([resizedLena, X, Y]) Fusion_Horizontal = cv2.hconcat([resizedLena, X, Y]) cv2.imshow("Fusion_Horizontal с использованием hconcat", Fusion_Horizontal) cv2.waitKey(0)
в OpenCV 3.0 вы можете легко использовать его следующим образом:
#объединить 2 изображения так же, как для объединения изображений двух разных размеров. h2, w1 = img1.shape[:2] h3, w2 = img2.shape[:2] #создать пустую матрицу (мат) res = np.zeros (shape = (max (h2, h3), w1 + w2, 3), dtype = np. uint8) # присваиваем значения BGR для объединения изображений для i в диапазоне (res.shape [2]): # назначаем цвета img1 res[:h2, :w1, i] = np.ones([img1.shape[0], img1.shape[1]]) * img1[:, :, i] # назначаем цвета img2 res[:h3, w1:w1 + w2, i] = np.ones([img2.shape[0], img2.shape[1]]) * img2[:, :, i] output_img = res.astype('uint8')
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google Зарегистрироваться через Facebook Зарегистрируйтесь, используя адрес электронной почты и парольОпубликовать как гость
Электронная почтаТребуется, но никогда не отображается
Опубликовать как гость
Электронная почтаТребуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.
Объедините два изображения по горизонтали и вертикали в Python
Получите БЕСПЛАТНЫЙ домен на 1 год и создайте свой новый сайт
В этой статье мы объяснили, как объединить два изображения по горизонтали и вертикали в Python с помощью Numpy/OpenCV.
Содержание:
- Объединение двух изображений по вертикали
- Объединить два изображения по горизонтали
Этот метод будет использовать библиотеку Numpy, но также будет работать с функциями OpenCV. Объедините изображения, а затем примените OpenCV.
Объединить два изображения по вертикали
Чтобы объединить два изображения по вертикали, ширина обоих изображений должна быть одинаковой. Если ширина отличается, то размер одного из изображений должен быть изменен, чтобы ширина стала одинаковой.
Когда ширина обоих изображений одинакова, мы можем использовать функцию np.concatenate Numpy с осью 0,
Первый параметр будет верхним изображением, а второй параметр — нижним. Оба изображения должны быть загружены как массив Numpy, что можно сделать с помощью np.load().
Это основной оператор кода:
final_image = np.concatenate((image_top, image_original), ось = 0)
Ниже приведен полный код Python для объединения двух изображений по вертикали:
import numpy as np image_original = np.load («изображение.jpeg») # пусть форма будет (200 x 300 x 3) HWC высота_часть1 = 50 width_part1 = 200 # должно быть таким же, как ширина image_original каналы = 3 # для изображений RGB image_top = np.zeros((height_part1, width_part1, каналы), np.uint8) final_image = np.concatenate ((image_top, image_original), ось = 0)
Ниже приведено визуальное изображение, объединяющее 2 изображения по вертикали:
Объединение двух изображений по горизонтали
Чтобы объединить два изображения по горизонтали, высота обоих изображений должна быть одинаковой. Если высота отличается, то размер одного из изображений должен быть изменен, чтобы высота была одинаковой.
Когда высота обоих изображений одинакова, мы можем использовать функцию np.concatenate Numpy с осью 1. Обратите внимание, что для объединения по вертикали ось была равна 0.
Первым параметром будет левое изображение, а вторым параметром будет правильное изображение. Оба изображения должны быть загружены как массив Numpy, что можно сделать с помощью np.load().
Это основной оператор кода:
final_image = np.concatenate((image_top, image_original), axis=1)
Ниже приведен полный код Python для объединения двух изображений по горизонтали:
import numpy as np image_original = np.load («изображение.jpeg») # пусть форма будет (200 x 50 x 3) HWC height_part1 = 200 # должно быть таким же, как ширина image_original ширина_часть1 = 50 каналы = 3 # для изображений RGB image_top = np.zeros((height_part1, width_part1, каналы), np.uint8) final_image = np.