2012-07-10 91 views
0

*编辑,哈哈,拿到了图书馆的名字写错了,改的libtiff:C/C++的libtiff:需要从BW TIFF文件中读取的白色和黑色像素的像素位置

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

经过对谷歌的一些研究和这里的一篇文章https://www.ibm.com/developerworks/linux/library/l-libtiff/#resources我有以下琐碎的问题,请指点我相关的文章,有很多,我不能包裹我的头在他们周围,同时我会保持在搜索和阅读....

*是否有可能使用LIBTIFF从TIFF提取像素位置信息? *

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

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

输出到像ptLocArray [imageHeight:

4乘2 BW图像的TIFF实施例] [imageWidth]在名为mappingNonPrint的函数下()

或()

利用libtiff名为mappingPrint的函数,在在什么方向/方式读取TIFF文件?

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

谢谢你。任何帮助表示赞赏

附加信息

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

以下是我的ENC_reg()的一个严格未经测试的逻辑,与图像处理部分几乎无关,但这可以帮助兄弟姐妹看到我正在尝试处理的tiff图像数组。我从0到imageHeight的索引,但是,每个元素可能是从0到imageHeight的任意数字,可能是112,354等等,对应于tiff图像中包含黑色的任何位置。 j的索引从0到imageWidth,每个元素也从0开始到imageWidth。例如,ptLocArray [1] [2]表示第2列中有一个黑色像素的第一个位置,此处存储的值可能为231.从第2列顶部开始计数的第231个像素。

我意识到array [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

当我看了你的例子,你希望两个阵列的图像的每一列,一个包含行的数量与黑色像素在列,其他具有白色像素的行的索引。到目前为止?

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

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

+0

谢谢你的回复,其实我只是想要一个2d数组格式化来存储像素位置数据:array [imageHeight] [imageWidth] – 2012-07-10 12:37:05

+0

每个列或单个2D数组的一个数组几乎没有概念上的区别,它?或者我在这里错过了一个观点? – MvG 2012-07-10 12:41:30

+0

是的,每列确实是一个数组。我试图完成的是获得BW tiff图像的“白色”或“黑色”的像素位置,而不是两者。我的应用程序的目的不是重构图像或图像操作,由0和1组成的数组似乎是多余的(顶部的其他信息可能有所帮助)。谢谢你,对不起如果我看起来固执。 – 2012-07-10 13:17:50