[algorytm/python] Bezstratny obrót JPEG

0

Kopię google i nic.. to oznacza, że źle szukam raczej niż że tego nie ma ;)

Poszukuję algorytmu bezstratnego obrotu plików JPEG. Umieściłem w Innych, bo język jest mi obojętny (przetłumaczę sobie), jednak docelowo będzie to program na Symbiana i chcę to napisać w Pythonie.

<font size="1" color="#666">To będzie jedna z 3 funkcji programu. Generalnie program ma synchronizować plik MGXCollections.dat z fizyczną strukturą katalogów na dysku - żeby po ściąganiu fotek na PC zachować katalogi wirtualne z galerii - i odwrotnie - z fizycznych katalogów w telefonie utworzyć katalogi wirtualne w galerii. Nie wiem dlaczego od razu tak tego nie napisali, ale od tego Symbian by sobie samemu to poprawić ;)</span>

0

hmm, bezstratne operacje na jpegach polegają na zdekodowaniu jpega do postaci skwantowanych (?) współczynników falowych (tzn. tego co zostało po transformacie dct i kwantyzacji - samego odwrotnego dct nie robimy, robimy tylko dekodowanie huffmana, nie robimy też dekwantyzacji).

np: jasność można zmieniać przez manipulowanie współczynnikiem dc (tym głównym, który zawiera najwięcej energii).

odbicie obrazka względem prostej y = -x to odbicie współczynników względem tej samej prostej.

ogólnie radziłbym pokombinować empirycznie, tzn. utworzyć sobie obrazek w skali szarości (żeby nie męczyć się z kolorami i próbkowaniem), w którym wkleić jakiś blok 8x8 (wielkość bloku dct w jpegu) różnie poobracany i poodbijany, a następnie porównać otrzymane wartości po transformacie dct.

myślę, że będzie trzeba zastosować operacje typu odbijanie względem jakiejś prostej lub zamiana znaku jakichś współczynników (czyli operacje symetryczne i nie powodujące błędów zaokrągleń).

edit:
no, dobrze mówłem.

rotacja o 90 stopni:
G(u, v) = F(v, u) * (-1) ^ v;
(znalezione tutaj: http://homepages.cae.wisc.edu/~ece533/project/f06/sanchez.pdf ; po trzech sekundach googlowania)

oczywiście robione na współczynnikach, nie pikselach.

łącząc odbicie względem prostej y = -x i iterowaniem obracania o 90 stopni dostajemy wszystkie możliwości obrotu/ odbicia.

0

Nie chcę zabaw empirycznych - potrzebuję gotowego kodu. Istnieją setki takich programów, które to wykonują - niestety nie znalazłem kodu źródłowego. Dostęp do netu [jeszcze ~2 tyg] mam tylko w pracy i poświęciłem tyle czasu na szukanie ile mogłem. Dlatego zwracam się z prośbą o pomoc w tej kwestii. Gdybym chciał się bawić w rozbijanie JPEGa na części pierwsze to bym nie tworzył wątku.

0

no do c jest przecież ijg i tam jest wszystko. jeśli chcesz w pytonie od razu, to znajdź sobie libkę w pythonie i w miejscu, gdzie możesz bawić się pojedyńczymi bloczkami robisz transformaty.

podsumowując (operacje na współczynnikach = operacje na pikselach)
negowanie nieparzystych kolumn = odbijanie w poziomie
negowanie nieparzystych wierszy = odbijanie w pionie
odbijanie względem prostej (y = -x) = odbijanie względem prostej (y = -x)

i tyle teorii. cały program możesz napisać sobie sam ;D

0

Ech, rozpisujesz się o odbiciach, jasności, podajesz wzory matematyczne.. czy naprawdę tak niewyraźnie piszę? :|

A co do

do c jest przecież ijg
to dlaczego piszesz "przecież" - nie widzę wspomnienia tego w pierwszy poście. Nie każdy zna na pamięć wszelkie istniejące biblioteki.

Dzięki za chęci, ale niewiele wniosłeś do dyskusji.

i tyle teorii. cały program możesz napisać sobie sam ;D
A czy ktoś prosił o teorię? Czy ktoś prosił o napisanie całego programu? Bynajmniej nie ja.

0

trudno przerobić wzór matematyczny na algorytm?

np:

tutaj G to blok wynikowy, F to blok źródłowy:
odbijanie względem prostej y = -x:

for (u = 0; u < 8; u++)
  for (v = 0; v < 8; v++)
    G[u][v] = F[v][u];

tutaj F to blok zarówno wynikowy jak i źródłowy:
odbijanie poziomo:

for (u = 0; u < 8; u++)
  for (v = 0; v < 8; v++)
    if (v & 1)
      F[u][v] *= -1;

tutaj F to blok zarówno wynikowy jak i źródłowy:
odbijanie pionowo:

for (u = 0; u < 8; u++)
  if (u & 1)
    for (v = 0; v < 8; v++)
      F[u][v] *= -1;

rotacja o 90 stopni w prawo to złożenie najpierw odbicia względem prostej y = -x a następnie odbicia w poziomie.

a samymi blokami możesz operować tak jak pikselami (przy odbiciach).

0

Możesz wykorzystać PIL?

import Image
Image.open("foto.jpg").rotate(kat).save("foto.jpg", "JPEG")
0

mario1:
i tak wszystko prowadzi do ijg lub jego przeróbek ;p

coldpeer:
to chyba nie będzie bezstratne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1