如何将位图转换为可以用C ++(ANN)处理的'矩阵'?

时间:2012-01-03 22:08:05

标签: c++ image-processing bitmap

我想将我提取的字符位图(.bmp文件)提供给某些矩阵,这些矩阵可以用C ++处理,然后输入人工神经网络,例如:网络将采用72个输入 - 每个输入作为尺寸为6 x 12的二值化图像的像素。

例如:我有一个大小的二进制位图,比方说40 x 80.我想用它制作一个尺寸为6 x 12的结构,它将由我的缩放位图组成。所以我需要一个位图库,它允许我缩放bmps然后将它们输入ANN。 (正如你们中的一些人已经说过的那样,它们将被存储为一个非常好的矩阵,因此不需要进行任何转换)

我可以在这里使用什么?

3 个答案:

答案 0 :(得分:2)

似乎任何图像处理库都可以满足您的需求。所以,我的建议是使用尽可能简单的库来集成到您的构建过程中。 在这种情况下,CImg库对我们来说非常容易,因为它由一个简单的.h文件组成。

关于您的需求,可能的实施方式是

#include "CImg.h"
using namespace cimg_library;

int main(int argc,char **argv) 
{
  CImg<unsigned char> image("img/logo.bmp");

  //Simple resize with nearest neighbour interpolation
  //image = image.resize(64, 64); 

  //If you want to specify the interpolation type
  image = image.resize(64, 64, -100, -100, 4);//The last param specifies the interpolation type 
  //\param interpolation_type Method of interpolation :
  //   -1 = no interpolation : raw memory resizing.
  //  - 0 = no interpolation : additional space is filled according to \p border_condition.
  //  - 1 = nearest-neighbor interpolation.
  //  - 2 = moving average interpolation.
  //  - 3 = linear interpolation.
  //  - 4 = grid interpolation.
  //  - 5 = bicubic interpolation.
  //  - 6 = lanczos interpolation.

  CImgDisplay main_disp(image,"Image resized");

  //This last part of code is not usfeul for you, it is only used to display the resized image
  while (!main_disp.is_closed() ) 
    main_disp.wait();
  return 0;
}

答案 1 :(得分:0)

位图文件格式(参见the specs)已经将位图存储为矩阵,或者更确切地说是像素阵列,可以按行(或列,但无关紧要)划分为2D阵列。

因此,您只需阅读标题并获取图像大小,然后读取打包struct数组中的数据(没有填充,如here所述)。

通过这种方式,您将得到矩阵,然后可以将其包装在类中以存储宽度和高度属性,甚至可以将数组赋予个人风格矩阵的构造函数。

答案 2 :(得分:0)

使用某种bmp lib来访问数据(取决于平台)。这通常会将bmp作为平面数组。获取该平面数组并将每个值插入矩阵结构中,或将其直接传递到NN代码中。没有更多信息,不能为您提供更多。