Zaawansowana biblioteka do przetwarzania obrazów

Witam !

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ą ?

ImageMagick / RMagick
http://www.imagemagick.org/script/index.php

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 :wink:

Myślałem u Rubym. Python odpada - kumpel zakodował algorytmy w Pythonie rok temu a chciałem przy okazji nauczyć cię czegoś nowego :slight_smile: D może być dobrym pomysłem. Alternatywą jest zawsze Mathematica :smiley: bo niby w tym powinniśmy to robić :smiley:

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ć :slight_smile:

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ę.

Johny

Dorzuce jeszcze od siebie 3 krakowskie grosze.

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’).

Lua to bardzo ‘maly’ jezyk, oparty na jezyku c - tak bardzo, ze laczenie kodu
jezyka skryptowego (lua) ze statycznym © jest zasadniczo dosc proste.
Piszesz w lua, ale tam gdzie jest wymagane bardzo szybkie przetwarzanie przechodzisz na c.

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

print(x)
print(os.clock() - t)

czas: 0.21 sekundy[/code]

No i znowu każdy fanboy poleca swój nowy ulubiony język :smiley:

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ę :wink:

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.