Как конкатенировать две матрицы в Python OpenCV?

Как объединить две матрицы в одну матрицу? Полученная матрица должна иметь ту же высоту, что и две входные матрицы, а ее ширина будет равна сумме ширины двух входных матриц.

Я ищу ранее существовавший метод, который будет выполнять эквивалент этого кода:

def concatenate(mat0, mat1):
    # Assume that mat0 and mat1 have the same height
    res = cv.CreateMat(mat0.height, mat0.width + mat1.width, mat0.type)
    for x in xrange(res.height):
        for y in xrange(mat0.width):
            cv.Set2D(res, x, y, mat0[x, y])
        for y in xrange(mat1.width):
            cv.Set2D(res, x, y + mat0.width, mat1[x, y])
    return res
8
nl ja de
Если вы работаете с матрицами, вы должны использовать cv2 . Его встроенная поддержка массивов numpy делает такие вопросы однострочными.
добавлено автор casper, источник

3 ответы

Если вы используете cv2 (тогда вы получите поддержку Numpy), вы можете использовать функцию Numpy np.hstack ((img1, img2)) для этого.

например:

import cv2
import numpy as np

# Load two images of same size
img1 = cv2.imread('img1.jpg')
img2 = cv2.imread('img2.jpg')

both = np.hstack((img1,img2))
10
добавлено

Вы должны использовать cv2 . Legacy использует cvmat. Но массивы numpy очень просты в работе.

Как было предложено @ abid-rahman-k , вы можете использовать hstack (который я не знал о ), поэтому я использовал это.

h1, w1 = img.shape[:2]
h2, w2 = img1.shape[:2]
nWidth = w1+w2
nHeight = max(h1, h2)
hdif = (h1-h2)/2
newimg = np.zeros((nHeight, nWidth, 3), np.uint8)
newimg[hdif:hdif+h2, :w2] = img1
newimg[:h1, w2:w1+w2] = img

Но если вы хотите работать с кодом Legacy, это должно помочь

Предположим, что высота img0 больше высоты изображения

nW = img0.width+image.width
nH = img0.height
newCanvas = cv.CreateImage((nW,nH), cv.IPL_DEPTH_8U, 3)
cv.SetZero(newCanvas)
yc = (img0.height-image.height)/2
cv.SetImageROI(newCanvas,(0,yc,image.width,image.height))
cv.Copy(image, newCanvas)
cv.ResetImageROI(newCanvas)
cv.SetImageROI(newCanvas,(image.width,0,img0.width,img0.height))
cv.Copy(img0,newCanvas)
cv.ResetImageROI(newCanvas)
3
добавлено

Я знаю, что этот вопрос старый, но я наткнулся на него, потому что я искал конкатенацию массивов, которые являются двумя измерениями (а не просто конкатенацией в 1 измерении).

np.hstack will not do this.

Предполагая, что у вас есть два изображения 640x480 , которые просто используются в двух измерениях, используйте dstack .

a = cv2.imread('imgA.jpg')
b = cv2.imread('imgB.jpg')

a.shape            # prints (480,640)
b.shape            # prints (480,640)

imgBoth = np.dstack((a,b))
imgBoth.shape      # prints (480,640,2)

imgBothH = np.hstack((a,b))
imgBothH.shape     # prints (480,1280)  
                   # = not what I wanted, first dimension not preserverd
1
добавлено
Я думаю, это должен быть новый вопрос, ответ на который я ответил, поскольку этот ответ не связан с оригинальным вопросом
добавлено автор VMAtm, источник
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community