我在处理中工作,我想比较 2 个不同图像的 2 个像素的颜色。
假设我们比较位置 10 的像素
颜色 c1= image1.pixels[10]; 颜色 c2= image2.pixels[10];
if(c1==c2) { //所以 }
首先我玩的是亮度
如果(亮度(c1)==亮度(c2))
通常它可以工作,但并不完全符合我的要求,因为像素有点相似但颜色不完全相同。
我在处理中工作,我想比较 2 个不同图像的 2 个像素的颜色。
假设我们比较位置 10 的像素
颜色 c1= image1.pixels[10]; 颜色 c2= image2.pixels[10];
if(c1==c2) { //所以 }
首先我玩的是亮度
如果(亮度(c1)==亮度(c2))
通常它可以工作,但并不完全符合我的要求,因为像素有点相似但颜色不完全相同。
如果您想比较颜色,最好比较三个基本颜色,而不是“颜色”的实际数字。因此,而不是
if(c1 == c2)
你可以在哪里比较两个大数字,比如 13314249 你可以去
if(red(c1) == red(c2) && green(c1) == green(c2) && blue(c1) == blue(c2))
比较 0 到 255 之间的数字,您可以从颜色中获得红色、绿色或蓝色的可能值。至于“有点相似”的颜色,您可以设置一个阈值,低于该阈值的任何差异都将被视为可以忽略不计,因此颜色是相同的。像这样的东西:
int threshold = 5
if(abs(red(c1) red(c2)) < threshold && abs(green(c1) - green(c2)) < threshold && abs(blue(c1) == blue(c2)) < threshold)
请记住,您必须获得绝对的差异!这样,如果你降低阈值,只有非常相似的颜色被认为是相同的,而你增加它时,不同的颜色可以被认为是相同的。该阈值数字取决于您的喜好!
这也适用于您的亮度示例...
int threshold = 5
if(abs(brightness(c1) - brightness(c2)) < threshold)
扩展Petros的答案。通常,当我比较图像像素时,我会进行标准化,以便代码可以处理不在标准范围 0-255 内的图像。当您对图像进行许多操作以记住您当前正在使用的范围以进行缩放时,这也很好。
MAX_PIXEL=255 //maybe range is different for some reason
MIN_PIXEL=0
pixel_difference = 10
threshold = pixel_difference/(MAX_PIXEL-MIN_PIXEL)
if ( abs( (brightness(c1)-brightness(c2))/(MAX_PIXEL-MIN_PIXEL))< threshold ) {
//then the pixels are similar.
}
有时,您可以通过转换为不同的色彩空间来获得更多优势。
并且根据您手头的任务,您可以构建一个背景模型,该模型可以随时间调整或比较更高级别的全局特征,例如直方图或局部特征,例如尺度不变特征变换 (SIFT),或角、边。