2012-01-10 11 views
7

Jestem studentem, a moim zadaniem było zoptymalizować dwuliniową interpolację obrazów poprzez wywołanie równoległości z CUDA.Interpolacja dwuliniowa w celu powiększenia obrazów bitmapowych

Zdjęcie jest podawane w postaci 24-bitowego formatu .bmp. Mam już czytnik dla .bmp i zapisałem piksele w tablicy.

Teraz potrzebuję wykonać interpolację dwuliniową w macierzy. Nie rozumiem matematyki stojącej za tym (nawet po przejściu przez wiki article i inne wyniki Google). Z tego powodu nie jestem w stanie wymyślić algorytmu.

Czy jest ktoś, kto może mi pomóc z linkiem do istniejącego algorytmu interpolacji bilinearnej na tablicy 1-D? A może połączyć się z biblioteką przetwarzania obrazu open source, która wykorzystuje interpolację biliniową i bikubiczną do skalowania obrazów?

+2

Masz za zadanie napisać własne? –

+4

Czy interpolacja dwuliniowa z definicji nie jest przeznaczona dla macierzy 2D? – Phonon

+0

Moim głównym celem jest optymalizacja za pomocą CUDA. To, w jaki sposób skalowanie obrazu odbywa się za pomocą dwuliniowego, jest tylko etapem pośrednim. Powinien edytować mój post. Profesor chce wyników optymalizacji, więc reszta należy do mnie. Za pomocą algorytmu mogę przejść do wywoływania CUDA, aby wykonać go równolegle, co przyspieszy to.:) – f0rfun

Odpowiedz

37

Najprostszym sposobem zrozumienia interpolacji dwuliniowej jest zrozumienie interpolacji liniowej w 1D.

Ta pierwsza cyfra powinna dać ci retrospekcje do matematyki w gimnazjum. Biorąc pod uwagę pewną lokalizację a, przy której chcemy poznać f (a), bierzemy sąsiadujące "znane" wartości i dopasowujemy linię między nimi.

Linear interpolation in 1D.

Więc po prostu stosować stare równania gimnazjum y = mx + b i y-y1 = m (x-X1). Nic fajnego.

W zasadzie przenosimy tę koncepcję na 2-D, aby uzyskać interpolację dwuliniową. Możemy zaatakować problem ze znalezieniem f (a, b) dla każdego a, b poprzez wykonanie trzech interpolacji. Przestudiuj uważnie następną figurę. Nie daj się zastraszyć przez wszystkie etykiety. To jest naprawdę proste.

Bilinear interpolation as three 1D interpolations.

Dla Interpolacja dwuliniowa, ponownie używając punktów sąsiednich. Teraz są ich cztery, ponieważ jesteśmy w 2D. Sztuką jest atakowanie problemu po jednym wymiarze naraz.

Projektujemy nasz (a, b) na bokach i najpierw obliczamy dwie (jednowymiarowe!) Linie interpolujące.

  • f (a, y J) gdzie Y J jest stała
  • f (a, y J + 1) gdzie Y J + 1 jest utrzymywany na stałym poziomie.

Teraz jest tylko jeden ostatni krok. Bierzesz dwa punkty ty obliczone f (a, y j) i f (a, y j + 1) i dopasować linię pomiędzy nimi. To niebieski, idąc od lewej do prawej na schemacie, przechodząc przez f (a, b). Interpolacja wzdłuż tej ostatniej linii daje ostateczną odpowiedź.

Zostawię dla ciebie matematykę dla przypadku 2-D. Nie jest trudno pracować na diagramie. Samo przejście przez to pomoże ci naprawdę dowiedzieć się, co się dzieje.

Ostatnia drobna uwaga, nie ma znaczenia, które strony wybiorą dla pierwszych dwóch interpolacji. Mogłeś wybrać górny i dolny, a następnie zamiast tego wykonać trzecią linię interpolacji między tymi dwoma. Odpowiedź byłaby taka sama.

+0

Wspaniałe zdjęcia i ładnie wyjaśnione – pezcode

+0

Dziękujemy! To i odpowiedź Alexa były naprawdę pouczające, jak działa bilinarna interpolacja. – blahman

9

Podczas powiększania obrazu poprzez skalowanie boków za pomocą współczynnika integralnego można traktować wynik jako oryginalny obraz z dodatkowymi pikselami wstawionymi między oryginalnymi pikselami.

Zobacz zdjęcia w IMAGE RESIZE EXAMPLE.

Formuła w this article in Wikipediaf(x,y)=... daje metodę obliczenia koloru f włożonej piksela:

enter image description here

Dla każdego włożonego piksela połączenia kolorów z 4 oryginalnych pikseli (Q11, Q12, Q21, Q22) otaczające go. Połączenie zależy od odległości pomiędzy włożonej piksela i okolicznych oryginalnych pikseli, tym bliżej jest do jednego z nich, im bliżej ich kolory są:

enter image description here

Oryginalne piksele są wyświetlane jako czerwone. Wstawiony piksel jest wyświetlany jako zielony.

Oto pomysł.

Jeśli skalujesz boki przy pomocy współczynnika nie-integralnego, formuły wciąż trzymają się, ale teraz musisz ponownie obliczyć wszystkie kolory pikseli, ponieważ nie możesz po prostu wziąć oryginalnych pikseli i po prostu wstawić dodatkowe piksele między nimi.

3

Nie powiesić się na tym, że tablice 2D w C są naprawdę tablicami 1D. To szczegół implementacji. Matematycznie, nadal będziesz musiał myśleć w kategoriach tablic 2D.

Pomyśl o interpolacji liniowej na macierze 1D. Znasz wartość na 0, 1, 2, 3, ... Teraz przypuść, że pytam Cię o wartość pod 1.4. Dałeś mi ważoną mieszankę wartości pod 1 i 2: (1 - 0.4)*A[1] + 0.4*A[2]. Proste, prawda?

Teraz należy rozszerzyć do 2D. Nie ma problemu. Interpolację 2D można rozłożyć na dwie interpolacje 1D, na osi x, a następnie na osi Y. Powiedz, że chcesz (1.4, 2.8). Uzyskaj interpolanty 1D między (1, 2)<->(2,2) i (1,3)<->(2,3). To jest twój krok w osi X. Teraz 1D interpoluje je z odpowiednimi wagami dla y = 2.8.

To powinno być proste, aby masowo równolegle. Oblicz każdy interpolowany piksel osobno. Dzięki współużytkowanej pamięci do oryginalnego obrazu będziesz robić tylko odczyty, więc nie ma problemów z synchronizacją.