我试图比较三维CIELuv色彩空间中的颜色,我想识别L,U和V值的颜色,这是最接近我的主要颜色感兴趣。我计算了每个源颜色之间的欧几里德距离(每种颜色用三个坐标L、U和V表示)和原色之间的距离(对于原色,我也有LUV坐标,没有为空间显示)。每种颜色与原色之间的距离存储在三个DistCol变量中。然后,我使用df$Min.Dist <- colnames(df[c(10:12)])[unlist(apply(df[c(10:12)], 1, which.min))]找到了这些距离中最小的一个。示例:
Colour1L Colour1U Colour1V Colour2L Colour2U Colour2V Colour3L Colour3U Colour3V DistCol1 DistCol2 DistCol3 Min.Dist
1 25.5 9.0 -54.5 98.8 0.0 -1.6 63.9 55.0 60.2 25.4 82.1 137.8 DistCol1
2 8.7 14.8 5.6 41.7 133.2 27.6 41.7 133.2 27.6 144.2 58.3 133.3 DistCol2
3 83.2 24.7 -42.7 21.6 -0.4 0.8 83.2 24.7 -42.7 12.1 170.6 102.3 DistCol1
4 55.0 -49.8 62.5 99.2 0.1 -1.8 55.0 -49.8 62.5 213.7 103.4 67.7 DistCol3我想使用Min.Dist变量(或者任何其他方法,如果有更好的方法!)为最接近的颜色有条件地选择所有三个L、u和v值。也就是说,在第一行中,Min.Dist是DistCol1,因此三个Source值都来自三个Colour1列。理想情况下,我的最后输出如下:
Colour1L Colour1U Colour1V Colour2L Colour2U Colour2V Colour3L Colour3U Colour3V DistCol1 DistCol2 DistCol3 Min.Dist SourceL SourceU SourceV
1 25.5 9.0 -54.5 98.8 0.0 -1.6 63.9 55.0 60.2 25.4 82.1 137.8 DistCol1 25.5 9.0 -54.5
2 8.7 14.8 5.6 41.7 133.2 27.6 41.7 133.2 27.6 144.2 58.3 133.3 DistCol2 41.7 133.2 27.6
3 83.2 24.7 -42.7 21.6 -0.4 0.8 83.2 24.7 -42.7 12.1 170.6 102.3 DistCol1 83.2 24.7 -42.7
4 55.0 -49.8 62.5 99.2 0.1 -1.8 55.0 -49.8 62.5 213.7 103.4 67.7 DistCol3 55.0 -49.8 62.5我以前得到了一个类似的结果,使用一个长嵌套的ifelse表达式来表示L、U和V维,例如df$SourceL <- ifelse(df$Min.Dist =="DistCol1", Colour1L, ifelse(df$Min.Dist == "DistCol2", Colour2L, ifelse(...,但是我在处理实际数据中的8-10颜色,这是非常乏味的,而且容易出错。
如果这个问题已经在其他地方得到了回答,我很抱歉,并将非常感谢对这方面的资源的任何建议或指导。感谢每一个在这个论坛上回答问题的人--在过去的几个月里,你的建议对于解决许多R问题是非常宝贵的!
发布于 2017-06-30 13:14:12
使用基R以非矢量化的方式执行此操作:
https://stackoverflow.com/questions/44845863
复制相似问题