2015-01-17 25 views
5

Próbuję wyświetlić obraz RGB o wymiarach 32x32 pikseli w formacie CIFAR-10. Jest to tablica numpy, w której wartości pikseli (uint8) są ułożone w następujący sposób: "Pierwsze 1024 bajty to wartości czerwonego kanału, następne 1024 zielone, a ostatnie 1024 niebieskie. Wartości są przechowywane w kolejności rzędowej, więc pierwsze 32 bajty to wartości czerwonego kanału w pierwszym wierszu obrazu. "Jak wyświetlić obraz RGB przy użyciu pylab

Zatem, oryginalny obraz kształt:

numpy.shape(image) 
(3072L,) 

I przekształcić go tak:

im = numpy.reshape(image, (32,32,3)) 

Jednak gdy próbuję

imshow(im) 

w konsoli ipython widzę 3 na 3 kafelki oryginalnego obrazu: enter image description here

Spodziewałem się zobaczyć zamiast tego pojedynczy obraz samochodu. Widziałem tutaj this question, ale nie jestem pewien, co tam robią i czy jest to istotne dla mojej sytuacji.

Odpowiedz

8

Spróbuj zmienić zamówienie. Domyślnie jest to ciągłe C (co w rzeczywistości jest to row-major), ale w przypadku matplotlib będziesz potrzebował wartości czerwonego kanału w [:,:,0]. Oznacza to, że powinieneś odczytać te dane w kolejności Fortran, tak aby najpierw wypełniały "kolumny" (w tym kontekście 3D).

im = numpy.reshape(c, (32,32,3), order='F') 
12

Wiem, że minęło trochę czasu od opublikowania pytania, ale chcę poprawić odpowiedź Olivera. Jeśli zamówisz przez Fortran, obraz zostanie odwrócony i obrócony o 90 stopni w prawo.

Nadal możesz trenować na tych danych, jeśli sformatujesz wszystkie obrazy w ten sposób. Ale aby uniemożliwić wariuję, należy wykonać następujące czynności:

im = c.reshape(3,32,32).transpose(1,2,0) 

Co robisz najpierw przekształcenia macierzy przy użyciu domyślnego formatu, który dostaje RGB w pierwszym wymiarze, a następnie wiersze i kolumny w drugiej dwa wymiary. Następnie przenosisz wymiary tak, aby pierwszy wymiar oryginału (RGB, indeksowany na 0) został przełączony na trzeci wymiar, a drugi i trzeci wymiar przesuwały się o 1.

Mam nadzieję, że to pomogło.

+0

Dzięki. Aby narysować obraz 'im' w OpenCV, powinieneś zamienić kolumny R i B. 'cv2.imshow (" image ", cv2.resize (cv2.cvtColor (im, cv2.COLOR_BGR2RGB), (512,512), interpolacja = cv2.INTER_AREA))' – Ruut

Powiązane problemy