C ++逐像素图像缩略图

时间:2014-11-08 19:28:27

标签: c++ image-processing

我的计算机科学课有一项特殊的任务,我们必须通过以下方式减少图像的大小:

  1. 求n个像素块的平均颜色(n由下式给出) user)通过平均每个块的R,G和B值。
  2. 将该颜色封装到一个像素中(只是一个普通的数据类)。
  3. 根据您拥有的像素创建新图像。
  4. 当我说找到平均值时,我的意思是每个块的平均颜色(如下所示,只有更小):

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

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

    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.
    

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

1 个答案:

答案 0 :(得分:0)

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

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的全范围,所以你必须找到平均而不溢出的最佳方法(例如:use temporary {{ 1}},在你考虑的每个新像素上逐步建立加权平均值,等等......)