algorytm.org

Implementacja w C/C++



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Histogram - rozciąganie - Implementacja w C/C++
Ocena użytkownikóww: *****  / 5
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 13 września 2005 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

Histogram_c - rozciaganie/Unit1.cpp:
//Histogram - rozciąganie histogramu
//(c) 2005 Tomasz Lubinski
//www.algorytm.org
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
double LUTr[256], LUTg[256], LUTb[256], LUTgray[256];
//---------------------------------------------------------------------------
//zmień wartosc jasnosci i kontrastu
//przelicz nowe wartosci tablicy LUT
//wyswietl wartosci tablicy LUT
void TForm1::UpdateLUT(double a, int b, double *LUT, int series)
{
int i;
for (i=0; i<256; i++)
    if ((a*(i+b)) > 255)
        LUT[i] = 255;
    else if ((a*(i+b)) < 0)
        LUT[i] = 0;
    else
        LUT[i] = (a*(i+b));
Chart3->SeriesList->Series[series]->Clear();
Chart3->SeriesList->Series[series]->AddArray(LUT, 255);
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i, j, rvalue, gvalue, bvalue, grayvalue;
int rmin, gmin, bmin, graymin, rmax, gmax, bmax, graymax;
double r[256], g[256], b[256], gray[256];
TColor color;

for (i=0; i<256; i++)
{
    r[i] = 0;
    g[i] = 0;
    b[i] = 0;
    gray[i] = 0;
}

//znajdz minimum i maksimum kazdej skladowej
rmin = 255;
gmin = 255;
bmin = 255;
graymin = 255;
rmax = 1;
gmax = 1;
bmax = 1;
graymax = 1;
for (i=0; i<ObrazKolorowy->Width; i++)
    for (j=0; j<ObrazKolorowy->Height; j++)
    {
        color = ObrazKolorowy->Canvas->Pixels[i][j];
        rvalue = GetRValue(color);
        gvalue = GetGValue(color);
        bvalue = GetBValue(color);
        if (rvalue > rmax) rmax = rvalue;
        if (gvalue > gmax) gmax = gvalue;
        if (bvalue > bmax) bmax = bvalue;
        if (rvalue < rmin) rmin = rvalue;
        if (gvalue < gmin) gmin = gvalue;
        if (bvalue < bmin) bmin = bvalue;
    }
for (i=0; i<ObrazMono->Width; i++)
    for (j=0; j<ObrazMono->Height; j++)
    {
        color = ObrazMono->Canvas->Pixels[i][j];
        grayvalue = GetRValue(color);
        if (grayvalue > graymax) graymax = grayvalue;
        if (grayvalue < graymin) graymin = grayvalue;
    }

//przelicz tablice LUT, tak by rozciagnac histogram
UpdateLUT(255.0/(rmax-rmin), -rmin, LUTr, 1);
UpdateLUT(255.0/(gmax-gmin), -gmin, LUTg, 2);
UpdateLUT(255.0/(bmax-bmin), -bmin, LUTb, 3);
UpdateLUT(255.0/(graymax-graymin), -graymin, LUTgray, 0);

for (i=0; i<ObrazKolorowy->Width; i++)
    for (j=0; j<ObrazKolorowy->Height; j++)
    {
        color = ObrazKolorowy->Canvas->Pixels[i][j];
        rvalue = GetRValue(color);
        gvalue = GetGValue(color);
        bvalue = GetBValue(color);
        //zmien wartosc wedlug tablicy LUT
        color = (TColor)(LUTr[rvalue] +
                   ((int)LUTg[gvalue] << 8) +
                   ((int)LUTb[bvalue] << 16));
        //oblicz histogram
        WynikKolorowy->Canvas->Pixels[i][j] = color;
        r[GetRValue(color)]++;
        g[GetGValue(color)]++;
        b[GetBValue(color)]++;
    }
Histogram1->SeriesList->Series[0]->Clear();
Histogram1->SeriesList->Series[1]->Clear();
Histogram1->SeriesList->Series[2]->Clear();
Histogram1->SeriesList->Series[0]->AddArray(r, 255);
Histogram1->SeriesList->Series[1]->AddArray(g, 255);
Histogram1->SeriesList->Series[2]->AddArray(b, 255);

for (i=0; i<ObrazKolorowy->Width; i++)
    for (j=0; j<ObrazKolorowy->Height; j++)
    {
        color = ObrazMono->Canvas->Pixels[i][j];
        grayvalue = GetRValue(color);
        //zmien wartosc wedlug tablicy LUT
        color = (TColor)(LUTgray[grayvalue] +
                  ((int)LUTgray[grayvalue] << 8) +
                  ((int)LUTgray[grayvalue] << 16));
         //oblicz histogram
        WynikMono->Canvas->Pixels[i][j] = color;
        gray[GetRValue(color)]++;
    }
Histogram2->SeriesList->Series[0]->Clear();
Histogram2->SeriesList->Series[0]->AddArray(gray, 255);
}
//---------------------------------------------------------------------------
Dodaj komentarz