3
C++ (Subject) / bv3 (Lesson)
- Schreiben Sie eine Funktion void pascal_zeile(int (&pv)[100], int nel); die in dem Array pv die ersten nel (1 < nel < 100) Felder mit den Werten der entsprechend langen Zeile aus dem Pascalschen Dreieck berechnet. void pascal_zeile (int (&pv)[100], int nel){ if(nel < 1 || nel > 100) throw "Pascall Zeile ungültig für Wert nel"; pv[0] = 1; pv[1] = 1; int n = 2; // erreichte Länge while (n < nel) { pv[n] = 1; for(int i = n - 1; i > 0; i--) pv[i] = pv[i] + pv[i-1]; n++; }//Kontrollausgabe//for(int j = 0; j < n; j++) cout << pv[j] << " "; << endl;}
- Schreiben Sie eine Funktion void binom_mask(SimpleFloatImage &bmask, int mrad); die unter Verwendung von pascal_zeile() eine zweidimensionale quadratische Binomial- Filtermaske mit dem Masken-Radius mrad erzeugt. void binom_mask(SimpleFloatImage &bmask, int mrad){ int mwid = 2*mrad + 1; int pascal [100]; if(mrad< 1 || mwid > 33) // integer overflow throw "binom_mask:: mrad zu groß oder < 1"; b.mask.resize(mwid, mwid); pascal.zeile(pascal, mwid); double sum = pow(2.0, 2*(mwid - 1)); for(int i = 0; i < mwid; i++){ for(int j = 0; j < mwid; j++){ double val = pascal[i] * double(pascal[j]); bmask[i][j] = val / sum; }}
- Schreiben Sie eine Funktion void apply_mask(const SimpleGrayImage &in, SimpleGrayImage &out, const SimpleFloatImage &mask); die die als Parameter übergebene Filtermaske mask auf das Eingabebild anwendet und das Ergebnis in das Ausgabebild schreibt. Die Maske sei immer quadratisch und mit ungerader Kantenlänge, der Referenzpunkt liege immer in der Mitte der Maske. void apply_mask_simple(const SimpleGrayImage &in, SimpleGrayImage &out, const SimpleFloatImage &mask) { for (int i = 0; i < iHig; i++) { for (int j = 0; j < iWid; j++) { double sum = 0.0; for (int mu = -yrad; mu <= yrad; mu++) { for(int nu = -xrad; nu <= xrad; nu++) { int imgi = i + mu; int imgj = j + nu; if (imgi < 0) imgi = -imgi - 1; else if (imgi >= iHig) imgi = 2*iHig - imgi - 1; if (imgj < 0) imgj = -imgj - 1; else if (imgj >= iWid) imgj = 2*iWid - imgj - 1; // Bildwert mit Maskenwert multiplizieren und aufsummieren sum += mask[mu+yrad][nu+xrad] * in[imgi][imgj]; } } // neuen Bildwert berechnen und ("geclampt") setzen out[i][j] = clampToByte(sum);}