3

C++ (Subject) / bv3 (Lesson)

-

This lesson was created by Missunderstand.

Learn lesson

This lesson is not released for learning.

  • 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);}