Какие свойства изображения можно использовать для программного отбрасывания его как «плохого»?

Я хотел бы иметь более быстрый процесс просмотра моих фотографий, когда я загружаю их с камеры на компьютер. Наверняка есть какие-то параметры, которые я могу программно извлечь из фотографий, и этого значения может быть достаточно, чтобы автоматически поместить некоторые фотографии в стопку «отбросов».

Я думаю об алгоритмах обнаружения краев, получения средней резкости/размытости изображения или что-то в этом роде.

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

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

TLDR; что я должен посмотреть, чтобы иметь возможность программно отбрасывать изображение (обнаружение краев, резкость)?

Я использую Fedora Linux.

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

Я был бы рад увидеть ответ на этот вопрос, но я не уверен, что он есть. Например, представьте эффектную фотографию насекомого или другого движущегося объекта, где 95% изображения размыты или не в фокусе. Есть много других примеров, когда программная оценка эстетики может ошибочно исключить некоторые из ваших лучших изображений. В любом случае, я хотел бы видеть, как это развивается.
@AK Да, я знаю, что будут ложные срабатывания, но для действительно плохих изображений (с моим плохим опытом и съемкой с мануальными объективами у меня есть куча дрянных фотографий) это поможет отделить их от не таких уж плохих.
Я не думаю, что это дубликат, так как здесь спрашивается, что такое программное обеспечение будет искать, а не рекомендация по программному обеспечению. Впрочем, я помню еще один, который казался похожим...
Я бы, конечно, рассматривал перегоревшие блики как фактор.
Некоторые камеры содержат предупреждения в своей информации EXIF, такие как предупреждение о размытии , фокусировке или экспозиции . Чтение их с использованием этой бесплатной/коммерческой библиотеки C++ и принятие решения о них МОЖЕТ также помочь.
Вы могли бы достаточно легко обнаружить дрожание камеры, чрезмерную/недостаточную экспозицию, и если бы вы были действительно сообразительны, вы могли бы попытаться определить объект фотографии, чтобы проверить, был ли он в фокусе, но это все.
Хотя, правда, твоя формулировка здесь мне больше других нравится.
Трудно даже обнаружить недо- или передержку, потому что как насчет случаев, когда вы этого хотели? Что, если изображение либо в высоком, либо в низком ключе (для эффекта или просто потому, что сцена была такой).
Поскольку это так сильно зависит от намерений стрелка, было бы интересно реализовать какой-то анализ в стиле SpamAssassin изображений, отброшенных пользователем... FAIK, может быть, у кого-то есть...

Ответы (3)

Разумным ответом на это было бы «это зависит» (другая точка зрения — « немного бороться с идеей объективных показателей ») .

Я бы порекомендовал обратиться к этой таблице , чтобы определить, сколько времени вы должны потратить, пытаясь найти более быстрый способ, если «быстрота» — это то, что вы ищете.

введите описание изображения здесь

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

Для начала вам, вероятно, понадобится более четкое определение слова «полная чушь». Я бы предложил подход, основанный на данных; просмотрите разумную выборку ваших изображений вручную, грубо разделите на хорошие/плохие/дерьмовые (G/B/C) присмотритесь к любым функциям, которые могут отделить C от G или B, постарайтесь описать эти функции как можно проще (например, уровни цвета, размытые, слишком светлые, слишком темные и т. д.+). переведите это в термины OpenCV. написать код для проверки теории. классифицировать. повторяйте до тех пор, пока не будете удовлетворены.

В зависимости от языка, который вы используете OpenCV, как было предложено выше, или его эквивалента .net Emgu . По сути, вам нужно отобразить изображение в оттенках серого, затем использовать размытие по Лапласу, затем получить данные изображения и проверить изображение, чтобы увидеть, находится ли оно в пределах порогового диапазона. Если он находится в определенном диапазоне, изображение не размыто, если изображение находится за пределами этого диапазона, оно размыто.

Ниже моя реализация нескольких фотографий с использованием VB.net.

  Public Sub GetBlur()
    Dim List As String() = Directory.GetFiles("E:\Dartmoor\", "*.JPG")


    For Index As Integer = 1 To 2000
        Dim imgfile As String = List(Index)
        Dim Image As Drawing.Bitmap = Drawing.Bitmap.FromFile(imgfile)
        Dim img As Image(Of Gray, Byte) = New Image(Of Gray, Byte)(Image)
        Dim factor As Single()
        Dim imgB As Drawing.Bitmap = New Drawing.Bitmap(imgfile)
        imgB = New Drawing.Bitmap(imgB)
        Dim imgGray As Image(Of Gray, Byte) = img.Convert(Of Gray, Byte)()
        Dim imgTmp As Image(Of Gray, Single) = imgGray.Laplace(1)
        Dim maxLap As Short = -32767
        For Each MyByte As Single In imgTmp.Data
            If MyByte > maxLap Then

                maxLap = MyByte

            End If
        Next

        If maxLap > 300 Or maxLap < 150 Then
            List(Index) = imgfile & " is blurry"

        Else
            List(Index) = imgfile & " isn't blurry"
        End If

        '    'This saves the location of where the user is currently if they need to pause





        imgGray.Dispose()
        img.Dispose()
        imgTmp.Dispose()
        imgB.Dispose()

    Next
    Using sw As StreamWriter = New StreamWriter("Result.txt")
        For i As Integer = 1 To 2000
            sw.WriteLine(List(i))
        Next
    End Using
End Sub
Это не отвечает на вопрос, что я должен посмотреть, чтобы иметь возможность программно отбрасывать изображение (обнаружение краев, резкость)? Это звучит как реализация предложения в другом ответе.
Прежде всего, я бы рекомендовал не удалять ничего, что программа считает размытым. Потому что никогда не бывает на 100% идеально. Оригинальный постер сказал проверить, если это плохо. Таким образом, эта реализация будет работать для этого. В этой реализации используется обнаружение границ. Проблема в том, что «плохое» очень разнообразно, и когда я думаю о плохом, я думаю размыто и все такое.
Но кажется, что композиция с небольшим хорошо сфокусированным объектом с большим количеством творческой размытости (боке) будет исключена как в основном размытая. Таким образом , преднамеренное размытие не проходит эту проверку. (Я также согласен, я бы не стал удалять ничего, что программа назвала бы меня «плохим». Компьютеры не могут хорошо интерпретировать искусство)
Это очень справедливое замечание относительно творческого размытия. Это будет очень трудно исправить. Я могу себе представить, пытаясь найти хороший диапазон, который включает в себя творческое размытие. Или создание отдельной процедуры, которая проверяет творческое размытие, которое, конечно же, будет иметь отдельный диапазон. Мой диапазон был создан в результате проверки размытия 40 изображений.

ImageMagick — ваш друг. Вы будете писать много скриптов, которые называют это программами.

Например, арифметика изображений:

Возьмите изображение. Размойте его до нового изображения. Вычтите изображение 2 из изображения 1, взяв абсолютное значение результата. Суммируйте пиксели результата и усредните. Порог.

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

Размытое изображение гораздо меньше отличается от расплывчатого размытого изображения.

Как указывает один из комментариев к другому ответу, иногда изображение намеренно размыто. Некоторым действительно нравится боке. Так что сделайте еще один шаг и возьмите среднюю треть или среднюю четверть изображения.


Возьмите гистограмму изображения. Если более X% пикселей насыщены (> 248) для любого канала, то блики пересвечиваются.