Обнаружение изображений, которые визуально одинаковыC#

Место общения программистов C#
Ответить
Anonymous
 Обнаружение изображений, которые визуально одинаковы

Сообщение Anonymous »

У меня большой набор данных с фотографиями, и я пытаюсь найти дубликаты. Дубликаты, с которыми я имею дело, имеют то же решение (размеры) и кажутся для меня точными копиями - я не могу их отделить. Однако они сохраняются с немного разными параметрами сжатия (различное качество JPEG или JPEG против PNG и т. Д.). К сожалению, это также дает мне много ложных срабатываний - изображения, которые очень похожи, но разные - например, две фотографии, которые были сделаны в быстрой последовательности, поэтому у человека на фотографии немного отличается выражение лица. Я хотел бы избежать этих визуально разных изображений, обнаруженных как дубликаты.
Поэтому я подумал «настоящий» дубликат отделяет. Я выбрал только изображения, которые имеют одинаковый полученный паш (расстояние хамминга = 0). Затем попытались вычислить, насколько разные две фотографии используют 2 разных подхода: средняя квадратная ошибка и TM_SQDIFF_NORMED от OpenCV. К сожалению, оба дают мне очень ненадежные и часто нелогичные результаты. У меня есть 3 фотографии:
photo A . Оригинал PNG, сохраненный как jpeg:

Фото b . То же самое, что , но сохранено с максимальным качеством jpeg:
< /p>
photo c < /strong>. То же самое, что , но плохо отредактировано для изменения выражения лица:
< /p>
Все 3 изображения имеют одинаковый фаш. Если я быстро переключаюсь между и b в своем просмотре фотографии, я вообще не могу сказать разницу. В a и c однако разница сразу же заметна. К сожалению, и RMSE, и SQDIFF дают мне противоположный результат, по порядку: < /p>



< /th>
a & b < /th>
a & c < /th >
< /tr>
< /thead>


rmse < /td>
0.011931 < /td>
0.003523
< /tr>

sqdiff < /td>
0.000465
0.000040>


Таким образом, оба дают мне более меньшую ошибку при сравнении 2 визуально разных изображений a & c . Я предполагаю, что это связано с шумом, который сжатие JPEG добавляет в против b , который не воспринимается человеческим глазом. Я попытался визуализировать разницу, вычитая два изображения и получаю следующие результаты:

| a - b | Выглядит совершенно черный, если я действительно не повышу яркость - только тогда я вижу облако точек, составляющее шум. | a - c | Однако ясно показывает отредактированную часть (губы в центре -путе).
Мой вопрос: - как мне правильно определить разницу, которую я вижу и расскажу об этом Два случая, помимо надежно?double GetSqdiffNormed(Mat img1, Mat img2)
{
using var imgRes = new Mat();
CvInvoke.MatchTemplate(img1, img2, imgRes, TemplateMatchingType.SqdiffNormed);
return (float)imgRes.GetData().GetValue(0, 0);
}

double GetRMSE(Mat img1, Mat img2)
{
img1.ConvertTo(img1, DepthType.Cv32F, 1.0 / 255);
img2.ConvertTo(img2, DepthType.Cv32F, 1.0 / 255);
using var imgRes = new Mat();
CvInvoke.Subtract(img1, img2, imgRes);
CvInvoke.Multiply(imgRes, imgRes, imgRes);
var sum = CvInvoke.Sum(imgRes).ToArray().Sum();
return Math.Sqrt(sum / (imgRes.Width * imgRes.Height * imgRes.NumberOfChannels));
}


Подробнее здесь: https://stackoverflow.com/questions/794 ... ually-same
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»