首页 文章

测试TIFF数据会产生冲突吗? MATLAB中的位深度

提问于
浏览
0

我正在尝试在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 回答

  • 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 . 不知道为什么会发生这种情况,但要掩盖它是相当简单的 .

相关问题