Использование this изображение в качестве ссылки Я хочу найти грязное пятно внизу this изображение.Различия между двумя изображениями
Мне удалось превратить второе изображение в тот же масштаб и ориентацию, а теперь попробуйте найти место, используя absdiff
, но так как изображения не идеально подходят, у меня есть края на diff image.
Я думаю, что вместо разницы между пикселями с одинаковыми координатами мне нужно найти минимальную разницу в области, такой как n на n пикселей. Итак, вопрос в том, имеет ли OpenCV что-то buitin для этого и/или есть лучшее решение проблемы?
EDIT: Решение с использованием threshold
и erode
:
public static Image<Bgr, Byte> Diff(Image<Bgr, Byte> image1,
Image<Bgr, byte> image2,
int erodeIterations=2)
{
return Diff(image1, image2, new Bgr(50, 50, 50), erodeIterations);
}
public static Image<Bgr, Byte> Diff(Image<Bgr, Byte> image1,
Image<Bgr, byte> image2,
Bgr thresholdColor,
int erodeIterations)
{
var diff = image1.AbsDiff(image2);
diff = diff.ThresholdToZero(thresholdColor);
diff = diff.Erode(erodeIterations);
return diff;
}
Проблема заключается в том, что изображения могут никогда не выравниваться, поскольку в гомографической матрице, используемой для преобразования перспективы, всегда имеются некоторые ошибки. – Igonato
Правда, но с небольшими несоосности вы должны получать только края в разностном изображении для областей, где должны совпадать изображения. Там, где есть видимый шум, вы получите целый патч с высокой интенсивностью в разностном изображении. В вашем коде вы находите минимальную разницу в регионе. Я предлагаю вам изменить это, чтобы подсчитать количество значительно разных пикселей, а затем найти максимумы. – Zaphod
У меня есть твоя идея, она может работать лучше, чем я. – Igonato