Объедините блоки разных изображений и создайте новое изображение - PullRequest
1 голос
/ 14 октября 2019

У меня шесть фотографий. Я изменил их в структуру блока. Рассмотрим изображение размером 200х200. 1. Я преобразовал в блоки 10х10, так что теперь у меня есть всего 400 блоков размером 10х10. Я сделал это для каждого изображения. 2. Затем я нашел среднее значение для каждого блока. Снова для всех изображений. 3. Найден максимум средних значений всех блоков. Итак, теперь у меня есть массив длиной 400, где каждое значение является максимальным значением блока. 4. Также найдены индексы этих максимальных значений (номер блока и номер изображения)

Теперь, используя это изображение и номер блока, я хочу создать изображение таким образом, чтобы оно выбирало блоки из исходных изображений и помещало их впустые изображения, чтобы сделать окончательное изображение. Один из подходов, который я думал, состоял в том, чтобы выбирать блоки по строкам и сопоставлять их с исходным изображением. Затем поместите этот блок в пустое изображение, чтобы тот же блок был помещен в пустое изображение, как и исходное изображение. Это может быть неправильно, но у меня только есть идея, но я все еще не знаю, как это сделать.

img = [cv2.imread(file,0) for file in glob.glob("resized/*.jpg")]
X=[]
for im in img:
    arr = np.asarray(im)
    arr = np.split(arr, 20)
    arr = np.array([np.split(x, 20, 1) for x in arr])
    mat = [arr[i][j].mean() for i in range(20) for j in range(20)]
    X.append(mat)
