我试图在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)));
作为第3次检查,我总是查看输入图像的最大值:
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位输出的品牌,测试一张我知道的图像并不饱和的情况给我的最大值为61056,思维为16,位为12。 / p> 另一种情况,又一个品牌,已知有14位输出,当我测试一个我知道饱和的图像时,它给我maxval为65532,mindiff为4,位为15。 ?
非常困惑。
答案 0 :(得分:0)
好吧,经过大量的挖掘后,我终于想通了。我写了一些代码来帮助我理解不同文件之间的差异,并发现有几个摄像头在其中有各种“签名”。我正在联系制造商以获取更多信息,但特别是一个时间戳似乎始终出现在前2个像素中。
无论如何,我编写了以下代码来修复我发现的两个问题,现在一切都在工作:
Mframe = imread('signal.tiff');
minval = min(min(Mframe));
mindiff = min(min(nonzeros(diff(Mframe))));
fixbit = log2(double(mindiff));
if rem(fixbit,2) % Correct Brand A Issues
fixbit = fixbit + 1;
Bframe = bitget(Mframe,fixbit);
[x,y] = find(Bframe==1);
for i=1:length(x)
Mframe(x(i),y(i)) = Mframe(x(i),y(i)) + mindiff;
end
end
for i=1:4 % Correct Brand B Timestamp
Bframe = bitget(Mframe,i);
if any(any(Bframe))
Mframe(1,1) = minval; Mframe(1,2) = minval;
end
end
for i = 1:16 % Get actual bit depth
Bframe = bitget(Mframe,i);
bits = bits + max(max(Bframe));
end
对于品牌A问题,该相机似乎在每帧的几个像素(每次都不相同)中都有坏数据,其中一个值出现在一个比可能的低一位差的像素中从它下面的像素。例如,在12位图像中,最小差异应为16,而14位图像应具有最小差值4,但它们的值比它们下面的像素低8和2。不知道为什么会发生这种情况,但是很容易掩盖它。