S i V wycinka

marsoft
Użytkownik
Użytkownik
Posty: 64
Rejestracja: 17 kwie 2005, o 10:51
Płeć: Mężczyzna
Lokalizacja: Rzeszów
Podziękował: 3 razy

S i V wycinka

Post autor: marsoft »

Witanko.

Ok wiec zaczijmy od nowa. Załużmy, że nie mam żadnego programu, który już coś tam.

Chciałbym zrobić program, który
1.Wczytuje dowolny obraz
2. Na tym obrazie możemy zaznaczyć pewien obszar
3. Za pomocą procedury floodfill wycinamy ten pewien obszar i go np kolorujemy na kolor biały.
4. Najważniejsza część programu. Wyliczamy pole powierzchni tej części białej.

Może w ten sposób mi pomożecie - byłbym wdzieczny bo to dla mnie bardzo ważna a nie mma pojęcia jak wyliczyć pole powierzchni tego wycinka
Ostatnio zmieniony 2 sty 2006, o 17:24 przez marsoft, łącznie zmieniany 2 razy.
Fibik
Użytkownik
Użytkownik
Posty: 953
Rejestracja: 27 wrz 2005, o 22:56
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 11 razy
Pomógł: 74 razy

S i V wycinka

Post autor: Fibik »

W DirectX takich dziwactw nie znajdziesz.
Mapa bitowa to dwuwymiarowa tablica kolorów,
zatem zdefiniuj, czym jest to pole powierzchni i objętość.
marsoft
Użytkownik
Użytkownik
Posty: 64
Rejestracja: 17 kwie 2005, o 10:51
Płeć: Mężczyzna
Lokalizacja: Rzeszów
Podziękował: 3 razy

S i V wycinka

Post autor: marsoft »

Fibik pisze:W DirectX takich dziwactw nie znajdziesz.
Już tłumaczę. Wczytujemy jakiś tam obrazek. W nim sobie wycinamy pewien obszar za pomocą obrysowania, tak jakby lasso - w każdym bądź razie gdy już sobie wytniemy a raczej zaznaczym pewien obszar to liczymy jego V i S. Mogę Tobie podesłać całość tego programu Liczy z dużą dokładnością ale długo, bo pixel po pixelu. Moje gg 5862305
Fibik
Użytkownik
Użytkownik
Posty: 953
Rejestracja: 27 wrz 2005, o 22:56
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 11 razy
Pomógł: 74 razy

S i V wycinka

Post autor: Fibik »

Zatem, to S jest powierzchnią zaznaczonego obszaru - a to jest, po prostu liczba punktów w tym obszarze (z konturem, albo bez?).
Takie coś można obliczyć przechodząc jedynie wzdłuż konturu - proste sumowanie po krzywej (tu po łamanej).

Nadal nie wiem czym jest ta objętość: V.

Taki brzydki algorytm nie jest mi potrzebny - aż strach na to patrzeć.
marsoft
Użytkownik
Użytkownik
Posty: 64
Rejestracja: 17 kwie 2005, o 10:51
Płeć: Mężczyzna
Lokalizacja: Rzeszów
Podziękował: 3 razy

S i V wycinka

Post autor: marsoft »

Sęk w tym, że wiesz - ten kod mam a raczej całe źródło programu z właśnie dziwnym algorytmem, który chciałbym zrobić jakoś prościej i poprawić bo takie mam zadanie i zastanawiam się jak to zrobić aby to chodziło szybciej Program jakoś przlicza tą ilość pixeli na jakieś okręgi i z tego wylicza pole powierzchni i objętość - zresztą patrz na algorytm. Może masz inny pomysł. Na innym formu koleś coś mówi o całkach ale jak....hmm
Fibik
Użytkownik
Użytkownik
Posty: 953
Rejestracja: 27 wrz 2005, o 22:56
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 11 razy
Pomógł: 74 razy

S i V wycinka

Post autor: Fibik »

Wstaw tu ten kod, ale jako kod, a nie jak zwykły tekst:

Kod: Zaznacz cały

tutaj paskal
begin
 7 := x;
end.
marsoft
Użytkownik
Użytkownik
Posty: 64
Rejestracja: 17 kwie 2005, o 10:51
Płeć: Mężczyzna
Lokalizacja: Rzeszów
Podziękował: 3 razy

S i V wycinka

Post autor: marsoft »

"Fibik" - Ty to jesteś zabawny :/
Fibik
Użytkownik
Użytkownik
Posty: 953
Rejestracja: 27 wrz 2005, o 22:56
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 11 razy
Pomógł: 74 razy

S i V wycinka

Post autor: Fibik »

Skoro nie potrafisz umieścić tekstu tej procedury jak należy, ani nawet nie wiesz co ona robi - to fruwaj sobie swobodnie w tej niewiedzy i nie zawracaj gitary.
marshal
Użytkownik
Użytkownik
Posty: 1179
Rejestracja: 21 cze 2004, o 00:51
Płeć: Mężczyzna
Lokalizacja: krk
Pomógł: 9 razy

S i V wycinka

Post autor: marshal »

marsoft, wez lepiej wyjasnij o co chodzi z ta objetoscia bitmapy... bo ja sie z trojwymiarowymi bitmapami nie spotkalem
marsoft
Użytkownik
Użytkownik
Posty: 64
Rejestracja: 17 kwie 2005, o 10:51
Płeć: Mężczyzna
Lokalizacja: Rzeszów
Podziękował: 3 razy

S i V wycinka

Post autor: marsoft »

marshal pisze:marsoft, wez lepiej wyjasnij o co chodzi z ta objetoscia bitmapy... bo ja sie z trojwymiarowymi bitmapami nie spotkalem

Ok wiec zaczijmy od nowa. Załużmy, że nie mam żadnego programu, który już coś tam.

Chciałbym zrobić program, który
1.Wczytuje dowolny obraz
2. Na tym obrazie możemy zaznaczyć pewien obszar
3. Za pomocą procedury floodfill wycinamy ten pewien obszar i go np kolorujemy na kolor biały.
4. Najważniejsza część programu. Wyliczamy pole powierzchni tej części białej.

Może w ten sposób mi pomożecie - byłbym wdzieczny bo to dla mnie bardzo ważna a nie mma pojęcia jak wyliczyć pole powierzchni tego wycinka

eh....
Fibik
Użytkownik
Użytkownik
Posty: 953
Rejestracja: 27 wrz 2005, o 22:56
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 11 razy
Pomógł: 74 razy

S i V wycinka

Post autor: Fibik »

Biegniesz wzdłuż konturu i całkujesz - taka prosta wersja wzoru Greena.

Tak na chama, to możesz przelecieć kolejno wszystkie piksele i policzyć białe.

Kod: Zaznacz cały

sumek = 0;
for(y = 0; i < h; y++ )
 {
   scanline = bitmapek.scanline[y];
   for(int x = 0; x < w; x++ ) 
    if( scanline[x] == biały ) sumek++;
 }

Pole = sumek * polePixela;
[/code]
marsoft
Użytkownik
Użytkownik
Posty: 64
Rejestracja: 17 kwie 2005, o 10:51
Płeć: Mężczyzna
Lokalizacja: Rzeszów
Podziękował: 3 razy

S i V wycinka

Post autor: marsoft »

hmm....a co wziąźć za pole pixela? hmm.... gdy mam sume punktow to wg Ciebie wystarczy je pomnozyc przez pole pixela i to da pole całości? Jeśli tak to byłbym w domu choć sam podpowiedz jeszcze z tym pixelem o co chodzi?
Fibik
Użytkownik
Użytkownik
Posty: 953
Rejestracja: 27 wrz 2005, o 22:56
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 11 razy
Pomógł: 74 razy

S i V wycinka

Post autor: Fibik »

To nie jest problem.
Użytkownik podaje wielkość piksela: w i h, wtedy: sPixel = w*h,
albo tylko zakładamy, że w=h i czytamy jeden wymiar: sPixel = d*d.

Z ekranu też można policzyć:
Pole ekranu w mm^2: sEkran = screen_sizex*sereen_sizey;
liczba pixeli na ekranie: npix = resX*resY

czyli pole jednego pixela w mm^2: sPix = sEkran/npix
Jeszcze skala: sPixSkalowany = sPix*skala*skala
--------

