2017-01-08 4 views
0

Ich lese zwei Bilder in numby Arrays mit open cv. Ich versuchte zwei verschiedene Gleichungen für das Hinzufügen dieser BilderOpencv Verschiedene Ausgaben mit imshow und imwrite

Gleichung 1: img = (img_one/2) + (img_two/2)

Gleichung 2: img = (0,5 * img_one) + (0,5 * img_two)

Gleichung 1 gibt das Bild wie erwartet aus, aber Gleichung 2 gibt ein Bild völlig unerwartet aus.

Hier ist mein Code (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() 

Originalbilder verwendet:

Tiger image

enter image description here

Die erzeugten Bilder sind wie folgt:

division image

multiplication image

Antwort

4

Der Unterschied der Ausgang ist nicht durch die Verwendung der Betreiber * oder /, aber aufgrund cv2.imshow(), Im ersten Fall, wenn Sie mul_img = 0.5*tiger + 0.5*nature Die dtype der zurückgegebenen Matrix floar32 implizit konvertiert verwenden, da Sie verwendet Gleitkommazahl als einer der Operanden. Aber im zweiten Fall ist die dtype von sowohl der Matrix als auch number nur int, so dass die dtype der zurückgegebenen Matrix von div_img = tiger/2 + nature/2 vom Typ uint8 wäre.

Jetzt cv2.imshow() einige ernsthaften Probleme hat, während 4-Kanal-RGBA Bilder machen, ignoriert er den Alpha-Kanal oder Rendering-Mat mit Gleitkommazahlen usw. Nun sind Sie mit zwei Lösungen links:

  • Verwenden cv2.imwrite() die Bilder zu debuggen:

    cv.imwrite("path/to/img.jpg", mul_img) 
    
  • das Bild vor cv2.imshow()-uint8 Konvertieren

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

danke, das erklärt auch, warum die richtigen Bilder mit imwrite erzeugt wurden. –

Verwandte Themen