Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 照片拼接算法。如何在给定基本图像和瓷砖列表的情况下创建马赛克照片?_C++_Algorithm_Visual C++_Image Processing_Photo - Fatal编程技术网

C++ 照片拼接算法。如何在给定基本图像和瓷砖列表的情况下创建马赛克照片?

C++ 照片拼接算法。如何在给定基本图像和瓷砖列表的情况下创建马赛克照片?,c++,algorithm,visual-c++,image-processing,photo,C++,Algorithm,Visual C++,Image Processing,Photo,Hy.我要做的是创建一个程序(使用C或C++),该程序将24位/像素位图和图像集合作为输入,我必须使用给定的图像库创建一个类似于输入图像的马赛克图像(创建一个类似于输入的马赛克照片) 到目前为止,我可以访问输入的图像像素和颜色,但我有点卡住了。我的问题是我应该从哪里开始?我需要一个基本的算法,可以做这样的事情。我真的找不到(也许我看错了)。还有谁能告诉我一个随机下载的照片,这样我就可以下载项目的小图片了?有人能帮我吗?请告诉我从何处开始以及使用什么。我在Scala中完成了这项工作。这本书对我非常

Hy.我要做的是创建一个程序(使用C或C++),该程序将24位/像素位图和图像集合作为输入,我必须使用给定的图像库创建一个类似于输入图像的马赛克图像(创建一个类似于输入的马赛克照片)


到目前为止,我可以访问输入的图像像素和颜色,但我有点卡住了。我的问题是我应该从哪里开始?我需要一个基本的算法,可以做这样的事情。我真的找不到(也许我看错了)。还有谁能告诉我一个随机下载的照片,这样我就可以下载项目的小图片了?有人能帮我吗?请告诉我从何处开始以及使用什么。

我在Scala中完成了这项工作。这本书对我非常有用

示例图像:

以下是我的基本算法:

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
}
def createMosaic(targetImage:BuffereImage,
索引:PhotoIndexer.PhotoIndex,
不透明度:浮动,
targetWidth:Int,
目标灯:Int,
numRows:Int,
numColumns:Int,回调:PhotoMosaicCallback):ImageGrid={
var indexCopy=索引
//从缓冲图像映射到该图像的平均颜色
var colorMap:Map[缓冲区图像,颜色]=
index.values.map(data=>(data.缩略图,data.avgColor)).toMap
//我们观察目标图像的矩形区域,计算它们的平均值
//颜色,然后选择与这些颜色匹配的图像。
val sampleWidth=targetImage.getWidth/numColumns
val sampleHeight=targetImage.getHeight/numRows
//用于报告流程的进度
变量计数器=1
val numSubImages=numRows*numColumns
val imageGrid:imageGrid=Array.fill(numRows,numColumns)(Nil)
//对于图像中的每个面片

对于(row),假设您的基本图像是100x100像素,并且您有一堆10x10的瓷砖

您希望用400个小瓷砖拼接基本图像,因此每个瓷砖在基本图像中包含5x5像素

对于基本图像中的每个5x5部分,确定这些像素的平均RGB值

对于每个磁贴,确定平均RGB值

将每个5x5零件的平均RGB值与瓷砖中最接近的匹配匹配

然后创建您的马赛克。不过,您需要将瓷砖缩小到5x5,以保持图像大小不变

  • 降低输入图像的分辨率
  • 对于列表中的每个图像,计算每个通道的平均值(3个数字-RGB)
  • 对于输入图像中具有值
    (r、g、b)
    的每个像素,请执行以下操作: 从列表中随机抽取30张(只是一个有效的数字)图像。 对于样本中的每个这样的随机图像,计算rgb值之间的距离(*),并选择距离最小的图像
  • (*)例如,
    (r1、g1、b1)
    (r2、g2、b2)
    之间的距离可以是:
    (r1-r2)**2+(g1-g2)**2+(b1-b2)**2

    就这样,它工作得很好。 该算法有两个超参数

    • 输入图像的新分辨率
    • 我们为输入图像中的每个像素采样的图像数。 你可以和他们一起玩

    我确信它在专利中有详细描述:Hy,我已经完成了代码的执行,但是它的代码>远离你所做的(图片的)。我所做的是,获得OpenCV库并在C++上工作。我制作了一个包含图像(LITLE瓦片)和RGB平均值的数组,(每个香奈儿单独)。.我得到了一张图像,并从中得到了一个矩形区域的RGB通道的平均值,(sum=(avgR+avgG_avgB)/3),其中avgR=(ImgAvgR tileAvgR)等等,然后在向量中找到最小值,并用平铺替换选定的矩形…..
    t看起来像wright。你能帮我吗?你应该做的第一件事是确定平均颜色计算是否正确。要做到这一点,与其用最接近的颜色图像替换子图像,不如用t的实心样本替换它他使用相同的颜色。如果这样做有效,那么我们可以从那里开始。有没有办法让每张图片至少包含一次?例如,如果我收集了400张图片,每张图片将至少包含在马赛克中一次。你可以这样做。我可以想象几种方法。1)使用标准算法进行布局。最后,找到所有未使用的图像。对于这些图像中的每一个,在图像中找到它的最佳位置(覆盖其中的任何内容)。必须确保收敛以使用它们(如果num_rows x num_columns