Întreg SuprafaţăDiscretă.CreazăValoare2(Real rZ)
{
Întreg nIndex = 0;
PentruFiecare(Întreg nSDX = 2; nSDX < nX; nSDX++)
PentruFiecare(Întreg nSDY = 2; nSDY < nY; nSDY++)
{
Dacă([nSDX – 1, nSDY] > rZ ŞI [nSDX + 1, nSDY] > rZ ŞI [nSDX, nSDY] < rZ)
{
PuneLa(nSDX, nSDY, ([nSDX – 1, nSDY] + [nSDX + 1, nSDY]) / 2.0);
m.PuneLa(nSDX, nSDY, ADEVĂRAT);
nIndex++;
} //Dacă
Dacă([nSDX, nSDY – 1] > rz ŞI [nSDX, nSDY + 1] > rZ ŞI [nSDX, nSDY] < rZ)
{
PuneLa(nSDX, nSDY, ([nSDX, nSDY – 1] + [nSDX, nSDY + 1]) / 2.0);
m.PuneLa(nSDX, nSDY, ADEVĂRAT);
nIndex++;
} //Dacă
} //PentruFiecare
Întoarce(nIndex);
} //EndCreazăValoare2
Un filtru mai evoluat este acela care umple cu o valoare (şi implicit masca), eliminând zgomote de formă mai rebelă, numărând nodurile adiacente mai mici de o valoare dată şi umplând suprafaţa unde acest număr este mai mic decât o valoarea admisibilă. Acest algoritm este utilizat şi în jocul de Go, la numărarea pieselor componente ale unui grup. Este lesne de înţeles că, complexitatea acestui filtru nu este mică, necesitând chemări recursive şi marcări într-o mască auxiliară; din aceste considerente nu va fi exemplificat în cod sursă.
Întreg SuprafaţăDiscretă.CreazăMască(Întreg nMaxPuncte);
Întreg SuprafaţăDiscretă.CreazăValoare(Întreg nMaxPuncte, Real rZ);
Dostları ilə paylaş: |