interpolacja dwuliniowa

0

wczytuje obrazek

 img = new QImage(":/logo.jpg"); //wyswietlany obrazek
 oryginal = new QImage(":/logo.jpg"); // zapamietanie oryginalnego obrazka
// Wskaznik za pomoca, ktorego bedziemy modyfikowac obraz
    unsigned char *ptr,*org;
    czysc();
    // Funkcja "bits()" zwraca wskaznik do pierwszego piksela danych
    org = oryginal->bits();
    ptr = img->bits();

mam funkcje interpolacja ze wzorem

double MyWindow::Interpolacja(int x, int y, double dx){
    return (1-dx)*x+dx*y;
}
   // W kazdym wierszu jest "szer" pikseli (tzn. 4 * "szer" bajtow)

 // interpolacja dla poziomu z dwuch pionow
                ptr[szer*4*i + 4*j] = round(Interpolacja(Interpolacja(org[szer*4*x + 4*y],org[szer*4*xn + 4*y],a),Interpolacja(org[szer*4*x + 4*yn],org[szer*4*xn + 4*yn],a),b));
                ptr[szer*4*i + 4*j + 1] = round(Interpolacja(Interpolacja(org[szer*4*x + 4*y + 1],org[szer*4*xn + 4*y + 1],a),Interpolacja(org[szer*4*x + 4*yn + 1],org[szer*4*xn + 4*yn + 1],a),b));
                ptr[szer*4*i + 4*j + 2] = round(Interpolacja(Interpolacja(org[szer*4*x + 4*y + 2],org[szer*4*xn + 4*y + 2],a),Interpolacja(org[szer*4*x + 4*yn + 2],org[szer*4*xn + 4*yn + 2],a),b));

x,y,a,b nie są ważne , czy ktoś moze mi wytlumaczyc jak ta interpolacja działa i w jaki sposob te argumenty zostaly przekazane bo dla mnie to jest mega nie czytelne nie moge tego zrozumiec z gory dziekuję

1

NIE RÓB new QImage. QImage to tak naprawdę zarządzanie pamięcią robi sam i używa implicit data sharing razem z copy on write.
Poza tym Qt ma już zaimplementowaną iterpolację dwuliniową: Qt::SmoothTransformation i między innymi QImage ma tą funkcjonalność.

0

Wiem, ale na interpolację muszę użyć wzoru

0

Zrozumienie bardziej, bo często tego typu kod stosuje do różnych przekształceń 2d lub teksturowania

1

czy ktoś moze mi wytlumaczyc jak ta interpolacja działa

Tak, tutaj masz instrukcję

(1- time) * x + time * y

W zależności od zmiany parametru time przesuwamy 'suwakiem' pomiędzy wartością x, a y.
Podstaw sobie (na kartce) zamiast time wartości: 0, 0.5, 1 i załapiesz.
W grafice często trzymamy wartość time w przedziale <0;1> (bo nie chcemy 'przestrzelić').

w jaki sposob te argumenty zostaly przekazane

Poprzez wartość.

Możesz to:

ptr[szer*4*i + 4*j] = round(Interpolacja(Interpolacja(org[szer*4*x + 4*y],org[szer*4*xn + 4*y],a),Interpolacja(org[szer*4*x + 4*yn],org[szer*4*xn + 4*yn],a),b));

zapisać jako:

auto coord_x = Interpolacja(org[szer*4*x + 4*y],org[szer*4*xn + 4*y],a);
auto coord_y = Interpolacja(org[szer*4*x + 4*yn],org[szer*4*xn + 4*yn],a),b);
ptr[szer*4*i + 4*j] = round(Interpolacja(coord_x, coord_y);

Przepraszam, ale muszę:

// interpolacja dla poziomu z dwuch pionow

dwóch

1 użytkowników online, w tym zalogowanych: 0, gości: 1