max_X = list(zip(*X))
result = [max(i) for i in max_X]
print(result)
image_number = np.argmax(X,axis=0)
print(image_number)
result1 = [(row.index(max(row)),index) for index, row in enumerate(max_X)]
print(result1)
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (0, 10), (0, 11), (0, 12), (0, 13), (0, 14), (0, 15), (0, 16), (0, 17), (0, 18), (0, 19), (0, 20), (0, 21), (0, 22), (0, 23), (0, 24), (0, 25), (0, 26), (0, 27), (0, 28), (0, 29), (0, 30), (0, 31), (0, 32), (0, 33), (0, 34), (0, 35), (0, 36), (0, 37), (0, 38), (0, 39), (0, 40), (0, 41), (0, 42), (0, 43), (0, 44), (0, 45), (1, 46), (2, 47), (0, 48), (0, 49), (0, 50), (0, 51), (0, 52), (0, 53), (0, 54), (0, 55), (0, 56), (0, 57), (0, 58), (0, 59), (0, 60), (0, 61), (0, 62), (0, 63), (1, 64), (0, 65), (2, 66), (2, 67), (0, 68), (0, 69), (0, 70), (0, 71), (0, 72), (0, 73), (0, 74), (0, 75), (0, 76), (0, 77), (0, 78), (0, 79), (0, 80), (0, 81), (0, 82), (4, 83), (0, 84), (1, 85), (0, 86), (0, 87), (0, 88), (0, 89), (0, 90), (0, 91), (0, 92), (0, 93), (0, 94), (0, 95), (2, 96), (0, 97), (0, 98), (0, 99), (0, 100), (3, 101), (2, 102), (2, 103), (0, 104), (0, 105), (3, 106), (3, 107), (0, 108), (4, 109), (5, 110), (0, 111), (4, 112), (0, 113), (4, 114), (0, 115), (4, 116), (0, 117), (0, 118), (0, 119), (0, 120), (5, 121), (2, 122), (2, 123), (0, 124), (0, 125), (0, 126), (4, 127), (0, 128), (0, 129), (0, 130), (0, 131), (0, 132), (0, 133), (0, 134), (0, 135), (2, 136), (4, 137), (0, 138), (0, 139), (0, 140), (2, 141), (2, 142), (5, 143), (0, 144), (0, 145), (4, 146), (5, 147), (0, 148), (0, 149), (0, 150), (0, 151), (0, 152), (0, 153), (0, 154), (0, 155), (0, 156), (3, 157), (0, 158), (0, 159), (0, 160), (5, 161), (1, 162), (0, 163), (5, 164), (0, 165), (5, 166), (0, 167), (0, 168), (0, 169), (0, 170), (0, 171), (0, 172), (0, 173), (0, 174), (0, 175), (4, 176), (0, 177), (4, 178), (0, 179), (5, 180), (5, 181), (0, 182), (0, 183), (3, 184), (5, 185), (5, 186), (0, 187), (0, 188), (0, 189), (0, 190), (0, 191), (0, 192), (0, 193), (0, 194), (0, 195), (0, 196), (0, 197), (0, 198), (0, 199), (2, 200), (5, 201), (0, 202), (0, 203), (0, 204), (4, 205), (0, 206), (0, 207), (0, 208), (0, 209), (0, 210), (0, 211), (0, 212), (0, 213), (0, 214), (0, 215), (4, 216), (0, 217), (0, 218), (0, 219), (5, 220), (3, 221), (2, 222), (0, 223), (5, 224), (4, 225), (4, 226), (0, 227), (0, 228), (0, 229), (0, 230), (0, 231), (4, 232), (4, 233), (0, 234), (3, 235), (0, 236), (0, 237), (0, 238), (0, 239), (3, 240), (5, 241), (1, 242), (0, 243), (4, 244), (0, 245), (5, 246), (0, 247), (4, 248), (0, 249), (0, 250), (4, 251), (4, 252), (3, 253), (0, 254), (0, 255), (0, 256), (0, 257), (0, 258), (0, 259), (0, 260), (5, 261), (5, 262), (2, 263), (0, 264), (0, 265), (3, 266), (2, 267), (0, 268), (0, 269), (3, 270), (5, 271), (2, 272), (0, 273), (0, 274), (0, 275), (0, 276), (0, 277), (0, 278), (0, 279), (4, 280), (4, 281), (2, 282), (1, 283), (0, 284), (0, 285), (3, 286), (2, 287), (0, 288), (0, 289), (5, 290), (2, 291), (2, 292), (0, 293), (0, 294), (0, 295), (0, 296), (0, 297), (0, 298), (0, 299), (0, 300), (0, 301), (4, 302), (4, 303), (1, 304), (1, 305), (0, 306), (0, 307), (0, 308), (0, 309), (4, 310), (2, 311), (3, 312), (0, 313), (0, 314), (0, 315), (1, 316), (0, 317), (0, 318), (0, 319), (0, 320), (0, 321), (0, 322), (0, 323), (1, 324), (2, 325), (2, 326), (2, 327), (0, 328), (0, 329), (0, 330), (4, 331), (0, 332), (2, 333), (2, 334), (0, 335), (0, 336), (0, 337), (0, 338), (0, 339), (0, 340), (0, 341), (0, 342), (0, 343), (0, 344), (0, 345), (0, 346), (2, 347), (0, 348), (0, 349), (0, 350), (0, 351), (0, 352), (0, 353), (0, 354), (0, 355), (0, 356), (0, 357), (0, 358), (0, 359), (0, 360), (0, 361), (0, 362), (0, 363), (0, 364), (0, 365), (0, 366), (0, 367), (0, 368), (0, 369), (0, 370), (0, 371), (0, 372), (0, 373), (0, 374), (0, 375), (0, 376), (0, 377), (0, 378), (0, 379), (0, 380), (0, 381), (0, 382), (0, 383), (0, 384), (0, 385), (0, 386), (0, 387), (0, 388), (0, 389), (0, 390), (0, 391), (0, 392), (0, 393), (0, 394), (0, 395), (0, 396), (0, 397), (0, 398), (0, 399)]

В этом у нас есть номер изображения и номер блока. Теперь я хочу выбрать блок 0 из изображения 0 и вставить пустое изображение и так далее. Надеюсь, это прояснит ожидаемый результат.

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Итак, вот мой подход к вашей проблеме. Я переписал части вашего кода, чтобы избавиться от всех списков, и работал исключительно над массивами NumPy. Поэтому я храню все изображения в 4D-массиве и сохраняю все вычисленные «блочные значения» в 3D-массиве. Наконец, я использую найденный массив image_number, чтобы сгенерировать некий «индексный массив», используя метод OpenCV resize с INTER_AREA флагом интерполяции ( "повторной выборки)используя отношение площади пикселя "). При этом создание вашего окончательного изображения может быть очень легко выполнено с помощью индексации логического массива NumPy .

Давайте посмотрим на следующий код:

import cv2
import numpy as np

# Read images in one single 4D array; resize to [200, 200]
nImages = 3
images = np.zeros((200, 200, 3, nImages), np.uint8)
images[:, :, :, 0] = cv2.resize(cv2.imread('U2Gmz.png', cv2.IMREAD_COLOR), (200, 200))
images[:, :, :, 1] = cv2.resize(cv2.imread('OZxf3.png', cv2.IMREAD_COLOR), (200, 200))
images[:, :, :, 2] = cv2.resize(cv2.imread('aISEB.png', cv2.IMREAD_COLOR), (200, 200))

