C# VS2012 aplikacja rysująca histogram obrazu

C# VS2012 aplikacja rysująca histogram obrazu
BB
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 8 lat
  • Postów:80
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!

ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 14 godzin
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.


edytowany 2x, ostatnio: ŁF
BB
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 8 lat
  • Postów:80
0

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

ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 14 godzin
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.


BB
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 8 lat
  • Postów:80
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...

ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 14 godzin
0

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


NE
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 10 lat
  • Postów:22
1

W pliku operator.cs

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

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

Kopiuj
 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

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

otrzymujesz:

Kopiuj
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

edytowany 5x, ostatnio: nexodg
BB
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 8 lat
  • Postów:80
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!!!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.