2016-06-25 11 views
13

Napisałem poniższy kod, aby normalizować obraz za pomocą NORM_L1 w OpenCV. Ale obraz wyjściowy był po prostu czarny. Jak rozwiązać ten problem?Normalizowanie obrazów w OpenCV

import cv2 
import numpy as np 
import Image 

img = cv2.imread('img7.jpg') 
gray_image = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
a = np.asarray(gray_image) 


dst = np.zeros(shape=(5,2)) 

b=cv2.normalize(a,dst,0,255,cv2.NORM_L1) 


im = Image.fromarray(b) 

im.save("img50.jpg") 

cv2.waitKey(0) 
cv2.destroyAllWindows() 
+0

Co motywuje do normalizacji obrazu za pomocą L1? –

Odpowiedz

17

Jeśli chcesz zmienić zakres na [0, 1], upewnij się, że typ danych wyjściowych to float.

image = cv2.imread("lenacolor512.tiff", cv2.IMREAD_COLOR) # uint8 image 
norm_image = cv2.normalize(image, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F) 
+3

Python wymagał podania parametru wejściowego dst. W tym przypadku możesz zainicjować norm_image na kopię obrazu i przekazać ją jako dst. – ckirksey3

+1

@ ckirksey3 Po prostu przekazujesz 'None' jako' dst'. Bez sensu dodawanie dodatkowego wiersza kodu. –

7

Po normalizacji macierzy przy użyciu NORM_L1, jesteś dzieląc każdą wartość piksela przez sumę bezwzględnych wartości wszystkich pikseli w obrazie. W rezultacie wszystkie wartości pikseli stają się mniejsze niż 1, a otrzymujesz czarny obraz. Wypróbuj NORM_MINMAX zamiast NORM_L1.

+2

, więc co dokładnie dzieje się w NORM_MINMAX? –

+1

Minimalna wartość pikseli zostanie zmapowana do minimalnej wartości wyjściowej (alfa), a maksymalna wartość piksela zostanie zmapowana do maksymalnej wartości wyjściowej (beta). Wierzę w liniowe skalowanie za wszystko pomiędzy. – rsaxvc

Powiązane problemy