【问题标题】:C++ pixel-by-pixel image thumbnailingC++ 逐像素图像缩略图
【发布时间】:2014-11-08 19:28:26
【问题描述】:

我的计算机科学课有一个特殊的任务,我们必须通过执行以下操作来减小图像的大小:

  1. 求 n × n 像素块的平均颜色(n 由下式给出 用户)通过平均每个块的 R、G 和 B 值。
  2. 将该颜色封装到一个像素中(只是一个普通的旧数据类)。
  3. 根据现有像素创建新图像。

当我说找到平均值时,我的意思是每个块的平均颜色(如下所示,只是更小):

上面的图片会生成一个 4px * 3px 的图片缩略图。实际上,我们会将这些块制作成大约 10 像素左右的正方形。如果图像不能完全被块大小整除,我们应该忽略多余的像素。

可以直接访问图像的像素:

pixels[x][y].red = 130; 
pixels[x][y].blue = 200; // etc

并且可以通过以下方式创建图像:

image x;
x.createNewImage(xSize, ySize);
pixel** xPixels = x.getPixels();
//then you can assign as above.

在尝试了很多不同的事情之后,我仍然不清楚如何解决这个问题。

【问题讨论】:

  • 从创建一个函数开始,它找到一个 n × n 像素块的平均颜色,从 n=1 开始
  • 我想你有办法加载图片。怎么得到图片的大小?
  • @Christophe 可以通过在图像对象上调用 getWidth() 和 getHeight() 来做到这一点。即img.getWidth()img.getHeight()
  • @Wimmel 这与我一直在尝试的类似。 “从 n=1 开始”是什么意思?
  • 我的意思是从一个计算 1px * 1px 块的平均值的函数开始。这应该不会太难......

标签: c++ image-processing


【解决方案1】:

首先假设您的img 的大小是n 的倍数,以简化。您可以通过这种方式创建缩略图 t(注意:我没有尝试编译,所以可能会留下一些拼写错误):

int txSize=img.getWidth()/n, tySize=img.getHeight()/n; 
pixel **pi=img.getPixels(); 
image t; 
t.createNewImage(txSize, tySize); 
pixel** pt=t.getPixels();  
for (int i=0; i<txSize; i++) 
   for (int j=0; j<tySize; j++) 
      pt[i][j] = pixel_average(pi, i*n,j*n, n);  // Part 2 of the question

当然你需要 Wimmel 建议的平均函数:

pixel pixel_average(pixel**p, int x, int y, int n)  // Part 1. of your question
{
pixel avg; 
avg.red = 0; avg.blue=0; // etc...
for (int dx=0; dx <n; dx++) 
   for (int dy=0; dy<n; dy++) {
      avg.red += p[x+dx][y+dy].red;
      avg.blue += // etc... 
   }
avg.red = avg.red / n / n;  // assuming that your colors are small enough, not to overflow. 
// etc...
}

现在还有一些工作要做:

  • 如果原始大小不是 n 的倍数,则必须更改代码以向上取整缩略图的大小。
  • 当您在 x 或 y 中达到最大尺寸时,您必须更改平均,以便能够处理部分正方形。
  • 你当然必须改变平均计算,因为在现实世界中,你的颜色会使用int的全部范围,所以你必须找到不溢出的最佳平均方法(例如:使用临时long,在您考虑的每个新像素处逐步构建加权平均值等...)

【讨论】:

  • 如果原始大小不是 n 的倍数,我将忽略任何额外的像素。这段代码在这种情况下表现如何?
  • 同理:txSizeint,所以img.getWidth()/n 是整数部分,上面的代码只上升到txSize*n 像素。
猜你喜欢
  • 1970-01-01
  • 2010-11-13
  • 2020-07-26
  • 2012-01-27
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 2010-10-03
相关资源
最近更新 更多