PDA

Prikaži potpunu verziju : Spajanje slika u C, C++


optimus_prime
6.3.2010, 21:00
Pozdrav,

Problem je sledeci: Imam jednu sliku u kojoj je putnicki avion, slika je 150 X 50 mm, imam onda masku od te slike gde je sve ostalo crno samo gde je avion tu je belo, a ja treba da tu sliku spojim na trecu sliku po odredjenim koordinatama tako da ispadne da taj avion leti iznad nekih planina. Kako se radi spajanje slika, morfing ili kako se vec zove.

fingerprint
6.3.2010, 23:27
U C-u ili C++-u? Moras naci neku biblioteku koja moze da cita/pise slike i manipuliše njima. Znači bilo šta što može ovo da radi, CxImage, SDL, OpenCV (ne podržava alpha u slikama), ImageMagic (Magick++)...

Posebno pogledaj Magick++, koji koliko ja znam može vrlo lako da ti obavi maskiranje.

optimus_prime
7.3.2010, 15:05
U C-u ili C++-u? Moras naci neku biblioteku koja moze da cita/pise slike i manipuliše njima. Znači bilo šta što može ovo da radi, CxImage, SDL, OpenCV (ne podržava alpha u slikama), ImageMagic (Magick++)...

Posebno pogledaj Magick++, koji koliko ja znam može vrlo lako da ti obavi maskiranje.

Problem je sto to moram da uradim rucno, od biblioteka koristim Boost, i ZLIB, i framework koji sam dobio.

Imam jednu sliku koja je isecena, pa onda istu tu samo kao masku i onda zavrsni background. Ne kontam foru kako da sklopim 2 slike a i sta ce mi maska?

optimus_prime
7.3.2010, 15:09
U sustini meni treba samo algoritam koji ce to da ubaci. e sada data mi je jedna formula koja glasi ovako

Intensitet=(1-w) *Intenbackground + w*IntensitetSlike koju treba da ubacim i tako treba za svaki kanal.

MG-RAY
7.3.2010, 17:03
Maska ti je potrebna da bi znao koje piksele ćeš da prepišeš, a koje da zadržiš...

Ne zove se morfing, već samo treba jednu sliku da zalepiš na drugu, ovako (http://en.wikipedia.org/wiki/Image_mask#Image_masks). Maskiranje, ukratko...

Drugo, ako vec moraš slike da učitas ručno, najlakše ćes proći sa BMP formatom... Tj. najbezbolnije...

Za ostale, moraćeš da ih dekompresuješ, u čemu će ti zlib donekle pomoći.

Sto se samog procesa maskiranja tiče, to ti je najlakši deo posla...

Sada, nisi nam rekao da li je potrebno da samo prikažeš rezultat, ili da to sačuvaš kao gotovu sliku, ili šta već...

fingerprint
7.3.2010, 17:26
Intensitet=(1-w) *Intenbackground + w*IntensitetSlike koju treba da ubacim i tako treba za svaki kanal.

Neki to zovu mix, neki to zovu lerp :) Ja više volim lerp jer zvuči za*ebano :kreza:

Ono što prvo i osnovno moraš da uradiš, je da nađeš način da učitaš sliku, i pristupiš njenim pikselima (verovatno taj framework koji si pomenuo radi bas to). Znači nađi način da sliku učitaš u memoriju, i uradi helper funkcije/metode za getPixel setPixel. Za dalje ćeš vrlo lako. Pod pretpostavkom da imamo sledeće strukture i funkcije :



struct pixel
{
//Uzecemo da su u pikselu boje predstavljene kao normalizovani float, ladi lakseg rada
float r, g, b;

bool is_black() const;
bool is_white() const;
};


struct image
{
/*Neki tamo podaci, nama nisu vazni*/
int w, h; //Sirina, visina
int image_type; //Predpostavimo 3 bajta, RGB format, moze nam se
//Ovako pristupamo pikselima
pixel get_pixel(int x, int y) const;
void set_pixel(int x, int y, const pixel &pixel);
};

//e, sad, ovo ti treba :

//v1, v2, i amount moraju biti normalizovani
float lerp( float v1, float v2, float amount )
{
return (1-amount)*v1 + amount*v2;
}

//Blenduje piksel
pixel lerp_pixel(const pixel &src, const pixel &dst, float amount)
{
pixel ret;
ret.r = lerp(src.r, dst.r, amount);
ret.g = lerp(src.g, dst.g, amount);
ret.b = lerp(src.b, dst.b, amount);
return ret;
}



//Takodje, trebaju nam helper funkcije koje ce odrediti "granice" iteracije, tako da ne idemo izvan opsega.

int min_x(const image &src, const image &dst);
int max_x(const image &src, const image &dst);
int min_y(const image &src, const image &dst);
int max_y(const image &src, const image &dst);


//Ova funkcija radi celu stvar, pod pretpostavkom da su src i src_mask iste velicine.
//Naive solution :
void blend_images( const image &src, const image &src_mask, image &dst, float amount )
{

for( yi = min_y(src, dst); yi < max_y; ++yi )
for( xi = min_x(src, dst); xi < max_x; ++xi )
{
pixel src_pixel = src.get_pixel(xi, yi);
if(src_pixel.is_white())
{
pixel dst_pixel = lerp_pixel(src_pixel, dst.get_pixel(xi,yi), amount);
dst.set_pixel(xi, yi, dst_pixel);
}
}

}


Ovo je naravno kucano iz glave, tako da ako ima neka greska, oprosti :D
Nadam se da je ovo to sto ti treba.

optimus_prime
8.3.2010, 21:31
Probacu, ako negde zaglavim, jel mogu da te pitam preko MSN-a ili skyp-a.

Hvala ti!