La méthode d'interpolation bilinéaire pour agrandir les images bitmap
Je suis étudiant, et j'ai été chargé d'optimiser la méthode d'interpolation bilinéaire des images en invoquant le parallélisme de CUDA.
L'image est donnée comme un 24-bit .format bmp. J'ai déjà un lecteur pour le .bmp et ont stocké les pixels dans un tableau.
Maintenant, j'ai besoin pour effectuer l'interpolation bilinéaire sur le tableau. Je ne comprends pas le calcul derrière tout ça (même après être passé par le l'article wiki et d'autres résultats de Google). De ce fait je ne suis pas en mesure de venir avec un algorithme.
Est-il quelqu'un qui peut m'aider avec un lien à un algorithme d'interpolation bilinéaire sur un 1-D tableau? Ou peut-être lien vers l'open source de traitement d'image de la bibliothèque qui utilise bilinéaire et bicubique d'interpolation pour la mise à l'échelle des images?
N'est-ce pas la méthode d'interpolation bilinéaire, par définition, signifie pour la 2D tableaux?
Pour la 2-D des images. Mais une image 2-D peut être mappé sur un 1-D array (c'est très rare de trouver des applications C++ à l'aide de véritables tableaux 2d).
Très vrai, mais c'est toujours théoriquement d'une matrice.
Comprenez-vous les mathématiques derrière simple interpolation linéaire si? Si vous comprenez cela, vous l'aurez compris, avec un peu plus de pensée. Il n'est pas aussi compliqué que vous le pensez...
OriginalL'auteur f0rfun | 2012-01-10
Vous devez vous connecter pour publier un commentaire.
La meilleure façon de comprendre la méthode d'interpolation bilinéaire est de comprendre l'interpolation linéaire en 1D.
Cette première figure devrait vous donner des flashbacks de mathématiques de collège. Compte tenu de certaines emplacement un à qui nous voulons savoir f(a), nous prenons le voisin "connu" des valeurs et de l'ajustement d'une ligne entre eux.
Donc nous avons juste utilisé l'ancien collège des équations y=mx+b et y-y1=m(x-x1). Rien de fantaisie.
Nous avons essentiellement du report de ce concept à 2-D dans l'ordre pour obtenir une interpolation bilinéaire. Nous pouvons attaquer le problème de trouver f(a,b) pour tout a,b en faisant trois interpolations. L'étude de la figure suivante soigneusement. N'obtenez pas intimidé par toutes les étiquettes. C'est en fait assez simple.
Pour une interpolation bilinéaire, nous avons de nouveau à l'aide de la voisine de points. Il y a maintenant quatre d'entre eux, puisque nous sommes en 2D. Le truc, c'est de s'attaquer au problème une dimension à la fois.
Nous notre projet (a,b) pour les côtés et le premier calcul (les deux dimensions!) l'interpolation des lignes.
Maintenant, il ya juste une dernière étape. Vous prenez les deux points que vous avez calculé, f(a,yj) et f(a,yj+1), et fit une ligne entre eux. C'est le bleu de gauche à droite dans le diagramme, en passant par le f(a,b). L'interpolation le long de cette dernière ligne vous donne la réponse finale.
Je vais laisser les maths pour les 2-D des cas pour vous. Il n'est pas difficile si vous travaillez à partir du diagramme. Et en passant par vous-même vous aidera à apprendre ce qu'il se passe.
Une dernière petite remarque, il n'a pas d'importance quel côté que vous choisissez pour le premier de deux interpolations. Vous pourriez avoir ramassé le haut et le bas, puis fait le troisième ligne d'interpolation entre ces deux la place. La réponse aurait été la même.
Merci!!!! C', et @Alex réponse de l'ensemble étaient vraiment instructif dans la façon dont la méthode d'interpolation bilinéaire des œuvres.
OriginalL'auteur nsanders
Lorsque vous agrandissez une image en la redimensionnant les côtés par une partie intégrante, vous pouvez traiter le résultat que l'image d'origine avec des pixels supplémentaires insérés entre les pixels d'origine.
Voir les photos dans IMAGE REDIMENSIONNER EXEMPLE.
La
f(x,y)=...
formule dans cet article dans Wikipedia vous donne une méthode pour calculer la couleurf
d'un insérés pixel:Pour chaque inséré pixel vous combinez les couleurs des 4 pixels d'origine (Q11, Q12, Q21, Q22) qui l'entourent. La combinaison dépend de la distance entre l'insertion des pixels et l'entourant d'origine pixels, plus c'est à l'un d'eux, le plus près leurs couleurs sont:
Les pixels d'origine est affiché en rouge. Le insérée pixel est en vert.
C'est l'idée.
Si vous redimensionnez les côtés par un non-facteur intégrante, les formules tiennent toujours, mais maintenant vous avez besoin de recalculer tous les pixels de couleurs que vous ne pouvez pas juste prendre les pixels d'origine et il suffit d'insérer pixels entre eux.
OriginalL'auteur Alexey Frunze
Ne pas vous attardez sur le fait que la 2D tableaux en C sont vraiment tableaux 1D. C'est un détail d'implémentation. Mathématiquement, vous aurez toujours besoin de penser en termes de tableaux 2D.
Penser à une interpolation linéaire sur un tableau 1D. Vous connaissez la valeur à
0, 1, 2, 3, ...
Maintenant, supposons que je vous demande pour la valeur de l'1.4
. Vous me feriez pondérée de la combinaison des valeurs à1
et2
:(1 - 0.4)*A[1] + 0.4*A[2]
. Simple, non?Maintenant, vous avez besoin d'étendre à la 2D. Pas de problème. 2D interpolation peut être décomposé en deux 1D interpolations, dans l'axe des x et y de l'axe. Dites que vous voulez
(1.4, 2.8)
. Obtenir les 1D pour les interpolants entre(1, 2)<->(2,2)
et(1,3)<->(2,3)
. C'est l'axe des x de l'étape. Maintenant 1D interpoler entre eux avec les poids appropriés poury = 2.8
.Cela devrait être simple à faire massivement parallèle. Viens de calculer, pour chaque pixel interpolé séparément. Avec de la mémoire partagée de l'accès à l'image d'origine, vous n'aurez qu'à faire lit, donc pas de problèmes de synchronisation.
OriginalL'auteur japreiss