Добавление одинакового значения для каждого канала в 3-канальном изображении? - PullRequest
2 голосов
/ 02 октября 2019

Я прочитал изображение:

img = cv2.imread("sky.png", 1)

Теперь я хочу добавить один пиксель в каждом столбце для каждого канала. Я попытался это сделать следующим образом:

img[row_1, :, 0] = np.insert(img[row_1,:,0], column_1, some_value)
img[row_1, :, 1] = np.insert(img[row_1,:,1], column_1, some_value)
img[row_1, :, 2] = np.insert(img[row_1,:,2], column_1, some_value)

Есть ли лучший способ сделать это, чем записать каждый канал отдельно?

ОБНОВЛЕНИЕ : КакЯ упомянул, что хочу добавить новый столбец , то есть изображение 4x4, преобразуемое в изображение 4x5. Значение каждого пикселя отличается, и порядок столбцов также не является фиксированным. Например, первый пиксель вставляется в 3 столбца, а второй пиксель вставляется в 1 столбец и т. Д. (С использованием заранее определенного набора столбцов)

Пример:

[
  [1,2,3,4],
  [4,5,6,7],
  [8,9,10,11]
]

Выше приведеноИзображение 3х4 (в действительности это будет 3-х канальное изображение). Я хочу преобразовать это в изображение 3x5, добавив пиксели в [0,2], [1,1], [2,4]

В результате получается:

[
   [1,2, new-pixel-a, 3, 4],
   [4,new-pixel-b, 5, 6, 7]
   [8, 9, 10, 11, new-pixel-c]
]

ТакЯ получаю новое изображение, (3, 5)

1 Ответ

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

Глядя на документацию по методу insert в NumPy, я бы нашел следующее решение:

import cv2
import numpy as np

# Read image; output image dimensions
image = cv2.imread('N8e9S.png')
print(image.shape)

# Set up column indices where to add pixels
colIdx = np.array(image.shape[0] * np.random.rand(image.shape[0]), dtype=np.int32)

# Set up pixel values to add
pixels = np.uint8(255 * np.random.rand(image.shape[0], 3))

# Initialize separate image
newImage = np.zeros((image.shape[0], image.shape[1]+1, 3), np.uint8)

# Insert pixels at predefined locations
for i in range(colIdx.shape[0]):
    newImage[i, :, :] = np.insert(image[i, :, :], colIdx[i], pixels[i, :], axis=0)

# Output (new) image dimensions
print(newImage.shape)

# Show final image
cv2.imshow('image', image)
cv2.imshow('newImage', newImage)
cv2.waitKey(0)
cv2.destroyAllWindows()

Вот входное изображение:

Input

Окончательный вывод выглядит следующим образом:

Output

Вывод на печать для проверки новых размеров изображения:

(241, 300, 3)
(241, 301, 3)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...