C# VS2012 aplikacja rysująca histogram obrazu

0

Cześć!

Mam problem z aplikacją rysującą histogram obrazków.
Po wczytaniu obrazku, wybraniu jego typu np. Kolorowy chcę narysować jego histogram.
W zależności od obrazu histogram rysuje się albo dobrze albo źle.
Dobrze tzn. jest cały "pełny". A źle to powstają takie SKOKI i jakieś takie jakby przerwy...

Załączam całą aplikację ze źródłami pod Visual Studio 2012 i 3 przykładowe wyniki rysowania histogramu.

Jak poprawić to rysowanie histogramu?

Dzięki za pomoc i pozdrawiam!

1

OperatorHist.cs, PixelFormat.Format32bppArgb i ptr += 3;? Debuger w łapę i sprawdzaj ręcznie na obrazku o histogramie znanym z innej aplikacji.

equilize to nie jest angielskie słowo.

0

Właśnie nie mogę namierzyć w kodzie, w którym momencie powstaje ten błąd... tzn. to, że rysuje mi te skoki...

0

Ty nie patrz na rysowanie, bo to objaw, patrz do tworzenia histogramu, napisałem Ci która to klasa i napisałem co prawdopodobnie jest nie tak.

0

Teraz zobaczyłem, że także dla innych obrazków histogram rysuje się źle bo w innych programach ten histogram wygląda inaczej... Sprawdzałem w dwóch innych programach i tam histogramy wyglądają inaczej... już nawet pomijając ten SKOK...

0

Spróbowałeś poprawić to, o czym napisałem, czy nie rozumiesz o co chodzi i wstydzisz się spytać?

1

W pliku operator.cs

 
public void calcHisto( Obraz2 form )
		{
...
		}        

Tak jak pisał wyżej ŁF, masz błąd przy wskaźniku.
Zakładając że dostajesz

 PixelFormat.Format32bppRgb

źle go obliczasz. To się sprawdzi ale dla Format24BppRgb
Mając np bitmape 10px X 10px. Tak naprawdę masz 10 bajtów z wartościami czerwieni, 10 zielonych, 10 niebieskich, 10 kanału przeźroczystości. Na przemian w takiej kolejności.
Skacząc co 3 bajty zamiast łapać tak jak zamierzasz

tab[0] =(R0 + G0 + B0)/3;
tab[1] =(R1 + G1 + B1)/3;
...

otrzymujesz:

tab[0] =(R0 + G0 + B0)/3;
tab[1] =(A0 + R1 + G1)/3;
tab[2] =(B1 + A1 + R2)/3;
...

Rozwiązaniem jest po prostu sprawdzanie jaką bitmapę dostajesz (** bmp1.PixelFormat **) i dopasowanie "skoku" wskaźnika o odpowiednią wartość.
Hint: Możesz użyć metody Image.GetPixelFormatSize

0

Panowie jestem jestem :-)
Aplikacja już częściowo poprawiona, histogram rysuje się dobrze jednak czasem jest jakby "za nisko" na obrazie :-(
Wiecie gdzie może leżeć problem?

Dzięki za dotychczasowe wypowiedzi i porady - bardzo mi pomogły!!!

1 użytkowników online, w tym zalogowanych: 0, gości: 1