2009-05-18 10 views
11

Je tente de comprendre la réduction d'échelle. Je peux voir comment les algorithmes d'interpolation tels que le bicubique et le plus proche voisin peuvent être utilisés lors de l'upscaling, pour "remplir les blancs" entre les anciens points connus (pixels, dans le cas d'images).Algorithmes d'interpolation lors de la réduction d'échelle

Mais le downscaling? Je ne peux pas voir comment toute technique d'interpolation peut être utilisée là-bas. Il n'y a pas de blanc à remplir! Je suis coincé avec cela depuis longtemps, donnez-moi un coup de pouce dans la bonne direction. Comment interpolez-vous lorsque vous supprimez des données connues?

Édition: Supposons que nous ayons une image unidimensionnelle, avec un canal de couleur par point. Un algorithme downscale redimensionnant 6 à 3 points par valeur de pixel moyenne ressemble à ceci: 1,2,3,4,5,6 = (1 + 2)/2, (3 + 4)/2, (5 + 6)/2 Suis-je sur la bonne voie ici? Cette interpolation dans la réduction d'échelle est-elle préférable à la simple suppression des données?

+0

Votre modification a l'idée correcte. 1,2,3,4,5,6 -> 1,5, 3,5, 5,5. Un autre exemple est 6,0,6,0,6,0 -> 3, 3, 3; ce qui est mieux que 0,0,0 ou 6,6,6. – tom10

Répondre

5

Ici, vous avez l'image originale en haut, puis un algorithme de suppression naïf au milieu, et un algorithme d'interpolation en bas.

Considérons un gros projecteur. La lumière au centre est la plus brillante, et la lumière sur les bords devient plus sombre. Quand vous l'éloignez plus loin, est-ce que vous vous attendriez à ce que le faisceau lumineux perde subitement l'obscurité près des bords et devienne un solide contour de lumière?

Non, et la même chose se produit ici pour le logo de stackoverflow. Comme vous pouvez le voir dans le premier downscaling, l'image a perdu la douceur de ses bords et a l'air horrible. La deuxième réduction d'échelle a conservé la douceur des bords en faisant la moyenne de l'environnement des pixels. Un simple filtre de convolution à essayer est d'ajouter les valeurs RVB du pixel et de tous les autres pixels qui l'entourent, et de faire une moyenne simple. Puis remplacez le pixel avec cette valeur. Vous pouvez ensuite ignorer les pixels adjacents puisque vous avez déjà inclus cette information dans le pixel central.

alt text

+0

Donc un algorithme downscale unidimensionnel qui compte la moyenne pourrait ressembler à ceci (6 points à 3 points): 1,2,3,4,5,6 = (1 + 2)/2, (3 + 4)/2 , (5 + 6)/2. Correct? Ici, la grille d'échantillons comprend deux points pendant l'échelle, mais dois-je échantillonner plus de points dans plus de directions de toute façon? – Mizipzor

+0

Oui, vous pourriez le faire de cette façon. Plus d'échantillons signifie généralement de meilleures images, mais vous devriez être prudent. Les pixels éloignés du nouveau noyau devraient généralement contribuer moins au nouveau pixel qu'un pixel proche. – Unknown

+2

Je pense que les images sont manquantes. Ou vouliez-vous vraiment afficher cette image de couverture DVD? Pourriez-vous republier les images s'il vous plaît? Cela aiderait beaucoup. – Joerg

8

Qu'il s'agisse d'upscaling ou de downscaling, l'interpolation en cours est en fait un ré-échantillonnage.

Si le nombre d'échantillons dans la version réduite n'est pas un diviseur pair du nombre total d'échantillons (pixels, etc.), le simple rejet des données produira des erreurs d'échantillonnage apparaissant dans une image comme "jaggies". Si à la place, vous interpolez où les nouveaux échantillons se situeraient dans l'espace entre les échantillons existants en utilisant l'un des algorithmes que vous mentionnez, les résultats sont beaucoup plus fluides.

Vous pouvez conceptualiser cela en tant que première mise à l'échelle du multiple le moins commun de l'ancienne et de la nouvelle taille, puis redimensionnement en supprimant les échantillons, uniquement sans générer réellement le résultat intermédiaire.

+0

Mais la réduction avec un diviseur pair (2, 4, 8) en supprimant simplement les données produit également des erreurs d'échantillonnage, correct? – Mizipzor

+1

Oui, ce ne sera certainement pas la même chose que «réellement» rééchantillonner les données source. Cependant, l'interpolation «devine» où les choses peuvent être mais ne garantit pas qu'elles sont réellement là. Vous devrez rééchantillonner les données d'origine si vous voulez qu'elles soient précises. – sybreon

+2

"Moyennage" est préférable à la mise au rebut - il peut produire un résultat plus homogène. Dans certains cas, des filtres plus sophistiqués sont utilisés pour pondérer des groupes de points lors de la réduction d'échelle. Lors de la mise à l'échelle d'une image 2D, vous devrez regrouper plusieurs points, et pas seulement quelques points adjacents. –

9

Si l'on conceptualise un pixel original comme ayant une largeur n, alors le centre du pixel est n/2 à partir de chaque bord.

On peut supposer que ce point, au centre du pixel définit la couleur. Si vous sous-échantillonnez, vous pouvez penser de façon conceptuelle: même si vous réduisez la taille physique, pensez plutôt à conserver les mêmes dimensions, mais en réduisant le nombre de pixels (qui augmentent en taille). conceptuellement). Ensuite, on peut faire les calculs ...

