繁体   English   中英

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

[英]C/C++ LIBTIFF: Need to read pixel location of white and black pixels from BW TIFF files

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

在对Google进行了一些研究之后,在这里找到了一篇文章https://www.ibm.com/developerworks/linux/library/l-libtiff/#resources我有以下琐碎的问题,请务必指出相关文章,如此之多,以至于我无法缠住他们,而我将继续搜索和阅读。

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

再次成为所有图像格式的新手,我不禁想到图像由十六进制值的2D数组组成,位图格式更合适吗? 以这种方式思考使我想知道是否可以将从其高度映射的“白色”或“黑色”的位置写到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。从第2列顶部开始计数的第231st像素。

我意识到array [imageHeight] []应该改为array [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;
        };
    }

在阅读您的示例时,您希望图像的每一列都有两个数组,一个数组包含该列中黑色像素的行数,另一个数组包含白色像素的行的索引。 到目前为止正确吗?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM