Mam zaimplementować w dowolnym języku oprogramowania algorytm do wyszukiwania zdjęć. Chodzi o to, że pokazuje się algorytmowi zdjęcie motyla i w przykładowym zbiorze 300 zdjęć każe się szukać motyli.
Do operacji będę potrzebował możliwości wpisania obrazu jako macierzy składowych RGB. Transformacji na inne opisy RGB <-> HSV <-> rgb, tworzenie histogramów, kwantyzację składowych obrazu i obliczania dla niego różnych wartości. Właściwie większość algorytmów mogę sobie sam zaimplementować (nie ma problemu). Jaki jest wybór bibliotek graficznych do Rubego i co potrafią ?
Tylko część tego, czego oczekujesz (bardziej “życiowe” przetwarzanie obrazów niż algorytmy do analizy). Obawiam się, że czeka Cię samodzielna implementacja lub po prostu… zmiana języka na taki mający odpowiadającą Ci bibliotekę.
I owszem, algorytmy do cyfrowej analizy obrazu - przynajmniej te które przedstawiłeś - są bardzo proste, więc po konwersji na jakiś format bitmapowy (albo ogólnie użyciu biblioteki, która udostępni Ci obraz jako macierz prostokątną) i tak jesteś w domu.
Swoją drogą jeśli zamierzasz robić jakieś ostre mielenie numerków - a łażenie po sporych macierzach i zbieranie oraz ekstrakcja z nich wszelkich informacji zdecydowanie do takich należą - to Ruby jest zasadniczo słabym pomysłem. Pomyśl o jakimś języku niższego poziomu z dobrym wsparciem dla tablic o stałej wielkości. Osobiście polecałbym z całego serca D, ale w najgorszym wypadku może być i C
Myślałem u Rubym. Python odpada - kumpel zakodował algorytmy w Pythonie rok temu a chciałem przy okazji nauczyć cię czegoś nowego D może być dobrym pomysłem. Alternatywą jest zawsze Mathematica bo niby w tym powinniśmy to robić
Swoją drogą - jest jakaś biblioteka do ładowania obrazków dla języka D ?
Dokładnie dla D to nie wiem / nie sądzę (język jest dość młody i ekosystem bibliotek ma niewielki), ale D potrafi korzystać z bibliotek napisanych dla C i do nich linkować
Małym druczkiem: musisz tylko plik .h biblioteki przetłumaczyć na plik .d z deklaracjami funkcji prependowanymi “extern C”. Przykład masz tutaj: http://github.com/tomash/rudy/tree/master . przykład dość ekstremalny, bo API rubiego ma bardzo dużo funkcji w pliku .h. Tak naprawdę potrzebujesz przepisania (albo skorzystania z gotowych narzędzi do konwersji: htod lub bcd.gen) deklaracji tylko tych funkcji, z których zamierzasz korzystać.
W sumie to zależy jeszcze czy chodzi Ci o sam fakt zaimplementowania powyższych algorytmów, czy także o dużą wydajność? Bo jeśli chcesz po prostu napisać te algorytmy (tak jak kolega zrobił w pythonie) to nie ma problemu, skorzystaj z RMagick do wczytywania bitmap, a operacje na pikselach zaimplementujesz w Rubym. Jeśli zależy Ci na wydajności to musisz zrezygnować z Rubiego na rzecz bardziej niskopoziomowego języka, np. C/C++ czy tam D (którego Tomash zachwala). Niekoniecznie musi to oznaczać całkowitą rezygnację z Rubiego, bo jeśli zaimplementujesz te algorytmy w konkretne funkcje to możesz potem spiąć to z Rubym, albo poprzez klasyczny extension C, albo (tu z kolei ja gorąco Ci polecam) FFI (http://radarek.jogger.pl/2009/03/04/biblioteka-ffi-laczymy-ruby-z-c/). Moim zdaniem ma to sens, ponieważ łączysz w ten sposób szybkość C i łatwość operowania na danych w Ruby.
Masz jeszcze inną możliwość: JRuby, czyli to co poprzednio ale zamiast C masz Javę.
Radarek i Tomash dobrze pytaja o co tak naprawde chodzi w Twoim projekcie - jezeli o
implementacje algorytmow bez walki o kazda sekunde przetwarzania to wybierz Ruby.
Latwo, prosto, przyjemnie (troche wolno - przynajmniej wersja 1.8.6).
Natomiast Ja chcialbym ci polecic inny jezyk skryptowy - tym jezykiem
jest lua.
Nie wiem czy znasz oprogramowanie Adobe Lightroom - interfejs do OS
zostal napisany w c++ natomiast obrobka zdjec w lua (‘lua po portugalsku to ksiezyc’).
Oczywiscie jak w zyciu - cos za cos. Lua jest mala - sam jezyk jest zakodowany
w 17000 lini c i niestety czesc ‘oczywistych’ zachowan jezyka trzeba sobie samemu
zakodowac np. przechwytywanie wyjatkow - przez co bardzo ubolewam.
A tak na zachete czas wykonywania sie petli for w Ruby 1.8.6 i w Lua 5.1.2
(dell xps, 4 GB RAM, Core 2 Duo 2 GHz, Ubuntu 8.04)
Petla wykonywana (dziesiec milionow razy):
[code]Ruby
t = Time.now
x = 0
for i in 1…10000000
x = i + 1
end
puts x
puts Time.now - t
czas: 9.25 sekund[/code]
[code]Lua
local t = os.clock()
local x = 0
for i = 1, 10000000 do
x = x + 1
end
No i znowu każdy fanboy poleca swój nowy ulubiony język
Dlatego właśnie nie powinieneś słuchać mnie jeśli chodzi o D, Radarka jeśli chodzi o FFI (nie tyle język, co technologia “klejąca”), a Tusli jeśli chodzi o Luę
Rubiego bym nie polecał, to po prostu nie jest język do operacji na plikach binarnych. Weź coś low-level, w czym zarazem będziesz się czuł wygodnie.