Bobholamovic/ChangeDetectionToolbox

一点点matlab语法的问题

CanoeByGuitar opened this issue · 3 comments

你好,因为本人几乎不用matlab,这里调用你的程序试验一下CVA算法的结果的,但是出了以下问题

>> [CM, DI] = detectChange('CVA', {}, 'KMeans', {}, '2015img_gray.tif', '2018img_gray.tif')
警告: The rank of the input image is detected to be lower than 2. 
> In detectChange>cd4Pair_ (line 116)
  In detectChange (line 54) 
元胞内容引用自非元胞数组对象。

出错 ThreAlgs.KMeans/segment (line 19)
            CM = uint8(reshape(kmeans(cdMapReshaped, 2, obj.params{:}), rows, cols));

出错 detectChange>cd4Pair_ (line 120)
CM = alg_thre.segment(DI);

出错 detectChange (line 54)
    [varargout{:}] = cd4Pair_(algCD, algThre, varargin{:}, '', {}, {});

应该是matlab数据结构上的问题吧,我不太清楚怎么解决。
另外,这个程序是不是只能用来对单通道的灰度图处理,因为我放进三通道的图片一直报矩阵维数错误

您好,关于这两个问题我做了一些测试,回复如下:

  1. 针对元胞内容引用自非元胞数组对象的问题,考虑到您的调用语法完全符合要求,我怀疑可能是一个版本兼容性问题。为此,请确认您的MATLAB版本在R2017b以上。
  2. 针对输入图像维度的问题,实际上这个程序被设计为可以处理任意通道的图像。如果您所说的“维数错误”指的是运行输出第一行的警告: The rank of the input image is detected to be lower than 2. ,这其实是一个新添加的功能,这一检测表明您的输入数据的三个通道数据很可能完全相同(即只是将单通道灰度图通过复制拓展到了三个通道)。在这种情况下,如果使用基于主成分分析的算法,很可能得到一个错误,这也是添加这一预检测的初衷。为此,请检查您的数据是否符合这一描述。

如果确认是程序bug,请及时汇报给我,谢谢!

非常感谢你的回复,第二个问题我已解决,第一个问题可能确实是我matlab版本引起的。
最后想请教一下,你demo里的图prettified results,实现的方法是什么,写在哪个路径哪个文件里,谢谢!

function im_clr = pretty(cd_map, seg_map, ref_map, palette)

是在这个地方实现的。实现的具体方法是:给定一张变化图seg_map,一张差值图cd_map,一张标签图ref_map,以及一个(可选的)调色板参数。将归一化后的cd_map作为背景,对于多波段的情形先取各波段逐像素均值。根据seg_mapref_map,可以得到TP(正确分出的变化区域)、FP(误检区域)、TN(正确分出的未变化区域)、FN(漏检区域)对应的像素点,然后使用调色板中指定的参数分别对这些像素点用不同的颜色进行填充,得到prettified image。

实际上,这里的ref_map支持三种格式。README.md中展示的情况包含采样区域,即只在采样区域上计算混淆矩阵,最终着色也只会影响这部分区域,未采样区域则用背景图填充。为了实现这个功能,一种方式是将ref_map中您不希望着色的区域用数字2填充,变化区域用1填充,不变区域用0填充。您可能需要手动实现这一功能。另外一种情况是:预先采样好的真值标签可能被存储在分隔的文件里,如ref_change.png以binary mask的形式存储了变化的标签,用True表示变化像素点;而ref_nochange.png同样以binary mask的形式存储了不变的标签,用True表示不变像素点。显然,ref_change.pngref_nochange.png中的所有True值可能不涵盖图像中所有的像素点,那么剩下未被标记的部分就是未采样的部分。作为处理这种情况的手段,工具箱中提供了

function [ref_cmb, mask] = combineRefs(ref)

静态方法,将ref_change.pngref_nochange.png拼接为两波段影像,作为ref_map参数输入到pretty函数中,也能实现一样的效果。