6

C++ (Fach) / bv5 (Lektion)

-

Diese Lektion wurde von Missunderstand erstellt.

Lektion lernen

Diese Lektion ist leider nicht zum lernen freigegeben.

  • [8P] Schreiben Sie eine Funktion void filter_sobel(const SimpleGrayImage &in, SimpleFloatImage &outx, SimpleFloatImage &outy);diedasübergebeneEingabebild mit den beiden Sobel-Masken filtert und die Ergebnisse in die beiden Ausgabe-„Bilder“ schreibt. Implementieren Sie die Filterung als separierte lineare Filterung. Schreiben Sie geeignete Hilfsfunktionen um den Code zu strukturieren. Welche Masken verwenden Sie dafür? Denken Sie an die übliche Randbehandlung durch gespiegelte Fortsetzung des Bildes. Greifen Sie soweit sinnvoll auf die Ergebnis- se von Blatt 4, Aufgabe 4 zurück. Visualisieren Sie die Ergebnisse. // Falls Maske über Linken Rand hinausragt #include "SimpleImage/SimpleGrayImage.h"#include "SimpleImage/SimpleFloatImage.h"#include <vector> using namespace std; template <class IMAGETYPE1, class IMAGETYPE2> void apply1DTransposed(const IMAGETYPE1& src, IMAGETYPE2& dest, const std::vector<double>& mask) { if (! (! mask.empty() && (mask.size() % 2 == 1)))throw std::runtime_error("Masken-Größe nicht ungerade und >0"); if ((src.width() != dest.height()) || (src.height() != dest.width()))throw std::runtime_error("apply1DTransposed: Bildgrößen stimmen nicht überein"); const int mwid = mask.size(); constintn=mwid/2; const int swid = src.width(); for (int y = 0; y < src.height(); y++) {// ======================= Maske ragt über linken Rand hinausfor (int x = 0; x < n; x++) { double val = 0.0; const int xmn = x -n; for(intk=0;k < n - x; k++) { // überhängender Teilval += src[y][-x+n-k-1] * mask[k]; // Spiegeln}for(intk=n-x;k<mwid;k++){//imBildliegenderTeil val += src[y][xmn+k] * mask[k];}dest[x][y] = val;}  
  • [8P] Schreiben Sie eine Funktion void filter_sobel(const SimpleGrayImage &in, SimpleFloatImage &outx, SimpleFloatImage &outy);diedasübergebeneEingabebild mit den beiden Sobel-Masken filtert und die Ergebnisse in die beiden Ausgabe-„Bilder“ schreibt. Implementieren Sie die Filterung als separierte lineare Filterung. Schreiben Sie geeignete Hilfsfunktio- nen um den Code zu strukturieren. Welche Masken verwenden Sie dafür? Denken Sie an die übliche Randbehandlung durch gespiegelte Fortsetzung des Bildes. Greifen Sie soweit sinnvoll auf die Ergebnis- se von Blatt 4, Aufgabe 4 zurück. Visualisieren Sie die Ergebnisse. // Falls Maske in der Mitte #ifdef USE_POINTER // Version mit Zeigern, gefährlich, aber 3 mal schneller als ’normal’ const typename IMAGETYPE1::ElementType *pst = src[y]; for (int x = n; x < swid - n; x++) {     double val = 0.0;     auto itm = mask.cbegin(); // std::vector<double>::const_iterator     const typename IMAGETYPE1::ElementType *pin = pst++;         for(int k=0;k < mwid; k++)              val += *pin++ *  * itm++;           }           dest[x][y] = val;       }#else     for(intx=n;x< swid - n; x++) {          double val = 0.0;          const int xmn = x - n;          for(int k = 0; k < mwid; k++){              val += src[y][xmn + k] * mask[k];           }            dest[x][y] = val;}#endif
  • [8P] Schreiben Sie eine Funktion void filter_sobel(const SimpleGrayImage &in, SimpleFloatImage &outx, SimpleFloatImage &outy);diedasübergebeneEingabebild mit den beiden Sobel-Masken filtert und die Ergebnisse in die beiden Ausgabe-„Bilder“ schreibt. Implementieren Sie die Filterung als separierte lineare Filterung. Schreiben Sie geeignete Hilfsfunktionen um den Code zu strukturieren. Welche Masken verwenden Sie dafür? Denken Sie an die übliche Randbehandlung durch gespiegelte Fortsetzung des Bildes. Greifen Sie soweit sinnvoll auf die Ergebnis- se von Blatt 4, Aufgabe 4 zurück. Visualisieren Sie die Ergebnisse. Maske ragt über rechten Rand hinaus for(int x = swid - n; x < swid; x++) {double val = 0.0; const int xmn = x - n;const int kout = n + (swid- x); // 1. k außerhalb des Bildesfor(int k = 0; k < kout; k ++){ // Im Bild liegender Teilval += src[y][xmn + k] * mask[k];} for(int k = kout; k < mwid; k++){ //überhängender Teilval += src[y][xmn + k] * mask[k];}dest[x][y] = val;} } }
  • [8P] Schreiben Sie eine Funktion void filter_sobel(const SimpleGrayImage &in, SimpleFloatImage &outx, SimpleFloatImage &outy);diedasübergebeneEingabebild mit den beiden Sobel-Masken filtert und die Ergebnisse in die beiden Ausgabe-„Bilder“ schreibt. #include <iostream>#include <cmath>#include "SimpleImage/SimpleGrayImage.h>#include "SimpleImage/SimpleFloatImage.h>#include "apply_mask.h" //Templates werden als h-Dateien eingebunden using namespace std; void filter_sobel(const SimplegrayImage &in, SimpleFloatImage &outx, SimpleFloatImage &outy){     outx.resize(in.width(), in.height());     outy.resize(in.width(), in.height());       // Separierte Sobel Masken weil 1D als Vektor, nicht SimpleFoatImage     vector<double> zentraldifferenz = {-1, 0, 1};      vector<double> binom3(3);      binom3[0] = 1;     binom3[0] = 2;     binom3[0] = 1;     applySeparate2D(in, outx, zentraldifferenz, binom3);     applySeparate2D(in, out.y, zentraldifferenz, binom3);}
  • Schreiben Sie eine Funktion void city_strength(const SimpleFloatImage &sobx, const SimpleFloatImage &soby, SimpleFloatImage  & str); die aus den Sobel Ergebnissen die Gradientenstärke nach der ("city-block"- Methode (1-Norm Formel) berechnet. Überlegen Sie, in welchem Wertebereich die Ergebnisse liegen. void city_strength(const SimpleFloatImage &sobx, const SimpleFloatImage &soby, SimpleFloatImage & str){    if(sobx.height() != soby.height() || sobx.width() != soby.width())        throw std::runtime_error("Sobel Bilder haben unterschiedliche Größen")}    str.resize(sobx.width(); sobx.height(); i++));for(int i = 0; i < sobx.height(); i++)    for(int j = 0; j < sobx.width(); j++){        str[i][j] = abs(sobx[i][j]) + abs(soby[i][j]);     }}
  • [6P] Schreiben Sie eine Funktion void grad_dir(const SimpleFloatImage &sobx, const SimpleFloatImage &soby, SimpleGrayImage &dir); die aus den Sobel- Ergebnissen die Gradientenrichtung kodiert in Richtungswerte berechnet, die sich in einem byte speichern lassen. (Achtung: Ausgabe in SimpleGrayImage!) Wenden Sie die Funktion auf das Bild uni01.pgm an und visualisieren Sie das Ergebnis. void grad_dir(const SimpleFloatImage &sobx, const SimpleFloatImage &soby, SimpleGrayImage &dir){if(sobx.height() != soby.height() || sobx.width() != soby.width())    throw "gran.dir : Sobel Bilder haben unterschiedliche Größe";dir.resize(sobx.width(), sobx.height());for(int i = 0; i< sobx.height(); i++)   for(int j = 0; j < sobx.width(); j++)       dir[i][j] = clampToByte((atan2(soby[i][j], sobx[i][j]) * 90) M_PI + 90);      }}
Anzeige