Для изображений с реальными типами данных значения пикселей могут быть отрицательными, и эти три операции эквивалентны:
real1 = Image[RandomReal[1, {10, 10}]];
real2 = Image[RandomReal[1, {10, 10}]];
ImageData[ImageDifference[real1, real2]] ==
Abs@ImageData[ImageSubtract[real1, real2]] ==
Abs[ImageData[real1] - ImageData[real2]]
Out[4]= True
Но это не относится к изображениям целочисленных типов данных.Это связано с тем, что в таких изображениях могут храниться только положительные значения, а отрицательные результаты вычитания обрезаются до нуля в выходном изображении:
int1 = Image[RandomInteger[255, {10, 10}], "Byte"];
int2 = Image[RandomInteger[255, {10, 10}], "Byte"];
Это по-прежнему True
:
ImageData[ImageDifference[int1, int2]]
== Abs[ImageData[int1] - ImageData[int2]]
Но эти два значения различаются из-за отсечения:
ImageData[ImageDifference[int1, int2]]
== Abs@ImageData[ImageSubtract[int1, int2]]
При преобразовании обоих входных изображений в тип данных "Real" или "Real32" было бы меньше удивительных результатов.