Napisać program do obróbki cyfrowej zdjęć w formacie BMP

0

Dostalem projekt tak jak w temacie. Ma byc napisany w C. I teraz pytanie gdzie moglbym w ogóle poczytac jak sie do tego zabrac? Zgaduje ze to nie jest jakas tajemna wiedza.

  1. Wczytywanie do pamięci bitmapy
  2. Odszumianie wczytanego obrazka
  3. Konwersja obrazu kolorowego (32, 24, 16, 8-bitowego) na obraz w skali szarości
  4. Generowanie negatywu wczytanej bitmapy
  5. Zapis przekonwertowanych obrazków do oddzielnych plików z rozszerzeniem BMP
0

Sprawdź sobie w jaki sposób jest zbudowany format BMP. Wczytaj bitmapę i odpowiednie informacje. Do odszumiania to jakiś filtr usredniajacy albo Gaussa. Negatyw to też bardzo prosta operacja. Większość znajdziesz w internecie szukajac chociażby jakiś slajdów wykladowych z przetwarzania obrazów.

1

I teraz pytanie gdzie moglbym w ogóle poczytac jak sie do tego zabrac?

BMP to taki odpowiednik cepa na gospodarstwie, prosta budowa, która ma działać. Opis formatu znajdziesz w wielu miejscach, oto jedno z nich. Stwórz sobie jakiś prosty BMP z paincie tylko z kolorem czerwonym i podpatrz w hex edytorze. Potem w kodzie wczytujesz to tablicy odpowiedni wycinek, albo nawet całą bitmape, odczytujesz odpowiednie bajty i to w sumie tyle.

1

@dandon223: Nie odpowiadaj na temat w komentarzac.

Jakbym jeszcze rozumial zapis w tym edytorze to byloby fajnie , ale ja nie robilem takich rzeczy. To jest moj 3 projekt w C. Niedawno sie cieszylem ze zalapalem tworzenie tablicy 2-wymiarowej uzywajac malloc.

Żeby zrozumieć ten zapis w edytorze potrzebujesz mieć zapis formatu gdzieś z boku, pisałem Ci o tym na samym początku. BMP to binarny format, dlatego musisz wiedzieć jak posługiwać się formatem szesnastkowym, inaczej nie da rady, przykro mi.

0

Ok. W miare sie z tym zapoznałem. W sensie nawet zrobilem w hexeditorze probna bitmape 6x3 pixele i zauwazylem ze wyswietlaja sie one od prawego dolu. Dlaczego tak to jest zrobione? Oraz że zamienia on jakgdyby RGB na BGR. Chodzi mi o to ze jak podalem pixelowi FF 00 00 to nie zrobil sie czerwony a niebieski. Nie do konca tez jestem pewien czy rozumiem Bits Per Pixel . Skoro dla kazdego pixela przechowujemy informacje o 3 kolorach w 256 "natezeniach" , a 256 da sie zapisac w 8 bitach to razem dla 1 pixela porzeba 24 bity, tak? A jakie sa inne mozliwosci "kolorowania" tych pixeli. Chodzi mi o jakies inne a nie RGB.

2
  1. Bitmapa w bmp zapisana jest do góry nogami
  2. O ile pamiętam to rgb i brg to kwestia little endian
  3. BPP to liczba bitów na kolor :
    - 32 bity oznacza że na jeden pixel masz 4 bajty danych ARGB
    - 24 bpp to 3 bajty na pixel (RGB)
    - 16 bpp to 2 bajty ( R - 5 bitów, G - 6 bitów B - 5 bitów)
    - 8 bpp - tryb z paletą, zaraz za nagłówkiem pliku masz opis palety, czyli żeby uzyskać składowe RGB pobierasz bajt zapisany jako pixel i używasz tego bajtu jako index w palecie.
  4. Każda linia w pliku BMP musi być podzielna przez 4, jeżeli nie jest na końcu linii dodawany jest padding
  5. Możesz mapować plik bmp na strukturę (łatwa edycja), ale konieczne jest wyłączenie wyrównania struktur w C (#pragma pack(push, 1))

https://github.com/dybuk87/cpp_cygwin_simple_ux_engine/blob/master/src/core/ux_bitmap.cpp

0

Ok. Wiec zaczalem robic ten projekt i mam klopot z wczytaniem pliku do struktury.

          #pragma pack(push)
          #pragma pack(1)

     typedef struct Header{
        uint16_t type;
        uint32_t file_size;
        uint32_t reserved;
        uint32_t data_offset;
     } Header;
      #pragma pack(pop)
       int main(void)
     {
 
          Header *pointer;
          pointer = malloc(sizeof(Header));    
          FILE *fp = fopen("obrazek", "rb");
          fread(pointer, sizeof(uint16_t),1,fp);
          printf("%d", pointer->type);
   
          free(pointer);
          fclose( fp);
          return 0;
            }

Ta metoda nie dziala. Chcialbym po prostu miec w Header.type BM , czyli w 16-owym 66 77. Chcialem tez fgets() ale tez nie dzialalo. Moje pytanie to po prostu jak najlepiej trzymac zczytane dane z BMP w struktorach czy w tablicy charow i jakie funkcje uzyc?

0

Błąd masz tu:

fread(pointer, sizeof(uint16_t),1,fp);

Powinno być:

fread(pointer, sizeof(Header),1,fp);

Tylko upewnij się, jakie jest endianess w BMP, @xxx_xx_x wspominał, że BMP jest zapisany do "góry nogami" więc kolejność bajtów może być odwrócona (ja sam nie znam formatu).

0

Dlaczego czytasz sizeof(uint16_t) bajtów zamiast sizeof(Header)?

0

Chcialem zczytac pierwsze dwa bajty i potem je wyswietlic i upewnic sie ze czyta BM, ale zeczywiscie moge zczytac 14 bajtow do headera. Tylko pytanie czy pragma dziala na Ubuntu lub debianie. Bo nie jestem do konca pewny czy jest w standardzie 99

0

Tylko pytanie czy pragma dziala na Ubuntu lub debianie

Pragme, której użyłeś zrozumie clang++ i g++, czyli kompilatory C++. Nie jestem pewien jak to będzie w przypadku C.

1
several napisał(a):

Tylko upewnij się, jakie jest endianess w BMP, @xxx_xx_x wspominał, że BMP jest zapisany do "góry nogami" więc kolejność bajtów może być odwrócona (ja sam nie znam formatu).

Kolejność bajtów nie jest odwrócona, tylko kolejność linii jest od dołu do góry. Czy to jest „odwrócenie” to kwestia interpretacji.

0

Sprawdzilem na serwerach pracowni i dzialala. Adresy poszczegolnych skladowych struktury Header nastepowaly po sobie , wiec to troche ulatwia i udalo mi sie zczytac caly header wiec dzieki.

0

Ok . Udalo mi sie wczytywac dane z BMP.24 do programu, a teraz chcialbym zrobic algorytm do odszumiana wczytanego obrazka za pomoca filtrow medianowego , usredniajacego , minimalnego i maksymalnego o roznych rozmiarach okna. To co jest zapisane na wikipedii nie jest moim zdaniem wystarczajaco opisane i czy znacie jakies strony temu poswiecone?

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