Ошибка при попытке объединить ноль каналов для создания изображения с одним каналом - PullRequest
0 голосов
/ 13 января 2019

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

color = cv2.imread("lohri.jpg")
b,g,r = cv2.split(color)
zeros = np.zeros([b.shape[0], b.shape[1]])
# Make other 2 channels as zeros
only_red = cv2.merge((zeros, zeros, r))

Но при этом я получаю сообщение об ошибке:

OpenCV(3.4.1) Error: Assertion failed (mv[i].size == mv[0].size && mv[i].depth() == depth) in merge, file /io/opencv/modules/core/src/merge.cpp, line 458
Traceback (most recent call last):
File "inspect.py", line 23, in <module>
  only_red = cv2.merge((zeros, zeros, r))
  cv2.error: OpenCV(3.4.1) /io/opencv/modules/core/src/merge.cpp:458: 
  error: (-215) mv[i].size == mv[0].size && mv[i].depth() == depth in 
  function merge

Я не мог понять причину этого. Почему я получаю эту ошибку?

1 Ответ

0 голосов
/ 13 января 2019

Это потому, что, хотя ваша форма нулей правильная, скорее всего, существует несоответствие типов данных. Numpy Zeros docs имеет тип данных по умолчанию numpy.float64. Просто передайте параметр dtype для вашего случая.

color = cv2.imread("lohri.jpg")
b,g,r = cv2.split(color)
zeros = np.zeros(b.shape[0], b.shape[1]], dtype = b.dtype)
#Note that the dtype is most likely np.uint8, and you can use that instead too if you prefer
#zeros = np.zeros([b.shape[0], b.shape[1]], dtype = np.uint8)
#Also note that you can pass shape tuple directly.
#zeros = np.zeros(b.shape, dtype = np.uint8)

# Make other 2 channels as zeros
only_red = cv2.merge((zeros, zeros, r))

РЕДАКТИРОВАТЬ: Вы также можете использовать np.zeros_like, чтобы создать массив с правильной формой и типом данных, что также делает код более четким и лаконичным. Спасибо Марк!

color = cv2.imread("lohri.jpg")
b,g,r = cv2.split(color)
zeros = np.zeros_like(b)
only_red = cv2.merge((zeros, zeros, r))
...