Program do obróbki graficznej

0

Witajcie! Na grafikę komputerową mamy napisać program w którym będzie się wyświetlał z lewej strony obraz wczytany bez skalowania a z prawej ten sam obraz ale już po obróbce graficznej. Samo okno aplikacji już napisałem, teraz została sprawa tego jak napisać filtr medianowy. Mam panel w którym pobieram maskę 3x3, obrazek jest w bufferedimage, wiem jak działa takie filtrowanie ale po uruchomieniu aplikacji z moim kodem eclipse wywala mi całą listę błędów.

Robię to mniej więcej w ten sposób:

  1. wczytuje w pętlach(obr to mój bufferedimage)
    int rgb=obr.getRGB(j, i);
    int r=(rgb >> 16) & 0x000000FF;
    int g=(rgb >>8 ) & 0x000000FF;
    int b=(rgb) & 0x000000FF;
    2.wczytuje dla każdego z kolorów wartości pikseli dookoła

  2. korzystając z wzoru liczę sobie nowy piksel:
    s=f−1,−1∙ai−1,j−1+f0,−1∙ai,j−1+f1,−1∙ai+1,j−1+f−1,0∙ai−1,j+f0,0∙ai,j+f1,0∙ai+1,j+f−1,1∙ai−1,j+1+f0,1∙ai,j+1+f1,1∙ai+1,j+1
    4.potem metodą znalezioną w sieci robię
    public int createRGB( int r, int g, int b ) {

         return ((r & 0xff) << 16) |
    
         ((g & 0xff) << 8) |
    
         (b & 0xff);
    
     }
    

5.na koniec zostało już tylko zrobic image.setRGB(j, i, spixel);

mógłby mi ktoś powiedzieć gdzie robię błąd? albo jak to poprawnie zrobić? łeb mi już pęka, szukam od kilku godzin tego w necie i nie mogę nic znaleźć sensownego. W piątek na zajęciach będziemy to pisać i kilka innych filtrów a nikt nam nie tłumaczył jak działać z obrazkami w javie...

0
rezus08 napisał(a):

po uruchomieniu aplikacji z moim kodem eclipse wywala mi całą listę błędów.

Pochwal się co wywala i kiedy, to coś wymyślimy.

0

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds!
at sun.awt.image.ByteInterleavedRaster.getDataElements(Unknown Source)
at java.awt.image.BufferedImage.getRGB(Unknown Source)
at Obrazek2.rmediana(Obrazek2.java:80)
at Obrazek2.f_mediana(Obrazek2.java:63)
at Ramka.actionPerformed(Ramka.java:75)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

obrazek lecę dwiema pętlami for
hmm już się sam pogubiłem w tym kodzie... przydałby mi się jakiś przejrzysty poradnik jak działa ten algorytm i jak operować na bufferedimage.
zależy mi głównie na tym żeby dowiedzieć się jak dokładnie wyciągnąć z obrazka kolory r g b, i po zakończeniu obróbki złączyć te kolorki w jeden obrazek.

0

Przypuszczam, że nie uwzględniasz faktu, iż piksel leżący na brzegu ma mniej sąsiadów. Dla każdego piksla bierzesz sąsiadów z góry, z dołu, z lewej i z prawej.

0

niee właśnie robię w ten sposób że zaczynam pętle od wartości początkowych i=1 j=1 a koniec na szerokosc-1 wysokosc-1.

1

To jedziesz za daleko, musisz kończyć na szerokosc-2, wysokosc-2.

0

Fakt. Ale to nie rozwiązuje moich problemów... muszę znaleźć inne rozwiązanie tego problemu. trudno, dziękuje za pomoc.

0

Z filtrem medianowym dałem sobie radę, jednak zostały mi jeszcze filtr okienkowy i gradiendowy. co do tego pierwszego to coś mi nie wychodzi, robi z obrazka straszną pikseloze. a nie mogę znaleźć na necie algorytmu do filtru gradientowego. Mógłby mi ktoś mniej więcej opisać ten filtr?

0

Jak dla mnie podchodzisz do tego w zupełnie nieodpowiedni sposób. Takie najprostsze operacje na obrazach wykonuje się przeważnie poprzez funkcję splotu obrazu z odpowiednią macierzą filtru. Przykłady takich macierzy możesz znaleźć tutaj. W Twoim przypadku filtr medianowy to po prostu filtr uśredniający, filtry gradientowe to przykłady filtrów wynajdujących krawędzie na obrazie. Niestety nazwa 'filtr okienkowy' nie kojarzy mi się z niczym konkretnym i upewnił bym się czy na pewno o taką nazwę chodziło. Jak korzystać z tego w Javie znajdziesz szukając informacji na temat BufferedImageOp oraz ConvolveOp Pozwala to też na różne strategi dotyczące brzegów obrazu, szczegóły np. tutaj

0

Filtr okienkowy tu jest opisany http://www.icewall.pl/?p=162. Napisałem filtr gradientowy ale wynikiem przefiltrowania obrazu jest: nowy obraz o kolorze czarnym i tylko krawędzie widoczne są na obrazie. Natomiast po przeleceniu obrazka filtrem okienkowym który napisałem mam straszną pikseloze .

e:
ok przy pomocy tego co podesłałeś zrobiłem okienkowy. porównywałem efekty i wychodzi na to że działa. Dziękuje! Teraz został mi tylko gradiendowy do napisania i będzie koniec pracy na jakiś czas:D

e2:
hmm gradientowy już powoli nabiera kształtu ale zostawia mi brzydkie plami...

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