# Calculate block means and store in one single 3D array
means = np.zeros((20, 20, nImages), np.uint8)
for im in range(nImages):
    arr = np.split(images[:, :, :, im], 20)
    arr = np.array([np.split(x, 20, 1) for x in arr])
    means[:, :, im] = np.reshape([arr[i][j].mean() for i in range(20) for j in range(20)], (20, 20))

# Determine block mean maximum over all images
result = np.max(means, axis=2)

# Determine index of block mean maximum over all images
image_number = np.argmax(means, axis=2)
print(image_number)

# Resize index array with "resampling using pixel area relation" to final image size
image_number_idx = cv2.resize(np.uint8(image_number), (200, 200), interpolation=cv2.INTER_AREA)

# Generate final image by boolean array indexing
final = np.zeros((200, 200, 3), np.uint8)
for im in range(nImages):
    idx = image_number_idx == im
    final[idx, :] = images[idx, :, im]

# Show images
cv2.imshow('image1', images[:, :, :, 0])
cv2.imshow('image2', images[:, :, :, 1])
cv2.imshow('image3', images[:, :, :, 2])
cv2.imshow('final', final)

cv2.waitKey(0)
cv2.destroyAllWindows()

Это используемые изображения:

Input 1

Input 2

Input 3

Выход image_number дает следующее:

[[0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0]
 [1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0]
 [1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0]
 [0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1]
 [0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0]
 [0 0 0 0 0 0 0 2 1 1 1 2 0 0 0 0 0 1 0 0]
 [0 0 0 0 0 0 0 2 1 0 0 2 2 2 0 0 0 1 1 0]
 [0 0 0 0 0 2 2 2 1 0 2 2 2 2 0 0 0 1 1 0]
 [0 0 0 0 0 2 2 2 0 0 0 0 2 2 2 0 0 0 0 0]
 [0 0 0 0 2 2 2 2 0 0 0 0 2 2 2 2 0 0 0 0]
 [0 0 0 0 2 0 2 2 0 0 0 0 2 0 0 0 0 0 0 0]
 [1 1 0 0 0 2 2 0 0 2 2 0 0 2 0 0 0 0 0 0]
 [1 1 0 0 2 2 2 0 2 2 2 2 1 2 2 2 2 0 2 1]
 [1 0 0 0 0 2 2 2 2 0 2 2 2 2 2 2 0 1 1 1]
 [1 1 1 0 0 2 2 2 1 1 1 2 2 2 2 0 0 1 1 0]
 [1 1 1 1 1 1 1 1 1 1 1 2 0 0 1 0 0 0 0 0]
 [1 1 1 1 1 1 0 1 1 1 1 1 0 2 0 0 0 0 0 0]
 [1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1]]

А,окончательное изображение выглядит так:

Output

Надеюсь, я правильно понял ваш вопрос, и именно этого вы и хотели достичь.

Я предполагаю, что все входные изображения имеют одинаковые размеры изображения, (200, 200) здесь. В противном случае, я не мог бы придумать способ управления потенциально меняющимися размерами блоков, если бы была исправлена ​​только «сетка», (20, 20) здесь.

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ: Чтобы прочитать все jpg файлов из данной папки, вы можете использовать:

files = glob.glob('resized/*.jpg')

# Read images in one single 4D array; resize to [200, 200]
nImages = len(files)
images = np.zeros((200, 200, 3, nImages), np.uint8)
for im in range(nImages):
    images[:, :, :, im] = cv2.resize(cv2.imread(files[im], cv2.IMREAD_COLOR), (200, 200))
0 голосов
/ 14 октября 2019

Я считаю, что вам интересно знать, как объединить два или более изображений. В python, когда вы загружаете изображение с помощью opencv, оно сохраняется в виде массивов. Так что легко использовать NumPy. Ниже приведен пример объединения двух изображений. Во-первых, загрузите два изображения:

import cv2
import numpy as np

img1 = cv2.imread('pic1.png')
img2 = cv2.imread('pic2.png')

cv2.imshow('img1', img1)
cv2.imshow('img2', img2)

эти два изображения имеют вид:

enter image description here enter image description here

Затем объединить эти два imgs:

# get the height and width of those pictures
h1, w1 = img1.shape[:2]
h2, w2 = img2.shape[:2]

# define the height and width of the merged pictures
h, w = max(h1, h2), w1 + w2
img = np.zeros((h, w, 3), np.uint8)

# paste each img to the right place
img[0:h1, 0:w1] = img1
img[0:h2, w1:] = img2

cv2.imshow('img', img)
cv2.waitKey(0)

результат будет такой:

enter image description here

...