Какие свойства изображения можно использовать, чтобы программно отбросить его как «плохое»? - Фотопедия
8 голосов
/ 02 июня 2015

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

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

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

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 09 июня 2015

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

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

enter image description here

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

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

1 голос
/ 09 апреля 2018

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

например. Арифметика изображения:

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

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

размытое изображение значительно меньше, чем размытое.

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


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


1 голос
/ 03 января 2018

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

Ниже моя реализация нескольких фотографий с использованием 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
Добро пожаловать на сайт Фотопедия, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...