Portfolio[UWM] Techniki Multimedialne / PIRO

Histogram

Zadanie
Zaimplementować funkcję wyznaczającą histogram bitmapy

Wynikiem będzie rozkład ilości danych składowych danego koloru

Tworzymy strukturę histogramu.
typedef struct Histogram
{
	int *Red;
	int *Green;
	int *Blue;
	int *Gray;
};

Funkcja zwracająca nam histogram.
Histogram Get_Histogram(BitMap _BitMap)
{
	Histogram oHistogram;
	oHistogram.Gray = 0;
	oHistogram.Red = 0;
	oHistogram.Green = 0;
	oHistogram.Blue = 0;
	if(_BitMap.Bits == 1)
		oHistogram.Gray = (int*) malloc(sizeof(int)*2);
	else if(_BitMap.Bits == 8)
		oHistogram.Gray = (int*) malloc(sizeof(int)*255);
	else
	{
		oHistogram.Red = (int*) malloc(sizeof(int)*255);
		oHistogram.Green = (int*) malloc(sizeof(int)*255);
		oHistogram.Blue = (int*) malloc(sizeof(int)*255);
	}


	// Zerowanie
	for(int z = 0; z < 256; z++)
	{
		if(_BitMap.Bits == 1 || _BitMap.Bits == 8)
		{
			oHistogram.Gray[z] = 0;
			if(z > 1 && _BitMap.Bits == 1)
				break;
		}
		else if(_BitMap.Bits == 24)
		{
			oHistogram.Red[z] = 0;
			oHistogram.Green[z] = 0;
			oHistogram.Blue[z] = 0;
		}
	}

	// Zliczanie
	for(int y = 0; y < _BitMap.Height; y++)
		for(int x = 0; x < _BitMap.Width; x++)
		{
			if(_BitMap.Bits == 1 || _BitMap.Bits == 8)
				oHistogram.Gray[Get_PIX(x,y,_BitMap).Light]++;
			else if(_BitMap.Bits == 24)
			{
				oHistogram.Red[Get_PIX(x,y,_BitMap).Red]++;
				oHistogram.Green[Get_PIX(x,y,_BitMap).Green]++;
				oHistogram.Blue[Get_PIX(x,y,_BitMap).Blue]++;
			}
		}
	return oHistogram;
}

Funkcja która wyświetla na histogram.

ma parametry funkcji:
  • _Histogram źródło histogramu,
  • _Bits ilu bitowa jest bitmapa,
void Show_Histogram(Histogram _Histogram, int _Bits)
{
	int oMax = 256;
	if(_Bits == 1)
		oMax = 2;

	for(int i = 0; i < oMax; i++)
	{
		if(_Bits == 1 || _Bits == 8)
			printf("[%3d] : %5d",i,_Histogram.Gray[i]);
		else if(_Bits == 24)
			printf("[%3d] : %5d %5d %5d",i,_Histogram.Red[i],_Histogram.Green[i],_Histogram.Blue[i]);
	}
}

  • Administracja