CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Przetwarzanie obrazów - spłaszczenie histogramu

Przetwarzanie obrazów - spłaszczenie histogramu

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Przetwarzanie obrazów - spłaszczenie histogramu

Nowy postprzez kwgrkwgr » wtorek, 19 kwietnia 2011, 10:20

By skorzystać z algorytmu Iteracyjnego Znajdowania Progu, zalecane jest by histogram wyrównać (Histogram equalization)
Znalazłem taki kod na http://www.codepedia.com/1/CppVclHistogramEqualization lecz mam problem z zastosowaniem.
Gdzie popełniam błąd? Aplikacja się kompiluje Błąd wywala podczas wywołania: HistogramEqualize(Image1,Image2);

KOD cpp:     UKRYJ  
#include <vector>
i#nclude <cassert>
using namespace std

//--------------------------------------------------------------------------

void __fastcall TProgowanie::Button19Click(TObject *Sender)
{      // Splaszczenie Hist
         HistogramEqualize(Image1,Image2);
}
//---------------------------------------------------------------------------
std::vector<int> GetHistogram(const TImage * const image)
{
  assert(image!=0);
  assert(image->AutoSize==true);
  const int width  = image->Width;
  const int height = image->Height;
  std::vector<int> histogram(256,0); //There are 256 different color intensities
  for (int y=0; y!=height; ++y)
  {
        const unsigned char * line
          = static_cast<const unsigned char *>(image->Picture->Bitmap->ScanLine[y]);
        for (int x=0; x!=width; ++x)
        {
          const int greyVal = (line[x*3+0] + line[x*3+1] + line[x*3+2]) / 3;
          assert(greyVal>=0);
          assert(greyVal<static_cast<int>(histogram.size()));
          ++(histogram[greyVal]);
        }
  }
  return histogram;
}
//---------------------------------------------------------------------------
std::vector<int> GetCumulativeHistogram(const std::vector<int>& histogram)
{
  const int size = histogram.size();
  std::vector<int> cumulativeHistogram(size,0);
  int cumulative = 0;
  for (int i=0; i!=size; ++i)
  {
        cumulative+=histogram[i];
        cumulativeHistogram[i] = cumulative;
  }
  return cumulativeHistogram;
}
//---------------------------------------------------------------------------
void __fastcall  TProgowanie::HistogramEqualize(const TImage * const source, TImage * const target)
{
  assert(source!=0);
  assert(target!=0);
  assert(source->Width  == target->Width);
  assert(source->Height == target->Height);
  assert(source->AutoSize==true);
  assert(target->AutoSize==true);
  const int width = source->Width;
  const int height = source->Height;
  const int surface = width * height;
  const int nGreyValues = 256; //There are 256 different pixel intensities
  const std::vector<int> histogram = GetHistogram(source);
  assert(nGreyValues==static_cast<int>(histogram.size()));
  const std::vector<int> cumulativeHistogram = GetCumulativeHistogram(histogram);
  assert(nGreyValues==static_cast<int>(cumulativeHistogram.size()));
  //Works, but anybody knows how to use std::for_each or std::transform for this?
  std::vector<int> rescaledHistogram(nGreyValues,0);
  for (int i=0; i<nGreyValues; ++i)
  {
        rescaledHistogram[i]  = static_cast<double>(nGreyValues)
                  /*    static_cast<double>(cumulativeHistogram[i]) //*/

          / static_cast<double>(surface);
  }
  for (int y=0; y!=height; ++y)
  {
        const unsigned char * lineSource
          = static_cast<const unsigned char *>(
                source->Picture->Bitmap->ScanLine[y]);
        unsigned char * lineTarget
          = static_cast<unsigned char *>(
                target->Picture->Bitmap->ScanLine[y]);
        for (int x=0; x!=width; ++x)
        {
          const int greyOriginal
                = (lineSource[x*3+0] + lineSource[x*3+1] + lineSource[x*3+2]) / 3;
          const int greyNew = rescaledHistogram[greyOriginal];
          lineTarget[x*3+0]=greyNew; //Blue
          lineTarget[x*3+1]=greyNew; //Green
          lineTarget[x*3+2]=greyNew; //Red
        }
  }
}
//---------------------------------------------------------------------------


W pliku nagłówkowym "*.h" mam wpis:
KOD cpp:     UKRYJ  
private:        // User declarations
        void __fastcall prog6(TImage *img , int prog);
        void __fastcall Hist(TImage *img , int *red, int *green, int *blue, int *gray);
        void __fastcall  TProgowanie::HistogramEqualize(const TImage * const source, TImage * const target);


Dzięki za pomoc.
Ostatnio edytowano wtorek, 19 kwietnia 2011, 11:21 przez Cyfrowy Baron, łącznie edytowano 1 raz
Powód: Pisz trochę mniej na kupie...
Avatar użytkownika
kwgrkwgr
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): środa, 13 kwietnia 2011, 16:37
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WinXP Win7
Kompilator: C++ Builder 6;
C++ Builder 2010;
MS Visual 2008 C#;
Gadu Gadu: 9692051
    Windows XPOpera

Re: Przetwarzanie obrazów - spłaszczenie histogramu

Nowy postprzez Cyfrowy Baron » wtorek, 19 kwietnia 2011, 11:38

Nie pisz wszystkiego tak na kupie, tyczy się to zarówno Twoich postów jak i kodu. Stosuj spacje, przerwy, grupuj podobne zmienne i obiekty, by kod był czytelniejszy.



Co się zaś tyczy problemu, to jakie komunikaty błędów otrzymujesz i dlaczego w deklaracja funkcji w pliku nagłówkowym jest poprzedzona klasą formularza:

KOD cpp:     UKRYJ  
void __fastcall  TProgowanie::HistogramEqualize(const TImage * const source, TImage * const target);


Inne funkcje już tak nie mają. Przecież wystarczy tak:

KOD cpp:     UKRYJ  
void __fastcall  HistogramEqualize(const TImage * const source, TImage * const target);




To, że argument jest typu const to rozumiem, ale po co nazwa argumentu jest też poprzedzona przez const:

KOD cpp:     UKRYJ  
const TImage * const source, TImage * const target


Przecież tak wystarczy:

KOD cpp:     UKRYJ  
void __fastcall  HistogramEqualize(const TImage * source, TImage *target);


Poza tym wewnątrz funkcji modyfikujesz obiekt target więc w żadnym razie nie powinien być typu const, chociaż kompilator to przełknie. Nie rozumiem jednak sensu tego zapisu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości

cron