2011-03-29 9 views
8

हाय। मुझे एक प्रोग्राम (सी या सी ++ का उपयोग करके) बनाने के लिए क्या करना है, जो 24 बिट/पिक्सेल बिटमैप इनपुट और छवियों को इकट्ठा करने के रूप में लेता है और मुझे इनपुट छवि के समान एक मोज़ेक छवि बनाना है दी गई छवियों की पुस्तकालय (इनपुट के समान मोज़ेक फोटो बनाने के लिए)।फोटो मोज़ेक एल्गोरिदम। बुनियादी छवि और टाइल्स की एक सूची दी गई मोज़ेक तस्वीर कैसे बनाएं?

अब तक मैं इनपुट की छवि पिक्सेल और इसके रंगों तक पहुंच सकता हूं लेकिन मैं फंस गया हूं। मेरा सवाल है कि मुझे कहां से शुरू करना चाहिए? मुझे एक बुनियादी एल्गोरिदम चाहिए जो ऐसी चीज कर सकता है। और मैं वास्तव में कोई नहीं ढूंढ सकता (शायद मैं गलत देख रहा हूं)। और क्या कोई मुझे एक यादृच्छिक फोटो डाउनलोडर बता सकता है, ताकि मैं परियोजना के लिए छोटी छवियां डाउनलोड कर सकूं? क्या कोई मेरी मदत कर सकता है? कृपया, मुझे बताएं कि कहां से शुरू करना है और क्या उपयोग करना है।

+1

मुझे यकीन है कि पेटेंट में यह बहुत विस्तार से वर्णित है: http://v3.espacenet.com/publicationDetails/biblio?CC=US&NR=6137498&KC=&FT=E –

उत्तर

16

मैंने इसे स्कैला में किया है। Dr Dobbs article मेरे लिए बेहद उपयोगी था।

नमूना छवि:

Sample photomosaic

यहाँ मेरी बुनियादी एल्गोरिथ्म है:

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 
} 

GitHub पर My full sourcecode is available

+0

हाय, मैंने कोड का अपना कार्यान्वयन किया है यह कुछ करता है, लेकिन यह आपके द्वारा किए गए कार्यों से बहुत दूर है (चित्रानुसार)। मैंने जो किया है, ओपनसीवी लाइब्रेरी मिली है और सी ++ पर काम किया है। मैंने एक सरणी बनाई जिसमें एक छवि (लिटल टाइल्स) और आरजीबी के औसत मूल्य हैं, (प्रत्येक चैनल अलग से)। मुझे एक छवि मिली और इसके आयताकार क्षेत्र के लिए मैंने आरजीबी चैनलों के लिए औसत मूल्य बनाए, (sum = (avgR + avgG_avgB)/3) जहां avgR = (ImgAvgR-tileAvgR) आदि। और वेक्टर में न्यूनतम पाया, और टाइल के साथ चयनित आयत को प्रतिस्थापित किया ..... लेकिन wright.cn देखो नहीं। क्या आप मेरी मदद करते हैं? – Alexx

+1

सबसे पहले आपको यह करना चाहिए कि आपका औसत रंग गणना सही है या नहीं। ऐसा करने के लिए, निकटतम रंग छवि के साथ उपनिवेश को बदलने के बजाय, इसे उसी रंग के ठोस स्वैच के साथ प्रतिस्थापित करें। अगर यह काम करता है, तो हम वहां से जा सकते हैं। – I82Much

+0

कम से कम एक बार प्रत्येक तस्वीर को शामिल करने का कोई तरीका है? उदाहरण के लिए यदि मेरे पास 400 चित्रों का संग्रह है, तो उनमें से प्रत्येक को मोज़ेक में कम से कम एक बार शामिल किया जाएगा। – Jaka

3

मान लें कि आपका बुनियादी छवि 100x100 पिक्सल है, और आप का एक समूह है 10x10 टाइल्स।

आप 400 छोटी छोटी टाईल्स के साथ मूल छवि मोज़ेक करना चाहते हैं, इसलिए प्रत्येक टाइल में मूल छवि में 5x5 पिक्सेल शामिल हैं।

मूल छवि में प्रत्येक 5x5 भाग के लिए, उन पिक्सेल के लिए औसत आरजीबी मान निर्धारित करें।

प्रत्येक टाइल के लिए, औसत आरजीबी मान निर्धारित करें।

प्रत्येक 5x5 भाग के औसत आरजीबी मूल्यों को टाइल से निकटतम मैच में मिलान करें।

फिर अपना मोज़ेक बनाएं। छवि आकार को समान रखने के लिए आपको टाइल्स को 5x5 तक स्केल करने की आवश्यकता होगी।

+0

है, मैंने कोड के कार्यान्वयन को कुछ किया है, लेकिन यह आपके द्वारा किए गए (चित्रानुसार) से बहुत दूर है। मैंने जो किया है, ओपनसीवी लाइब्रेरी मिली है और काम किया है सी ++। मैंने एक सरणी (लीटल टाइल्स) और आरजीबी के लिए औसत मान, (प्रत्येक चैनल अलग से) के साथ एक सरणी बनाई है। मुझे एक छवि मिली है और इसके आयताकार क्षेत्र के लिए मैंने आरजीबी चैनलों के लिए औसत मूल्य बनाए हैं, (sum = (avgR + avgG_avgB)/3) जहां avgR = (ImgAvgR-tileAvgR) आदि। और वेक्टर में न्यूनतम पाया, और टाइल के साथ चयनित आयत को प्रतिस्थापित करें ..... – Alexx

+0

मैंने सुना है कि आरजीबी की बजाय रंग का उपयोग करना बेहतर है, आपकी राय क्या है? – Sycren

संबंधित मुद्दे