2017-01-08 2 views
0

Я прочитал два изображения в массивах numpy, используя открытый cv. Я попробовал два различных уравнения для добавления этих изображенийOpencv Различные выходы с imshow и imwrite

Уравнение 1: IMG = (img_one/2) + (img_two/2)

Уравнение 2: IMG = (0,5 * img_one) + (0,5 * img_two)

Уравнение 1 выводит изображение как ожидалось, но уравнение 2 выводит изображение совершенно неожиданным.

Вот мой код (python2):

import numpy as np 
from cv2 import * 

tiger = imread('tiger.jpg') 
nature = imread('nature.jpg') 

mul_img = 0.5*tiger + 0.5*nature 
div_img = tiger/2 + nature/2 

imshow('mul_image', mul_img) 
imshow('div_image', div_img) 
waitKey(0) 
destroyAllWindows() 

Оригинальные изображения используются:

Tiger image

enter image description here

Изображения, полученные следующим образом:

division image

multiplication image

ответ

4

Разница производства не связано с использованием оператора * или /, но из-за cv2.imshow(), В первом случае при использовании mul_img = 0.5*tiger + 0.5*naturedtype возвращаемой матрицы неявно преобразуется в floar32, потому что вы использовали плавающее число как один из операндов. Но во втором случае dtype как матрицы, так и number составляет только int, поэтому dtype возвращенной матрицы от div_img = tiger/2 + nature/2 будет иметь тип uint8.

Теперь cv2.imshow() имеет некоторые серьезные проблемы при визуализации RGBA изображений 4-канальный, он игнорирует альфа-канал или рендеринга Mat с числами с плавающей запятой, и т.д. Теперь вы остались с 2 решения:

  • Использование cv2.imwrite() отлаживать изображения:

    cv.imwrite("path/to/img.jpg", mul_img) 
    
  • Преобразовать изображение в uint8 перед тем cv2.imshow()

    mul_img = mul_img.astype(np.uint8) 
    
+0

спасибо, что также объясняет, почему правильные изображения генерировались при использовании imwrite. –

Смежные вопросы