9
votes

Algorithme pour déterminer la "clarté visuelle" ou la pixelation d'une image

Y a-t-il un tel moyen de déterminer combien une image pourrait être agrandie jusqu'à ce qu'elle soit considérée comme «à l'écart»?

un exemple pratique (et le problème que j'essaie de résoudre):

J'ai une image enregistrée à plusieurs tailles différentes, disons 500x500, 250x250 et 120x120. Je veux servir l'image la plus efficace, mais aussi la plus claire. Si un utilisateur devait demander une image à 125x125, augmenter évidemment l'image 120x120 à accommoder serait non seulement plus efficace, mais probablement ne causerait aucune pixelation apparente.

Pourtant, si un utilisateur devait demander une image à 180x180, il peut être plus efficace d'augmenter l'image 120x120, mais elle rendrait probablement une image floue. Dans ce cas, je voudrais rétrécir l'image 250x250.

Évidemment, la "clarté" d'une image peut être relative et varie d'un œil à l'œil, ainsi que de l'image à l'image, mais je me demande s'il existe une sorte d'algorithme ou de fonction pour déterminer un "index de pixelation" de True ... Merci!

Remarque: Utilisation de PHP & ImageMagick pour les manipulations d'image, de sorte que toute réponse dans ce domaine serait géniale ...

pour clarification: Je ne cherche pas exactement à une solution à mon exemple ci-dessus. Je cherche une réponse à la question originale: Y a-t-il un algorithme qui pourrait éventuellement déterminer comment "pixelated" une image gonflée est ... Le problème ci-dessus n'est qu'un exemple pratique de la façon dont de tels algorithme pourrait être utile.


8 commentaires

toujours rétrécir. Howing Up produira toujours un résultat de qualité inférieur à la rétrécissement d'un original plus grand. Mieux vaut éliminer les données indésirables que d'essayer de produire des données qui ne sont pas là pour commencer.


@Marcb est en fait très juste. Toujours rétrécira que vous obtiendrez la meilleure qualité d'image, et la taille accrue doit être négligeable au mieux (compte tenu de ne pas vouloir faire sauter une image beaucoup plus petite, ce qui réduirait de manière significative la taille).


OK, peut-être que ... mais un exemple impraticable serait-il: Préféreriez-vous rétrécir une image 250x250 à 121x121 ou augmenter un 120x120 ... La qualité de l'image dans ce cas devrait être absolument négligeable, mais la charge du serveur serait être beaucoup plus bas ...


La charge du serveur pour déterminer que l'utilisation d'un algorithme serait très supérieure à la rétrécissement de la première place, à l'aide d'un algorithme comme vous avez décrit. De plus, vous cachez vos images rendues ( droite ?), Il ne devrait donc pas être une chose ponctuelle de toute façon.


Oui et oui, votre droite ... Cependant, faire le travail lourd sur le téléchargement de l'image et enregistrer mon "index pixelation" en tant que numéro statique ne causerait aucun travail supplémentaire lors des demandes d'image (juste des comparaisons int. ... De plus, même si les images sont mises en cache, je traite toujours des utilisateurs demandant des dimensions "impaires"


Pourquoi ne pas utiliser de script de vignettes dynamique qui servirait la taille exacte que vous souhaitez et le cache pour les demandes futures?


Cela pourrait mener à trop de charger dans mon scénario ... Néanmoins, merci pour la suggestion, mais je ne cherche pas de solutions à mon problème, mais plutôt une réponse à la question. Désolé pour la confusion, j'ai mis à jour mon poste pour accueillir.


Un tel "comment" pixelate "est un algorithme d'image soufflé" est une estimation de la perception visuelle et dépend des facteurs tels que la taille de pixels (/ densité). Il n'est pas nécessairement nécessaire de devoir être coûteux, s'il est acceptable pour qu'il soit parti de la marque parfois


4 Réponses :


0
votes

Cela ne fait pas exactement ce que vous avez demandé, mais je pense que cela atteint ce que vous voulez. Écrire un algorithme pour quantifier la manière dont une image est non triviale, elle serait définitivement spécifique au format image (par exemple, seulement strong> travail pour les images PNG), et je ne pense vraiment pas Il est nécessaire de réaliser ce que vous voulez.

Ainsi, pour des raisons de cet exemple, supposons que toutes vos images sont parfaitement carrées (la modification de celle-ci de prendre en compte les images non carrées sont assez triviales): P> Supposons que vous ayez une liste d'images source que vous pouvez redimensionner, ainsi qu'une "taille de résultat" - disons 500 pixels de 500 pixels. Vous pourriez faire quelque chose comme ceci: P>

$resultSize = 500;
$bestRatio = PHP_INT_MAX;
$bestURL = "";

foreach($sourceImageURLs as $url)
{
    $size = getimagesize($url);
    $size = $size[0];

    $ratio = min($resultSize, $size) / max($resultSize, $size);

    if($ratio < $bestRatio)
    {
        $bestRatio = $ratio;
        $bestURL = $url;
    }
}

/*
 * We've now found the image closest to our desired size. All we need
 * to do is resize the image at the URL in $bestURL to $resultSize, and
 * we're done.
 */


6 commentaires

Merci pour cela, bien que ce que cela accomplie, c'est juste trouver l'image la plus proche de la taille demandée ... La solution que je recherche des offres avec n'importe quel cas impraticable ... aussi, votre paragraphe inférieur je ne suis pas d'accord avec, ce n'est pas à peu près "Taille finale", c'est sur le serveur ayant à charger une image importante vs une petite image et quelle qualité sera perdue.


Ex) Dans votre exemple, je pourrais avoir une image 500x500 et une image 100x100. Si la taille demandée est 280x280, l'image "la plus proche" est la plus petite, mais cela deviendrait certainement de mauvaise qualité


Droit - votre question n'a pas vraiment de sens. Essayez-vous de minimiser la taille du fichier ou d'optimiser la clarté visuelle? Le premier n'a pas de sens à moins que vous soyez prêt à sacrifier beaucoup de qualité visuelle. Sinon, les économies sont très négligeables. Si vous voulez ce dernier, alors vous devriez faire ce que d'autres ont suggéré et juste TOUJOURS rétrécir .


Je cherche un algorithme qui pourrait déterminer la pixélie ... La taille du fichier n'aurait effectivement aucune pertinence pour l'algorithme, je n'apporte que cette partie dans la discussion comme un exemple pratique de la manière dont un tel algorithme serait utile


Alors pourquoi dire "et le problème que j'essaie de résoudre" ? Si c'est juste un exemple ésotérique, et l'algorithme sera vraiment utilisé pour autre chose, alors ma réponse serait totalement différente. Si tel est vraiment le problème, vous essayez de résoudre, alors je recommanderais une autre approche (à savoir, toujours en rétrécissement).


Y a-t-il un tel moyen de déterminer combien une image pourrait être agrandie jusqu'à ce qu'elle soit considérée comme «à l'écart»? c'est la question et je pense que c'est assez clair. L'exemple est un cas réel dans lequel l'algorithme serait utilisé.



1
votes

Vous pouvez faire un filtre de détection de bord de sobel à échelle de gris sur l'image et résumer les valeurs de pixels des bords; puis la moyenne de cette sommation contre le nombre de pixels (sompofedges / (largeur * hauteur)). Cela vous dirait la "edginess" de l'image. Cela ne peut être utilisé que pour comparer les images.

Ceci est mon noyau de filtre Sobel opencl xxx


3 commentaires

Merci, la détection des bords semble prometteuse, je vais créer des tests au cours des deux prochains jours pour voir si je peux obtenir un modèle de travail


@FEdust Nope ... réalisa que c'était simplement au-dessus de la puissance de traitement de mon cerveau (pour l'instant) ... Je sais qu'il y a des services qui font un traitement impressionnant similaire sur des images telles que instartlogic.com/technology/smartvision Malheureusement sa source non ouverte, mais la peine d'être vérifiée


@anson merci d'être revenu. Avez-vous déjà essayé l'identification de l'imagick ... Identifier -verbose FileName.jpg | qualité grep?




0
votes

La qualité de l'image est entièrement subjective et dépend en grande partie de la complexité de l'image d'origine. Si votre image était d'un chat blanc dans une tempête de neige (fondamentalement, blanche), la qualité subjective d'une image 500x500 sera déterminée si vous l'avez atteint en réduisant une image 1000x1000 ou en augmentant d'une image 100x100.

Mais toutes les choses étant égales, vous pouvez supposer que l'image de résolution supérieure réduira à une meilleure qualité que la résolution inférieure à l'agrandir.

Donc, éteint le dessus de ma tête, vous pouvez réduire l'image plus grande à la taille de la cible, puis utiliser cela comme une métrique (idéal) pour évaluer la qualité de la plus petite image agrandie (quelle est la différence pixel 7 sur la rangée 9 du même pixel dans l'image idéale, etc.). Cette comparaison pourrait être faite de tous les pixels ou de points d'échantillonnage dans les images. La "sortie" résultante pourrait ensuite être en moyenne et utilisée comme indication de la qualité de l'image agrandie.


0 commentaires