2013-02-08 35 views
5

Czy ktoś może mi pomóc, w jaki sposób uzyskać dane pikseli RGB z obrazu w R?Jak uzyskać dane pikseli z obrazu za pomocą R

Potrzebuję tych informacji, aby porównać różnice w upierzeniu ptaków, aby pomóc w zrozumieniu zdarzenia specjacji.

Moje zdjęcia są robione aparatem cyfrowym i są teraz jako plik NEF. Nie ma znaczenia, jaki rodzaj pliku jest potrzebny, mam możliwość przekonwertowania pliku na dowolne urządzenie. Wolałbym jednak zachować jak najwięcej informacji w pliku (np. Pliki PNG są dobre).

Próbowałem wielu paczek w R: Pixmap, Raster, ImageMetrics i przeglądałem Internet, testowałem metody, pytałem studentów itp. Przez kilka tygodni, próbując rozwiązać ten problem. Tutaj w Stackoverflow próbowałem to: How to extract the pixel data Use R's pixmap package?, bez powodzenia. Moje pliki są również zbyt duże dla okna R (cała tablica nie jest wyświetlana) i mam trudności ze zrozumieniem tworzonej macierzy. Najlepszą rzeczą dla mnie byłoby uzyskanie danych jako matrycy lub w inny sposób, który ułatwia zrozumienie, co jest czym. Znalazłem mnóstwo podobnych pytań, ale w innych programach (takich jak Java, C++, IOS, Matlab, Python itp.), Których niestety nie wiem, jak używać.

Moje problemy mogą wynikać z moich niskich umiejętności w tego typu pracach, ale staram się, jak tylko potrafię, o to, co mam. Jeśli ktoś może mi pomóc lub da mi jakieś wskazówki, będę bardzo wdzięczny.

+2

Co to znaczy "nie ma szczęścia"? Kohske dał bardzo dobrą odpowiedź na twoje [poprzednie pytanie] (http://stackoverflow.com/questions/6085090/how-to-extract-the-pixel-data-use-rs-pixmap-package). Bądź bardziej dokładny. Czy próbowałeś dostosować swoje rozwiązanie? Dlaczego to nie działa? – Andrie

+0

Prawdopodobnie będziesz znacznie szczęśliwszy używając ImageJ (lub nawet GraphicConverter, jeśli masz dostęp do OS X). Tymczasem zakładając, że ptasi faerzy zasłaniają tylko część obrazu, wyodrębnij podzbiory tablic, aby zminimalizować rozmiar danych, z którymi się zmagasz. –

+0

@Andrie, przepraszam, że tego nie widziałem, jak widzicie w mojej edycji, źle zrozumiałem, co robię. Jednakże, jeśli jesteś zainteresowany, dostałem ten komunikat o błędzie próbujący przetestować odpowiedź bill_080: obrazek @ rozmiar "Błąd: próba uzyskania" rozmiaru "gniazda z obiektu klasy podstawowej (" tablica ") bez gniazd" – MariaBioStudent

Odpowiedz

7

Najpierw wygenerować Przykładem png obraz:

png("/tmp/test.png") 
plot(rnorm(100)) 
dev.off() 

Następnie przekonwertować go do formatu czytelnego przez pixmap: tutaj przekonwertować png do pliku ppm jak chcę zachować informacje kolorach. Używam ImageMagick z linii poleceń, ale można używać niezależnie od programu, który chcesz:

$ convert /tmp/test.png /tmp/test.ppm 

Następnie można odczytać obrazu z funkcją read.pnm z pakietu pixmap:

x <- read.pnm("/tmp/test.ppm") 

a potem, można użyć szczelin [email protected], [email protected], [email protected] (lub [email protected] dla obrazu w skali szarości), aby uzyskać wartość pikseli dla każdego kanału jako matrycy. Można sprawdzić, że wymiary matryc są takie same jak od wielkości obrazu:

dim([email protected]) 
[1] 480 480 
+0

Dzięki, teraz wiem na pewno, że jestem na dobrej drodze! :) – MariaBioStudent

+0

Jeśli to rozwiązało Twoje pytanie, możesz zaznaczyć zielony znacznik, aby wskazać go innym użytkownikom. – juba

1

wziąć to małej próbki 3x3 piksela obrazu PNG:

sample image

wówczas:

library('png') 
download.file('http://i.stack.imgur.com/hakvE.png', 'sample.png') 
img <- readPNG('sample.png') 
pix.top.left <- img[1,1,]  # row 1, column 1 
pix.bottom.left <- img[3,1,] # row 3, column 1 
pix.top.right <- img[1,3,] # row 1, column 3 

Jeśli czytasz obraz PNG z kanałem alfa (jak na powyższym obrazku), to każda zmienna pix. jest wektorem z czterema wpisami , każdy wpis odpowiadający wartościom czerwonego, zielonego, niebieskiego i alfa piksela.

> pix.top.left 
[1] 1 0 0 1 
Powiązane problemy