0

我对使用 Visual C++ 进行图像处理相当陌生,我正在寻找一种读取黑白 TIFF 文件并将图像写入表示 0 或 1 的数组十六进制值的方法,然后获取 0(黑色)的位置信息或 1(白色)。

经过对谷歌的一些研究和这里的一篇文章https://www.ibm.com/developerworks/linux/library/l-libtiff/#resources我有以下琐碎的问题,请给我指点相关文章,有太多了,我无法围绕它们进行思考,同时我将继续搜索和阅读。

是否可以使用 LIBTIFF 从 TIFF 中提取像素位置信息?

再次成为所有图像格式的新手,我不禁想到图像是由十六进制值的二维数组组成的,位图格式是否更合适?以这种方式思考让我想知道我是否可以将“白色”或“黑色”的位置从其高度映射到二维数组上。我想要“黑色”或“白色”的位置,可以吗?我真的不想要代表图像的 0 和 1 数组,不确定我是否需要它们。

4 x 2 BW 图像的 TIFF 示例:

  • 黑,白
  • 白色 黑色
  • 黑色 黑色
  • 白色 白色

在名为 mappingNonPrint() 的函数下输出到类似 ptLocArray[imageHeight][imageWidth] 的内容

  • 2 1
  • 4 4

或在名为 mappingPrint() 的函数下

  • 1 2
  • 3 3

使用 LIBTIFF,它以什么方向/方式读取 TIFF 文件?

理想情况下,我希望从上到下垂直读取 TIFF 文件,然后转到下一列,然后从上到下重新开始。但是我的直觉告诉我这是一个童话故事,对图像处理来说非常新,我想知道如何读取 TIFF,例如单条带。

附加信息

我想我应该添加为什么我想要像素位置。我正在尝试制作圆柱形卷筒打印机,使用提供位置反馈的光学旋转编码器。文件的高度代表卷筒表面的周长,文件的宽度代表转数。

以下是我的 ENC_reg() 的未经测试的逻辑,与图像处理部分几乎无关,但这可能有助于读者了解我正在尝试对已处理的 tiff 图像数组做什么。i 的索引从 0 到 imageHeight,但是,每个元素可以是从 0 到 imageHeight 的任意数字,可以是 112、354 等,对应于 tiff 图像中包含黑色的任何位置。j 的索引从 0 到 imageWidth,并且那里的每个元素也从 0 开始到 imageWidth。例如,ptLocArray[1][2] 表示第 2 列中第一个具有黑色像素的位置,存储在那里的值可能是 231。从第 2 列顶部算起的第 231 个像素。

我意识到数组 [imageHeight] [] 应该改为数组 [maxnum_blackPixelPerColumn],但我不知道如何计算每列 1 或 0 的数量....因为我不知道如何转换正如我之前提到的,1 和 0 的顺序正确。

void ENC_reg()

{

if(inputPort_ENC_reg == true) // true if received an encoder signal

{ 

            ENC_regTemp ++; // increment ENC register temp value by one each time the port registers a signal

                if(ENC_regTemp == ptLocArray[i][j])
                {
                    Rollprint(); // print it
                    i++; // increment by one to the next height location that indicates a "black", meaning print

                    if (ENC_regTemp == imageHeight)
                    {
                    // Check if end of column reached, end of a revolution
                    j++; // jump to next column of the image (starting next revolution)
                    i = 0; // reset i index to 0, to the top of the next column
                    ENC_regTemp = 0; // reset encoder register temp to 0 for the new revolution
                    };
                };



            ENC_reg(); // recall itself;
        };
    }
4

1 回答 1

1

当我阅读您的示例时,您希望图像的每一列都有两个数组,一个包含该列中具有黑色像素的行数,另一个包含具有白色像素的行的索引。到此为止吧?

这当然是可能的,但需要大量内存。即使未压缩,灰度图像的单个像素也会占用一个字节的内存。您甚至可以使用位打包并将 8 个像素填充到一个字节中。另一方面,除非您将自己限制为不超过 255 行的图像,否则您将有多个字节来表示每个列索引。而且您需要额外的逻辑来标记列的结尾。

我的观点是:尝试使用“0 和 1 的数组”,因为这应该更容易完成,对内存的要求更低,运行效率更高。

于 2012-07-10T10:10:55.340 回答