我有成千上万的jpeg格式的网络摄像头图像,我想分析一下云端封面。没有云的图像将是一座山并且将相对较暗,而如果存在云,则直方图将倾斜至明亮的水平。目的是将图像分类为云或无云,然后按时间,季节等分析云的频率。
首先使用raster
导入jpegs。我打算将图像编译成RasterStack,并在每个图像中指定一个窗口进行分析,例如。
rasterlist <- list.files('test', full.names=TRUE) # list of files to make rasterstack
test_stack <- stack(rasterlist) # stack raster layers
#define the crop extent
cropbox <-c(200,1280,500,900) # (`xmin`, `xmax`, `ymin` , `ymax`)
test_cr <- crop(test, cropbox) #crop the raster
我正在寻找一种强大的相异度测量,以使用直方图将堆栈中的所有图像与参考图像进行比较。我读的线程越多,我提到的指标越多,建议越多! This SO thread提供了一个很好的起点。
未绑定时,jpeg像素具有256个值。我的理解是Kolmogorov-Smirnov距离在这种情况下是一个合适的度量,如果数据被分箱(或者可能是提高计算速度所必需的),则为卡方距离。
关于这个主题的几个讨论推荐Wasserstein或地球移动距离(EMD)但是当我尝试在一对测试图像(每个1080x250像素)上使用它(包transport)时,我得到一个错误消息(显然我的16GB的RAM还不够!):
# first need to convert raster to a matrix then to object type pgrid
testmat <- as.matrix(test_cr2)
testmat2 <- as.matrix(test_cr3)
p1 <- pgrid(testmat)
p2 <- pgrid(testmat2)
wasserstein(p1,p2,p=1) # calculate EMD
Error: cannot allocate vector of size 271.6 Gb
我在HistogramTools包中使用HistogramDistance取得了更多成功,例如
# HistogramDistance requires 2 histogram objects with same bucket boundaries
h1 <- hist(test_cr2, breaks=seq(0,256,by=8))
h2 <- hist(test_cr3, breaks=seq(0,256,by=8))
minkowski.dist(h1, h2, 1) # 1 = manhattan dist
但是我找不到有关HistogramDistance使用的4种不同相似性指标的相对优点的信息:
minkowski.dist函数计算两个直方图之间的阶数p的Minkowski距离。 p = 1是曼哈顿距离,p = 2是欧几里德距离。
intersect.dist函数计算两个直方图的交点距离,如Swain和Ballard 1991,p15中所定义。如果直方图h1和h2不包含相同的总计数,则该指标将不是对称的。
kl.divergence函数计算两个直方图之间的Kullback-Leibler差异。
jeffrey.divergence函数计算两个直方图之间的Jeffrey分歧。
Minkowski距离是否适合我的目的?如果是这样哪个更好,曼哈顿或欧几里德距离?
我找不到在R中实现直方图相似性的任何这些方法的实际例子。
首先,我会建议哪些是最有用的方法,在R中对于大型数据集(数千个直方图)相对容易实现。
其次,在R中实现的任何这些方法的示例用于直方图比较。 (我在网上找不到任何相关代码。)