Exemple: votre image a une hauteur de 1 pixel et une largeur de 3 pixels, et vous allez seulement la réduire horizontalement. Disons que vous allez changer cela à 2 pixels de large. Maintenant, l'image originale est 3n, et vous la tournez à 2 pixels, donc chaque nouveau pixel prendra (3/2) d'un pixel de l'image originale. Ne plus penser aux centres ... les centres des nouveaux pixels sont (3/4) n et (9/4) n [qui est (3/4) + (3/2)]. Les centres des pixels d'origine étaient à (1/2) n, (3/2) n et (5/2) n. Ainsi, chaque centre se situe quelque part entre les centres des pixels d'origine - aucun ne correspond aux centres des pixels d'origine. Regardons le premier pixel à (3/4) n - il est à (1/4) n du premier pixel original, et (3/4) n du deuxième pixel d'origine. Si nous voulons maintenir une image lisse, utilisez la relation inverse: prendre (3/4) des valeurs de couleur du premier pixel + (1/4) des valeurs de couleur de la seconde, puisque le nouveau pixel centre, conceptuellement, sera plus proche du premier centre de pixel original (n/4) que de la seconde (3n/4).

Ainsi, il n'est pas nécessaire de vraiment éliminer les données - on calcule simplement les rapports appropriés à partir de ses voisins (dans un espace conceptuel où la taille physique de l'image totale ne change pas). C'est un moyennage plutôt qu'un saut/un rejet strict.

Dans une image 2D, les rapports sont plus compliqués à calculer, mais l'essentiel est le même. Interpolez et tirez plus de la valeur des «voisins» d'origine les plus proches. L'image résultante devrait ressembler à l'original à condition que le sous-échantillon ne soit pas terriblement sévère.

+1

Très belle réponse, j'avais besoin d'un stylo et d'un papier pour y aller mais je pense que je l'ai maintenant. Mais en supposant que nous divisons la taille avec un nombre pair (2,4,8) de sorte que la grille de l'échantillon s'aligne parfaitement avec l'ancienne grille de pixels. Est-ce que je prendrais toujours une quantité égale de données de pixel de chaque pixel dans chaque cellule de la grille d'échantillon? – Mizipzor

+0

si c'est encore vous pourriez moyenne. Il y a beaucoup, beaucoup de manières différentes de mettre à l'échelle une image. – Demi

+1

Une autre façon d'y penser est de la même manière conceptuelle où la taille physique ne changera pas mais la largeur du pixel, mais en tenant compte du nombre de pixels originaux et de la quantité de chaque pixel que le nouveau pixel consomme. Cela fonctionnerait bien sur des nombres pairs (par exemple, lors d'une mise à l'échelle horizontale de 4 pixels à 2, chaque nouveau pixel consommerait deux vieux pixels - les égaliser de manière égale). – Demi

6

Cette esquisse montre une section de quelques pixels qui commencent par trois pixels (courbe noire) et sont sous-échantillonnés à deux pixels (courbe rouge) en utilisant l'interpolation (courbe bleue). L'interpolation est déterminée à partir des trois pixels d'origine et les deux derniers pixels sont mis à la valeur de l'interpolation au centre de chaque pixel final. (Dans le cas où on ne sait pas ici, le montre l'axe vertical est l'intensité de chaque pixel pour un seul canal de couleur.)

alt text http://img391.imageshack.us/img391/3310/downsampling.png

+0

Pouvez-vous restaurer l'image? – nobar

+0

@nobar: désolé, mais je n'ai aucune idée d'où l'image est allée et certainement pas une copie de 5 ans. Espérons que SO ou imageshack le restaurera ... savez-vous combien de temps cela a été passé? Sinon, je pourrais avoir l'occasion de le refaire, mais je ne l'ai pas maintenant. – tom10

2

Que nous upscaling ou downscaling, nous devons déterminer (à un certain degré de précision) quelle sera la valeur de la couleur à un point entre deux pixels.

permet de prendre une seule rangée de pixels:

P  P  P  P  P  P  P  P  P 

et nous Suréchantillonner, nous voulons connaître les valeurs de pixel à utiliser à l'entre-deux points:

P P P P P P P P P P P P P 

et quand nous sous-échantillonner , nous voulons également connaître les valeurs de pixels à utiliser à l'entre-deux points:

P  P  P  P  P  P  P 

(Bien sûr, nous voulons pour faire cela en deux dimensions au lieu d'une, mais c'est le même principe.)

Donc, indépendamment, nous devons interpoler pour déterminer la bonne valeur d'échantillon. Selon l'exactitude des résultats, il existe différentes techniques d'interpolation. Idéalement, nous devrions rééchantillonner correctement toutes les mathématiques impliquées ... mais même cela n'est qu'une interpolation rigoureuse!

1

Si vous utilisez un filtre sinc fenêtré, tels que lanczos, il filtre fait ressortir les détails de haute fréquence qui ne peuvent pas être représentés à la résolution inférieure. Un filtre de moyenne ne le fait pas, ce qui provoque des artefacts. Un filtre sinc produit également une image plus nette et fonctionne à la fois pour l'upscaling et la downscaling. Si vous deviez incrémenter une image avec sinc, puis la redimensionner à sa taille d'origine, vous obtiendrez presque exactement la même image, alors que si vous ne faites que la moyenne des pixels lorsque vous réduisez la taille, vous obtiendrez quelque chose légèrement plus flou que l'original. Si vous utilisiez une transformée de Fourier pour redimensionner, ce que la fenêtre fenêtrée essaie d'approximer, vous obtiendrez l'image originale exacte, à l'exception des erreurs d'arrondi.

Certaines personnes n'aiment pas la légère sonnerie autour des arêtes vives qui proviennent de l'utilisation d'un filtre sinc. Je suggérerais la moyenne pour les graphiques vectoriels de downscaling, et sinc pour les photos de downscaling.

Questions connexes