Politechnika Wrocławska Wrocław, 06.06.2010r.
Wydział: Elektronika
Kierunek: Informatyka
Sprawozdanie z laboratorium
Architektura Komputerów 2
Prowadzący: Grupa:
Mgr inż. Jacek Symonowicz Gwidon Jóźwiak 171864
Rok akademicki: Marcin Stańczak 163777
2009/2010 Grupa Pt 14:15
Wykonał:
Gwidon Jóźwiak
Cel ćwiczenia.
Celem ćwiczenia było zapoznanie się z praktycznym wykorzystaniem rozszerzenia multimedialnego MMX procesorów Pentium. Zgodnie z przekazanymi wymaganiami w ramach ćwiczenia mieliśmy zapoznać się z następującymi zagadnieniami:
• dopisanie funkcji filtrującej obraz w języku C do gotowego kodu wczytującego
• wykonanie kluczowych części funkcji w języku assembler.
Przebieg ćwiczenia.c
2.1. Filtr uśredniający wygładzający obraz.
Format bmp to najprostszy sposób zapisu obrazka do pliku. Plik składa się z nagłówka, palety kolorów i zapisanych pikseli. W nagłówku znajdują się informacje na temat rozmiaru obrazka, ilości bitów na piksel, wielkości nagłówka, kompresji oraz kilka innych informacji. Funkcja napisana przez nas uśrednia sąsiednie piksele i zapisuje wynik do piksela środkowego. Zmienna bpp mówi nam na ilu bajtach zapisany jest piksel, natomiast zmienna ile określa ile pikseli ma być uśrednianych. Zakładamy, że zmienna ta musi być zawsze nieparzysta, aby zawsze istniał piksel środkowy. Na laboratorium program działał źle, ponieważ przesuwał obraz o jeden piksel w lewo. Wynikało to z błędnego zapisu piksela wynikowego, który zapisywaliśmy do pierwszego z uśrednianych. Obecna wersja działa poprawnie.
void Filter(unsigned char * buf, int width,int height,int size,char bpp)
{
long i = 0;
long ile = 3;
for(i = ile*bpp; i < size; i++)
{
int suma, k;
suma = 0;
for(k = 1; k <= ile; k++)
{
suma += buf[i-k*bpp];
}
buf[i-(((int)ile/2)+1)*bpp] = (suma / ile);
}
}
2.2. Filtr zamieniający kolory.
Całość polega na tym, że sąsiadujące piksele są ze sobą zamieniane. Cała ta operacja jest powtarzana tyle razy ile wynosi szerokość (width) obrazka. W efekcie kolory zostają zamienione na coś w rodzaju negatywu. Ze względu na dużą liczbę powtórzeń filtr ten działa bardzo wolno. W celu jego napisania nie stosowaliśmy żadnych gotowych filtrów, tylko zwykłą ludzką ciekawość (ciekawe co się stanie).
void Filter(unsigned char * buf, int width, int height, int size,char bpp)
{
int i, j;
int tmp=0;
for( j = 0 ; j<width ; j++ )
{
for (i=0;i<width*height*bpp-bpp;i++)
{
tmp = buf[i];
buf[i] = buf[i+bpp];
buf[i+bpp] = tmp;
}
}
}
Wnioski.
Zaczęliśmy pisać kod w assemblerze, ale niestety nie zdążyliśmy go skończyć na zajęciach. Jedyne wnioski jakie możemy wyciągnąć z tych zajęć to fakt, że manipulując bitami, na których są zapisane poszczególne piksele możemy zmieniać wygląd obrazka i osiągnąć w ten sposób różne ciekawe efekty. Dowiedzieliśmy się również, że uśredniając piksele możemy wygładzić (rozmyć) obraz.