
Verwenden Sie cv2.vconcat(), cv2.hconcat(), um Bilder vertikal und horizontal mit Python, OpenCV zu verketten (kombinieren). v bedeutet vertikal und h horizontal.
Übergeben Sie eine Liste von Bildern (ndarray), wird ein Bild (ndarray) zurückgegeben, in dem die Bilder in der Liste vertikal oder horizontal verkettet sind. Bilder mit unterschiedlichen Größen müssen zuvor in der Größe angepasst werden. Ein Fehler wird ausgelöst, wenn die Breite oder Höhe nicht ausgerichtet ist.
Dieser Artikel passt die folgenden Inhalte mit Beispielcodes.
- Vertikal verketten:
cv2.vconcat()
- Horizontal verketten:
cv2.hconcat()
- Vertikal und horizontal verketten (wie Kacheln)
Lesen Sie als Beispiel zwei Bilder.
import cv2
import numpy as np
im1 = cv2.imread('data/src/lena.jpg')
im2 = cv2.imread('data/src/rocket.jpg')
numpy.tile() ist praktisch, wenn Sie dasselbe Bild wiederholt anordnen.
Weitere Informationen zur Bildverkettung mit Pillow und scikit-image finden Sie in den following Artikeln. Für Bilder gleicher Größe ist scikit-image einfach zu verwenden. Sie können auch einen Rahmen zwischen den Bildern hinzufügen.
Vertikal verketten:cv2.vconcat()
Bilder gleicher Breite vertikal verketten
Beim vertikalen Verketten von Bildern gleicher Breite kann cv2.vconcat() unverändert verwendet werden.
im_v = cv2.vconcat([im1, im1])
cv2.imwrite('data/dst/opencv_vconcat.jpg', im_v)
Wiederholen Sie dasselbe Bild vertikal
Sie können auch np.tile() verwenden, wenn Sie dasselbe Bild wiederholt anordnen.
im_v_np = np.tile(im1, (2, 1, 1))
cv2.imwrite('data/dst/opencv_vconcat_np.jpg', im_v_np)
Verketten Sie Bilder unterschiedlicher Breite vertikal
Es ist sinnvoll, eine Funktion zu definieren, um Bilder unterschiedlicher Breite zu kombinieren. Hier wird die Größe des größten geändert.
shape[0] repräsentierte Höhe und shape[1] repräsentierte Breite.
def vconcat_resize_min(im_list, interpolation=cv2.INTER_CUBIC):
w_min = min(im.shape[1] for im in im_list)
im_list_resize = [cv2.resize(im, (w_min, int(im.shape[0] * w_min / im.shape[1])), interpolation=interpolation)
for im in im_list]
return cv2.vconcat(im_list_resize)
im_v_resize = vconcat_resize_min([im1, im2, im1])
cv2.imwrite('data/dst/opencv_vconcat_resize.jpg', im_v_resize)
Listenverständnisse Werden used, um Eine Liste von Bildern mit geänderter Größe zu erstellen.
Horizontal verketten:cv2.hconcat()
Der horizontale Fall ist im Grunde das gleiche Konzept wie der vertikale Fall.
Bilder gleicher Höhe horizontal verketten
Beim horizontalen Verketten von Bildern gleicher Höhe kann cv2.hconcat() unverändert verwendet werden.
im_h = cv2.hconcat([im1, im1])
cv2.imwrite('data/dst/opencv_hconcat.jpg', im_h)
Wiederholen Sie dasselbe Bild horizontal
Sie können auch np.tile() verwenden, wenn Sie dasselbe Bild wiederholt anordnen.
im_h_np = np.tile(im1, (1, 2, 1))
cv2.imwrite('data/dst/opencv_hconcat_np.jpg', im_h_np)
Verketten Sie Bilder unterschiedlicher Höhe horizontal
Wie bei der vertikalen Verkettung ist es sinnvoll, eine Funktion zum Kombinieren von Bildern unterschiedlicher Größe zu definieren. Hier wird die Größe des größten geändert.
def hconcat_resize_min(im_list, interpolation=cv2.INTER_CUBIC):
h_min = min(im.shape[0] for im in im_list)
im_list_resize = [cv2.resize(im, (int(im.shape[1] * h_min / im.shape[0]), h_min), interpolation=interpolation)
for im in im_list]
return cv2.hconcat(im_list_resize)
im_h_resize = hconcat_resize_min([im1, im2, im1])
cv2.imwrite('data/dst/opencv_hconcat_resize.jpg', im_h_resize)
Vertikal und horizontal verketten (wie Kacheln)
Verketten Sie Bilder derselben Größe vertikal und horizontal
Mit cv2.vconcat() und cv2.hconcat() können Bilder vertikal und horizontal in Kachelform verkettet werden.
Eine Funktion, die Bilder gleicher Größe mit einer 2D-Liste (Array) verkettet, kann wie folgt definiert werden:
def concat_tile(im_list_2d):
return cv2.vconcat([cv2.hconcat(im_list_h) for im_list_h in im_list_2d])
im1_s = cv2.resize(im1, dsize=(0, 0), fx=0.5, fy=0.5)
im_tile = concat_tile([[im1_s, im1_s, im1_s, im1_s],
[im1_s, im1_s, im1_s, im1_s],
[im1_s, im1_s, im1_s, im1_s]])
cv2.imwrite('data/dst/opencv_concat_tile.jpg', im_tile)
Das Beispiel verwendet der Einfachheit halber dasselbe Bild, aber es ist nützlich, WENN SIE sterben Ergebnisse der Änderung der Bildverarbeitungskoeffizienten vergleichen.
Verketten Sie vergrößern Bilder vertikal und horizontal
Wenn dasselbe Bild wiederholt angeordnet wird, kann np.tile() wie zuvor verwendet werden.
Stellen Sie beim Verketten von Farbbildern (3D-Darray) den second Parameter (Wiederholungen) auf (Vertikale Wiederholungszahl, horizontale Wiederholungszahl, 1). Stellen Sie für Graustufenbilder (2D ndarray) die Wiederholungen auf (n vertikal, n horizontal) ein.
Weitere Informationen zu np.tile() finden Sie im following Artikel.
Verketten Sie Bilder unterschiedlicher Größe in vertikalen und horizontalen Kacheln
Wenn Sie Bilder unterschiedlicher Größe in vertikalen und horizontalen Kacheln verketten, verwenden Sie die oben definierte Größenänderungs- und Verkettungsfunktion.
def concat_tile_resize(im_list_2d, interpolation=cv2.INTER_CUBIC):
im_list_v = [hconcat_resize_min(im_list_h, interpolation=cv2.INTER_CUBIC) for im_list_h in im_list_2d]
return vconcat_resize_min(im_list_v, interpolation=cv2.INTER_CUBIC)
im_tile_resize = concat_tile_resize([[im1],
[im1, im2, im1, im2, im1],
[im1, im2, im1]])
cv2.imwrite('data/dst/opencv_concat_tile_resize.jpg', im_tile_resize)