我正在尝试在Matlab中编写一个函数,该函数从各种摄像头读取TIFF图像并将其恢复为正确的数据值以进行分析 . 这些相机来自各种品牌,到目前为止,它们将12位或14位数据存储到16位输出中 . 我一直在使用imread读它们,我被告知除以16或4会将数据转换回它的原始形式 . 不幸的是,那个功能只是专门用于一个品牌的相机,它在捕获时很好地将数据扩展到16位,这样这种转换就可以了 .
由于我想尽可能保持整个图像属性检测的自动化,我已经完成了对几个不同相机的数据挖掘,我遇到了一个我必须完全无能为力的问题 . 我已经确定(到目前为止)图片将始终以两种方式之一存储:这样前一种方法可以工作(它们将原始数据相乘以填充16位),或者它们只是直接填充数据并在前面或后面添加零以获得任何空位 . 我决定看看我是否可以检测出哪个和哪个使用以下两种方法 . 我测试的图像应该很容易具有填充从零到饱和的整个范围的值(尽管有时不完全),并且分辨率相当大,所以理论上这些方法应该有效:
我首先阅读图像数据:
Mframe = imread('signal.tif');
此方法尝试检测使用过的位数:
bits = 0;
for i = 1:16
Bframe = bitget(Mframe,i);
bits = bits + max(max(Bframe));
end
此方法尝试查找是否已完成扩展操作:
Mframe = imread('signal.tif');
Dframe = diff(Mframe);
mindiff = min(min(nonzeros(Dframe)));
作为第三次检查,我总是查看输入图像的最大值:
maxval = max(max(Mframe));
请在这里查看我的理解:
-
对于包含任何饱和度的16位图像,maxval的值应为65532 .
-
如果12位或14位数据已缩放为16位,则应返回最大值65532,精度为16或4,位为16 .
-
如果12或14位数据直接存储前导/尾随零,则不能返回最大值65532,Mindiff不应返回16或4(尽管可以远程执行),并且位应显示为12或14分别 .
-
如果图像实际上没有达到饱和,它不能返回65532的最大值,Mindiff应该仍然按照上述两种情况的描述行事,并且比特可能会返回比其他情况更低的值 .
我在上面是否正确?如果不是,请告诉我我不理解的东西(我绝对不是计算机科学家),因为我似乎得到的数据与此相冲突 .
只有一个案例似乎像我期望的那样工作 . 我知道数据是12位,我的测试显示maxval接近65532,mindiff为16,位为15.我可以得出结论,这个图像没有饱和,是12位缩放到16位 .
另一个我知道有12位输出的品牌,测试一个我知道的图像并不完全饱和的情况给我maxlade为61056,mindiff为16,bit为12 .
另一个案例,又一个品牌,已知有14位输出,当我测试一个我知道饱和的图像时,它给我maxval为65532,mindiff为4,bit为15 .
非常困惑 .
1 回答
好吧,经过大量的挖掘后,我终于想通了 . 我写了一些代码来帮助我理解不同文件之间的差异,并发现有几个摄像头在其中有各种“签名” . 我正在联系制造商以获取更多信息,但特别是一个时间戳似乎始终出现在前2个像素中 .
无论如何,我写了下面的代码来解决我发现的两个问题,现在一切都在工作:
至于品牌A问题,该相机似乎在每帧的几个像素中都有坏数据(每次都不一样),其中一个值出现在像素中,该像素的差异比像素可能的差一位在它下面 . 例如,在12位图像中,最小差异应为16,而14位图像应具有最小差值4,但它们的值比它们下面的像素低8和2 . 不知道为什么会发生这种情况,但要掩盖它是相当简单的 .