Adrian B.

Adrian B. Programmer

Temat: ActionScript 3 pomoc z implementacją metod

Tworzę grę w Adobe flash professional CS6 której celem jest
pokolorowanie obrazka sugerując się pokolorowanym oryginałem po
zakończeniu kolorowania do wyboru będą trzy metody porównawcze (metoda
najbliższego sąsiada, metoda k-najbliższego sąsiada, metoda
najbliższej średniej) które pokażą w jakim stopniu % udało się
pokolorować zgodnie z oryginałem. Problem mam przy implementacji tych
metod do gry. Wiem jak wygląda algorytm każdej z metod ale nie wiem jak
przypisać odpowiednie zdjęcia do tablic a potem je porównać i żeby mi
to pokazało w %.

Metoda najbliższego sąsiada

void NN(double obj, double rec)
{
double numclass, dim, num, sampl, dist, k, min, MaxReal;
rec = 0;
min = MaxReal;

for (k=1;k<=num;k++)
{
if (dist(sampl[k], obj) < min)
{
min = dist(sampl[k], obj);
rec = sampl[k][dim+1];
}
}
}

Metoda k-najbliższych sąsiadów

void kNN(double obj, double rec)
{
double num, sampl, dist, k, fun, tab, sort, pointmax, pk;

rec = 0;
fun = 0;

for (k=1;k<=num;k++)
{
tab[k][1] = dist(sampl[k], obj);
tab[k][2] = sampl[k][dim+1];
}

sort(tab);
for (k=1;k<=pk;k++)
{
fun[tab[k][2]] = fun[tab[k][2]] + 1;
rec = pointmax(fun);
}

}

Metoda najbliższej średniej

void jnNN(double obj, double rec)
{
double num, sampl, dist, k, fun, tab, sort, point;
rec = 0;
fun = 0;

for (k=1;k<=num;k++)
{
tab[k][1] = dist(sampl[k], obj);
tab[k][2] = sampl[k][dim+1];
}

sort(tab);
rec = tab[point] [2];

}
Ten post został edytowany przez Autora dnia 18.03.14 o godzinie 12:14
Jerzy Wierzchowski

Jerzy Wierzchowski Senior Software
Developer

Temat: ActionScript 3 pomoc z implementacją metod

a) znacznik code
b) to jakaś praca na uczelnie?
c) Czy metody o których piszesz to nie metody interpolacji? Skoro porównujesz wartości kolorów poszczególnych pikseli miedzy dwoma obrazkami to nie sprowadza się to do odjęcia ich wartości?

d) Potrzebujesz % wykonania operacji czy o ile % się różni jeden obrazek od drugiego? Chcesz podawać tylko ile % pixeli różni się od oryginału czy coś bardziej wysublimowanego?

BTW: Jeżeli puścisz to tak sobie w pętli for to okno flasha przestanie odpowiadać, ponieważ operacje które będziesz wykonywał są czasochłonne.Oczywiście wszytko zależy od wielkości obrazków, ale przy dałby się oddzielny wątekTen post został edytowany przez Autora dnia 17.03.14 o godzinie 21:23
Adrian B.

Adrian B. Programmer

Temat: ActionScript 3 pomoc z implementacją metod

a) poprawione
b) tak to projekt na uczelnię
c) tak to metody interpolacji. hmm tak można tak zrobić ale jak to ma się do algorytmów. ja widzę w algorytmach jedynie przyrównanie dwóch obrazków to tablicy a następnie porównywanie wartości pixel po pixelu.
d)pola kolorowani będą wypełniane jednolitym kolorem nie będę się bawił w cienie itp. kolorowanka nie jest skomplikowana wybiera się kolor klika na obszar. jeśli chodzi o % to mam na myśli zwykłe porównanie jednego i drugiego czyli ile pixeli (obszarów pokolorowanych) się różni

wiem może to okazać się czasochłonne ale muszę użyć tych metod. obrazki są małe nie jest to skomplikowana kolorowanka
Jerzy Wierzchowski

Jerzy Wierzchowski Senior Software
Developer

Temat: ActionScript 3 pomoc z implementacją metod

Nie kumam. Skoro to metody interpolacji to służą do skalowania obrazów, a nie do porównywania....
Może nie do końca zrozumiałeś polecenie (albo ja go nie rozumiem)?
Może masz ze skalować obraz 3 metodami, a potem porównać je miedzy sobą?
Adrian B.

Adrian B. Programmer

Temat: ActionScript 3 pomoc z implementacją metod

szczerze to już się pogubiłem

znalazłem coś takiego
http://mbs98.republika.pl/projekty/ro/ro.html
i tu pokazuje wszystko ładnie w % ja chciałem coś podobnego zrobić tylko z kolorowankaTen post został edytowany przez Autora dnia 19.03.14 o godzinie 13:50
Piotr Kubasiak

Piotr Kubasiak Flex developer

Temat: ActionScript 3 pomoc z implementacją metod

Tą banalną gierkę wykonasz wyłącznie uzywajać już gotowych funkcji obiektu BitmapData. Zobacz metody threshold oraz compare.

Za pomocą algorytmów które wymieniłeś to musisz :
pętla po pikselach ( bitmapData.getPixel ) i dla current piksela pobierasz także x sąsiednich pikseli ,wyliczasz średnią ( np wartosci kolorów) i tą średnią porównujesz z tak samo pobranymi pikselami z oryginału.

Czyli skrótem:

pętla for (i = 0 , i = szerokosc obrazka)
pętla for (y = 0 , i = wysokosc obrazka)

oryginal.getPixel(i,y);
kolorowankagetPixel(i,y);

//tutaj dopisujesz jeszcze pobranie od X sąsiadów

sumujesz im wartość kolorów;

porównujesz ze sona sume kolorów z oryginału i kolorowanki jesli spełniają załozony % błędu to zaliczasz piksel jako pomalowany OK a jak nie to Błąd.

Pozdrawiam.
Adrian B.

Adrian B. Programmer

Temat: ActionScript 3 pomoc z implementacją metod

Stworzyłem coś takiego ale nadal jest coś źle ponieważ nie ważne czy obraz jest pokolorowany czy nie zawsze pokazuje 98%


btnCheck.addEventListener(MouseEvent.CLICK, goCheck);

function goCheck(MouseEvent){

var bmd1:BitmapData = new BitmapData(983, 717);
bmd1.draw(obrazek1);
var bmd2:BitmapData = new BitmapData(983, 717);
bmd2.draw(obrazek2);

var diffBmpData:BitmapData = bmd1.compare(bmd2) as BitmapData;

var diff:int = 0;
var total:int = 983 * 717;

for(var i=0; i<983; i++)
for(var j=0; j<717; j++)
diff += (diffBmpData.getPixel(i,j) != 0)? 1 : 0;

info.text = Math.round((diff / total * 100)).toString();
}



Wyślij zaproszenie do