Я хотел бы иметь более быстрый процесс просмотра моих фотографий, когда я загружаю их с камеры на компьютер. Наверняка есть какие-то параметры, которые я могу программно извлечь из фотографий, и этого значения может быть достаточно, чтобы автоматически поместить некоторые фотографии в стопку «отбросов».
Я думаю об алгоритмах обнаружения краев, получения средней резкости/размытости изображения или что-то в этом роде.
Я знаю, что этот сценарий на самом деле не отбрасывает все плохие фотографии и оставляет хорошие, но я надеюсь отбросить совершенно дерьмовые.
Я почти уверен, что могу запрограммировать сценарий оболочки с помощью ImageMagick (но я открыт для любого программного обеспечения командной строки), чтобы получить то, что мне нужно. Проблема в том, что я не знаю, какие значения мне следует искать, чтобы получить лучшие результаты.
TLDR; что я должен посмотреть, чтобы иметь возможность программно отбрасывать изображение (обнаружение краев, резкость)?
Я использую Fedora Linux.
edit: я не думаю, что этот вопрос является дубликатом вопроса. Есть ли программное обеспечение для анализа фотографий, которое будет предварительно сортировать изображения, выявляя потенциальные технические проблемы? потому что этот вопрос требует рекомендаций по программному обеспечению и предлагается изменить рабочий процесс в ответах (и использовать программное обеспечение, недоступное для Linux), в то время как я спрашиваю, что даст лучшие результаты при обнаружении плохих фотографий.
Разумным ответом на это было бы «это зависит» (другая точка зрения — « немного бороться с идеей объективных показателей ») .
Я бы порекомендовал обратиться к этой таблице , чтобы определить, сколько времени вы должны потратить, пытаясь найти более быстрый способ, если «быстрота» — это то, что вы ищете.
Однако, если вы решите подойти к этому как к упражнению в понимании вычислительного анализа изображений, взгляните на 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
ImageMagick — ваш друг. Вы будете писать много скриптов, которые называют это программами.
Например, арифметика изображений:
Возьмите изображение. Размойте его до нового изображения. Вычтите изображение 2 из изображения 1, взяв абсолютное значение результата. Суммируйте пиксели результата и усредните. Порог.
Четкое изображение значительно отличается от размытого изображения, поэтому среднее значение вычитания будет высоким.
Размытое изображение гораздо меньше отличается от расплывчатого размытого изображения.
Как указывает один из комментариев к другому ответу, иногда изображение намеренно размыто. Некоторым действительно нравится боке. Так что сделайте еще один шаг и возьмите среднюю треть или среднюю четверть изображения.
Возьмите гистограмму изображения. Если более X% пикселей насыщены (> 248) для любого канала, то блики пересвечиваются.
АК
Карлос Кампдеррос
АК
матдм
перец чили555
пользователь681768917
Мэтт Грум
матдм
матдм
матдм
матдм
свалкаблеск