Как проверить, равны ли два BufferedImage, игнорируя белый цвет? - PullRequest
0 голосов
/ 01 марта 2020

У меня есть один BufferedImage image1 и BufferedImage image2, и я хочу знать, равны ли они.

image1 сделан заранее и сохранен в файле изображения, где я конвертирую, используя ImageIO. Тем не менее, image2 производится на месте, так что в значительной степени гарантируется, что они имеют разные размеры. Что я знаю, так это то, что image2 будет равно одному из 9 различных image1.

Итак, я хочу проверить, являются ли они одним и тем же изображением, но игнорировать все белые пиксели на краю, потому что они имеют разный размер, поэтому, если я сравню все пиксели, они будут разными, независимо от того, что. Если вам интересно, почему по краям белый цвет, изображения являются числами, поэтому оставшееся пространство будет белым.

Если вы хотите упростить его, цвет реального изображения всегда будет черным, но мне бы хотелось, чтобы вы сделали его стандартным решением c (то есть с учетом всех цветов), поэтому Я мог бы использовать понятия позже.

private boolean equals(BufferedImage image1, BufferedImage image2) {
    // This is what I want to fill out.
}

Сначала я попытался найти первый небелой пиксель image1 и первый небеленный пиксель image2, а затем проверьте строки после этого, чтобы увидеть, если все равно. Тем не менее, изображения довольно большие, и этот подход требует больше, чем O (n ^ 2). Мне нужен более быстрый способ.

1 Ответ

1 голос
/ 01 марта 2020

Сначала я попытался найти первый небелой пиксель изображения 1 и первый небеленный пиксель изображения 2, а затем проверить строки после этого, чтобы убедиться, что все равно. Тем не менее, изображения довольно большие, и этот подход требует больше, чем O (n ^ 2). Мне нужен более быстрый способ.

Скорее всего, нет более быстрого способа использования этого подхода. Вы можете использовать обнаружение краев, но алгоритмы для этого тоже не очень быстрые.

Я бы попытался работать с ограничивающими рамками для каждого изображения (числа).

Если возможно сохранить изображение1 размер номер, это путь к go. Просто уменьшите изображение до реального размера числа и сохраните его на диск. Затем вы также можете сжать image2 до его ограничительной рамки, и сравнение будет довольно простым и быстрым.

Если сжатие не является опцией, расчет ограничительной рамки является опцией. Go через массив изображений и определить самый верхний и самый левый пиксель в обоих изображениях. Затем вы получите по крайней мере ограничивающие края для верхней и левой сторон, и это все, что вам нужно для сравнения изображений. (Если изображения могут отличаться по размеру, вам нужен весь ограничивающий прямоугольник)

Кстати, вам не нужно работать в O (n ^ 2). Если вы обнаружите самый верхний или самый левый пиксель в обоих изображениях, вы можете установить смещение для работы. Вам нужно только найти разницу, чтобы утверждать, что эти цифры разные. Вы можете работать с logi c, чтобы определить, какое число должно быть основано на простых тестах. Например, возьмите числа один (1) и ноль (0). В то время как ноль имеет белые пиксели в средней части, у него должны быть черные пиксели и наоборот. Таким образом, обнаружение областей, где цифры определенно являются черными или белыми, может помочь вам оценить число на изображении, протестировав до 9 областей.

...