C / C ++ LIBTIFF:需要从BW TIFF文件中读取白色和黑色像素的像素位置

时间:2012-07-10 08:04:15

标签: c++ image-processing pixel tiff

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

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

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

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

TIFF 4 x 2 BW图像示例:

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

在名为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.第231列像素从第2列的顶部开始计算。

我意识到数组[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;
        };
    }

1 个答案:

答案 0 :(得分:1)

在我阅读您的示例时,您需要为图像的每一列添加两个数组,一个包含该列中具有黑色像素的行数,另一个包含具有白色像素的行的索引。那么到目前为止?

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

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