Hy.Quelle que je dois faire est de créer un programme (en utilisant C ou C ++), qui prend en entrée un bitmap à 24 bits / pixels et un rassemblement d'images et je dois créer une image de mosaïque, semblable à l'image d'entrée. Utilisation de la bibliothèque d'images donnée (pour créer une photo de mosaïque similaire à l'entrée). p>
Jusqu'à présent, je peux accéder aux pixels d'image de l'entrée et les couleurs, mais je suis un peu coincé. Ma question est où devrais-je commencer? J'ai besoin d'un algorithme de base qui pourrait faire une telle chose. Et je ne peux pas vraiment trouver (peut-être que je regarde mal). Et quelqu'un peut-il me dire un téléchargeur de photos aléatoire afin que je puisse télécharger de petites images pour le projet? Est-ce que quelqu'un peut m'aider? S'il vous plaît, dites-moi où commencer et quoi utiliser. P>
3 Réponses :
Je l'ai fait à Scala. Le Article Dr Dobbs était extrêmement utile pour moi.
EXMISSION Image: P>
p>
Voici mon algorithme de base: p>
def createMosaic(targetImage:BufferedImage, index:PhotoIndexer.PhotoIndex, opacity:Float, targetWidth:Int, targetHeight:Int, numRows:Int, numColumns:Int, callback:PhotoMosaicCallback): ImageGrid = { var indexCopy = index // Map from the buffered image to that image's average color var colorMap:Map[BufferedImage,Color] = index.values.map(data => (data.thumbnail, data.avgColor)).toMap // We look at rectangular regions of the target image, calculate their average // colors, and then pick images that match those colors. val sampleWidth = targetImage.getWidth / numColumns val sampleHeight = targetImage.getHeight / numRows // Used to report the progress of the process var counter = 1 val numSubImages = numRows * numColumns val imageGrid:ImageGrid = Array.fill(numRows, numColumns)(Nil) // for each patch in the image for (row <- 0 until numRows) { for (column <- 0 until numColumns) { val x = column * sampleWidth val y = row * sampleHeight // This is the small rectangular region of the target image that we're // currently considering val subImage = targetImage.getData(new Rectangle(x,y,sampleWidth,sampleHeight)) val avgImageColor = calculateColorFromRaster(subImage) val nearest:Seq[BufferedImage] = getNearestColorImages(avgImageColor, colorMap) // nearest is in sorted order; pick one of them and draw it to correct place in // image imageGrid(row)(column) = nearest callback.photosCalculated(row, column, nearest) val percent = 100.0 * counter / numSubImages // TODO: for GUI version, use a display bar if (counter % 100 == 0) { println(percent + " completed (" + counter + " of" + numSubImages + ")") } counter+=1 } } imageGrid }
HY, j'ai fait ma mise en œuvre du code, il fait quelque chose, mais il est loin de ce que vous avez fait (image sage) .Qu'est-ce que j'ai fait, obtenez la bibliothèque OpenCV et a travaillé sur C ++. J'ai fait un tableau contenant un tableau Image (citiles limitées) et les valeurs moyennes pour RVB (chaque chanel) .J'ai une image et une zone rectangle à partir de celle-ci, j'ai fabriqué les valeurs moyennes pour les canaux RVB (somme = (avggr + avgg_avgb) / 3) où avgr = (imgavgr-tileavgr) etc. et a trouvé le minimum dans le vecteur et remplacez le rectangle sélectionné avec la tuile ..... mais ne code> t look wright.can vous aidez-moi?
La première chose à faire est de déterminer si votre calcul de couleur moyen est correct. Pour ce faire, au lieu de remplacer le sous-champ avec l'image de couleur la plus proche, remplacez-la simplement par un échantillon solide de la même couleur. Si cela fonctionne, alors nous pouvons aller de là.
Y a-t-il un moyen d'inclure chaque image au moins une fois? Par exemple, si j'ai une collection de 400 images, chacune d'entre elles sera incluse dans la mosaïque au moins une fois.
Vous pourriez faire ça. Je pouvais imaginer quelques approches. 1) Disposez à l'aide d'un algorithme standard. À la fin, trouvez toutes les images inutilisées. Pour chacune de ces images, trouvez le meilleur endroit de l'image pour celui-ci (écraser tout ce qui existe). Devrait s'assurer que vous convergeriez-les tous (évidemment pas possible si NUM_ROWS X NUM_COLAUMNS
Disons que votre image de base est de 100x100 pixels et vous avez un tas de tuiles 10x10. P>
Vous voulez mosaïque l'image de base avec 400 des petits tuiles, chaque tuile comprend 5x5 pixels dans l'image de base. P>
Pour chaque pièce 5x5 dans l'image de base, déterminez les valeurs RVB moyennes pour ces pixels. P>
Pour chaque tuile, déterminez les valeurs RVB moyennes. P>
Faites correspondre les valeurs RVB moyennes de chaque pièce 5x5 à la correspondance la plus proche des tuiles. P>
Créez ensuite votre mosaïque. Vous aurez besoin d'inclure les carreaux jusqu'à 5x5 pour garder la taille de l'image identique, cependant. P>
Hy, j'ai fait ma mise en œuvre du code que cela fait quelque chose, mais c'est loin de ce que vous avez fait (photo sage) .Qu'est-ce que j'ai fait est, obtenez la bibliothèque OpenCV et travaillé sur C ++. J'ai fait un tableau contenant une image ( Les tuiles limitées) et les valeurs moyennes pour RVB (chacune séparément) .J'ai une image et pour une zone rectangle à partir de celle-ci, j'ai fabriqué les valeurs moyennes pour les canaux RVB (somme = (avgr + avgg_avgb) / 3) où avgr = (Imgavgr-tileavgr) etc. et trouvé le minimum dans le vecteur et remplacez le rectangle sélectionné avec la tuile .....
J'ai entendu dire qu'il est préférable d'utiliser Hue plutôt que de RVB, quelle est votre opinion?
(r, g, b) code> procédez comme suit:
Échantillon de manière aléatoire 30 (juste un nombre qui fonctionne bien) images de la liste.
Pour toutes ces images aléatoires dans l'échantillon, calculez la distance (*) entre les valeurs RVB et choisissez l'image avec la plus petite distance. LI>
ol>
(*) La distance entre (r1, g1, b1) code> et (r2, g2, b2) code> peut être par exemple:
(R1-R2) ** 2+ (G1-G2) ** 2+ (B1-B2) ** 2 Code>. P>
C'est ça. Ça marche assez bien.
Il y a deux hyperparamètres pour l'algorithme. P>
- la nouvelle résolution de l'image d'entrée li>
- Le nombre d'images que nous échantillons pour chaque pixel dans l'image d'entrée.
Vous pouvez jouer avec les deux. LI>
ul>
Je suis sûr que c'est décrit en détail dans le brevet: V3 .pacenet.com / PublicationDétails / ...