GetDeviceCaps(hdc, param)
param:
HORZSIZE Width, in millimeters, of the physical screen.
VERTSIZE Height, in millimeters, of the physical screen.
HORZRES Width, in pixels, of the screen.
VERTRES Height, in raster lines, of the screen.

np. szerokość w mm:
wmm = GetDeviceCaps(hdc, HORZSIZE);
to hdc w delfinie to Handle ze Screen = Canvas dla całego ekranu
marsoft
Użytkownik
Użytkownik
Posty: 64
Rejestracja: 17 kwie 2005, o 10:51
Płeć: Mężczyzna
Lokalizacja: Rzeszów
Podziękował: 3 razy

S i V wycinka

Post autor: marsoft »

hmm... np
//pole powierzchni monitora pix
xMM := GetDeviceCaps(deskDC,HORZSIZE); 320mm
yMM := GetDeviceCaps(deskDC,VERTSIZE); 240mm
sEkran:= xMM*yMM; 76800mm^2

//liczba pixeli na ekranie przy rozdzielczości 1024x768
npix:= yPix*xPix; 786432 n

//pole jednego pixela
sPix:= sEkran/npix; 0,09765625 mm^2

gdzie wykorzystać sPixelSkalowanie?? i do czego? bo mam rozumieć że to jest DPI.
Jakaś tam wartość wyszła dosyć mała ale czy rzeczywista? Zapewne trzeba jeszcze gdzieś upakować to skalowanie - podpowiedz gdzie i jak, bo jakies głupoty wyszły jeśli to pomnożyłem przez DPI

//po skalowaniu
sPixSkala:=sPix*sX*sY; 900mm^2

[ Dodano: Czw Sty 05, 2006 2:19 am ]
marsoft pisze:hmm... np
//pole powierzchni monitora pix
xMM := GetDeviceCaps(deskDC,HORZSIZE); 320mm
yMM := GetDeviceCaps(deskDC,VERTSIZE); 240mm
sEkran:= xMM*yMM; 76800mm^2

//liczba pixeli na ekranie przy rozdzielczości 1024x768
npix:= yPix*xPix; 786432 n

//pole jednego pixela
sPix:= sEkran/npix; 0,09765625 mm^2

gdzie wykorzystać sPixelSkalowanie?? i do czego? bo mam rozumieć że to jest DPI.
Jakaś tam wartość wyszła dosyć mała ale czy rzeczywista? Zapewne trzeba jeszcze gdzieś upakować to skalowanie - podpowiedz gdzie i jak, bo jakies głupoty wyszły jeśli to pomnożyłem przez DPI

//po skalowaniu
sPixSkala:=sPix*sX*sY; 900mm^2
Narysowałem w photoshop obrazek 5x5 cm i sprawdziłem pole powierzchni. Powinno wyjść 250mm tyle niestety nie wychodzi. Dobrałem natomiast tak pole powierzchni pixela aby tyle wyszło jest to w przybliżeniu 0.012 mm^2 Mi jak już pisałem wyżej wychodzi 0,09765625 mm^2 czyli coś jest nie tak
Fibik
Użytkownik
Użytkownik
Posty: 953
Rejestracja: 27 wrz 2005, o 22:56
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 11 razy
Pomógł: 74 razy

S i V wycinka

Post autor: Fibik »

Może w tej szopie wyszło 0.12 nie 0.012 (prawie 100 pixeli w mm2)-> na ekranie są cale logiczne: calLog = cal*96/72 :idea:
96/cal -> 96/25.4 = 3.78 punktów/mm policz sobie ile zmieści się w mm2.


Nie wiem co tam za dpi stosujesz - rozdzielczość to wymiar/liczbapixeli, a przecież tak robimy - więc na cholerę nam jakieś inne dpi ma się jeszcze tu plątać.
------------

Poprzednia metoda jest zależna od rozdzielczości ekranu, zatem robimy inaczej.

User podaje tylko skalę.
My operujemy na calach logicznych: dpi = LogPixels (zawsze 96 dla ekranu)
Liczymy wymiary 1 punktu:
dx = dy = 25.4/dpi [mm]

Ostateczne pole piksela: sPixFinal = dx*dy * skala^2 [mm2]
skala jest to taka rzecz, że skala jest taka: 1 : skala
ODPOWIEDZ