4

C++ (Subject) / bv2 (Lesson)

-

This lesson was created by Missunderstand.

Learn lesson

This lesson is not released for learning.

  • Implementieren Sie eine Funktion void gaussMask1D (int n, std::vector<float> &mask) die in mask einen Vektor von n float-Werten erstellt. Die Werte seien die einer Gauß-Verteilungsfunktion mit μ im mittleren Element und den Werten von μ ± 2σ in den Randelementen, die anderen entsprechend. n soll hierfür natürlich ungerade sein.   #include <iostream>   #include <cmath> // für sqrt()   #include <vector>   #include "SimpleImage/SimpleGrayImage.h"   #include "SimpleImage/SimpleFloatImage.h"  double gaussDensityValue (double x, double mu, double sigma) {  return 1/(sigma * sqrt(2*M_PI)) * exp(-0.5 * (x-mu)*(x-mu) / (sigma*sigma));  void gaussMask1D(int n, std::vector <float> &mask){    if(n % 2 != 1) throw runtime_error("Maskengroesse muss ungerade sein")    const int off = (n-1) / 2;    const int wid = n;    const float sigma = off/ 2.0;    mask resize(wid);    double sum;    sum = mask[off] = gaussDensityValue(0.0, 0.0, sigma);    for( int x = 1; x < off; x++) {         double d = gaussDensityValue(x, 0.0, sigma)         mask[off-x] = mask[off+x] = d    // symmetrie ausnutzen         sum+= 2*d;    }   for(int i = 0; i < wid; i++) mask[i] /= sum;   cout << endl; }
  • Implementieren Sie eine Funktion void filterFixed (const SimpleGrayImage &in, SimpleGrayImage &out)die diesen Filter-Kern auf das übergebene Eingabebild in anwendet und das Ergebnis nach out schreibt. Implementieren Sie filterFixed zunächst nur für die Pixel, bei denen der Kern vollständig im Bild liegt. Bedenken Sie, dass die Indices des 2D-Arrays für den Kern ([0, 4]) nicht identisch sind mit den mathematischen Indices ([−2, 2]). void filterfixed(const SimpleGrayImage &in, SimpleGrayImage &out){   const mrad = 2;   // Masken Fensterradius [-2, -1, 0, 1, 2]   out.resize(in.width(), in.height());   out.clear(0)    for(int i = mrad; i < out.height() -mrad; i++){      for(int j = mrad; j < out.width() - mrad; i++){          double sum = 0;               for (int mi = -mrad; mi <= mrad; mi++){                  for(int mj = -mrad; mj <= mrad; mj++){                      sum += in[i + mi][j+mj] * ker[mi + mrad] [mj + mrad]                  }          }     out[i][j] = clampToByte(sum);     }  }}
  • Implementieren Sie eine Funktion void filterVar (const SimpleFloatImage &kern, const SimpleGrayImage &in, SimpleGrayImage &out) die den in Form ei- nes SimpleFloatImage (faktisch ein float-Array variabler Größe) übergebenen Filter-Kern auf das übergebene Eingabebild in anwendet und das Ergebnis nach out schreibt. Verwenden Sie wieder die Methode des gespiegelten Fortsetzen des Eingabebildes als Randbehandlung. void filterVar (const SimpleFloatImage &kern, const SimpleGrayImage &in, SimpleGrayImage &out){if (kern.width() % 2 == 0 || kern.height() % 2 == 0) throw std::runtime_error ("Kern muss ungerade sein"); if(kern.width() != kern.height()) throw std::runtime_error ("kern muss quadratisch sein"); const int mrand = (kern.width() - 1) / 2; //Masken Fensterradiusconst int w = in.width();const int h = in.height(); out.resize(w, h);out.clear(0); for(int i = 0; i < h; i++){   for(int j = 0; j < w; j++){      double sum = 0;         for(int mi  = -mrand; mi <= mrand; mi++){               int ri = i + mi;               if(ri < 0){ri = -ri-1;} else if (ri >= h) { ri = h + h - ri - 1;}               for(int mj = -mrad; mj <= mrad; mj++){               int rj = j + mj;}               if(rj < 0){rj = -rj-1;} else if (ri >= w) { rj = w + w - rj - 1;}               sum += in[ri][rj] * kern[mi + mrad] [mj + mrad];               }            }            out[i][j] = clampToByte(sum);        }    }}
  • Erstellen Sie zusätzlich eine Funktion genMeanKernel (int n, SimpleFloatImage &kern) die in kern einen Kern zur Mittelwert-Filterung mit einem n × n-Kern zurückgibt. void genMeanKernel (int n, SimpleFloatImage &kern){if(n % 2 != 1) throw std::runtime_error("Kern muss eine ungerade Breite und Höhe haben);kern.resize(n, n);kern.clear(1.0/(n*n));}
Advertisement