Algorytm Mozaiki Fotograficznej. Jak stworzyć zdjęcie mozaiki biorąc pod uwagę podstawowy obraz i listę płytek?
Hy.Co muszę zrobić, to stworzyć program (za pomocą C lub C++), który pobiera jako wejście bitmapę 24bits / piksel i gromadzenie obrazów i muszę utworzyć obraz mozaiki, podobny do obrazu wejściowego za pomocą biblioteki obrazów podanych (aby utworzyć zdjęcie mozaiki podobne do wejścia).
Na razie mam dostęp do pikseli obrazu i kolorów z niego, ale utknąłem. Moje pytanie brzmi: Od czego zacząć? Potrzebuję algorytmu, który mógłby coś takiego zrobić. I nie mogę naprawdę znaleźć (może źle wyglądam). A także czy ktoś może mi powiedzieć losowy program do pobierania zdjęć, abym mógł pobierać małe obrazy do projektu? Czy ktoś może mi pomóc? Proszę, powiedz mi, od czego zacząć i czego użyć.
2 answers
Robiłam to w Scali. Artykuł Dr Dobbs był dla mnie niezwykle przydatny.
Przykładowy obraz:
Oto mój podstawowy algorytm: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
}
Mój pełny kod źródłowy jest dostępny na GitHubie
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-15 19:30:51
Załóżmy, że podstawowy obraz to 100x100 pikseli, a masz kilka płytek 10x10.
Chcesz mozaikę podstawowego obrazu z 400 małych płytek, więc każda płytka zawiera 5x5 pikseli w podstawowym obrazie.
Dla każdej części 5x5 w obrazie podstawowym określ średnie wartości RGB dla tych pikseli.
Dla każdego kafelka określ średnie wartości RGB.
Dopasuj średnie wartości RGB każdej części 5x5 do najbliższego dopasowania z płytek.
Then Stwórz swoją mozaikę. Musisz jednak przeskalować płytki do 5x5, aby zachować ten sam rozmiar obrazu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-29 20:34:58