¿Cómo puedo eliminar automáticamente digitalmente las motas de polvo del sensor cambiante de una gran serie de fotos?

8

Mientras estaba en el desierto, mi sensor se volvió polvoriento. Estuve fuera durante semanas y no me di cuenta hasta el final de mi viaje, así que tengo cientos de fotos con sensor de suciedad. Durante las vacaciones, el polvo empeoró gradualmente a medida que cambiaba las lentes con frecuencia. Después de mis vacaciones, limpié profesionalmente el sensor y las fotos nuevas no tienen manchas, pero estoy buscando una solución para las fotos de vacaciones.

Para limpiar mis fotos, utilicé The Gimp para producir una máscara de las ubicaciones de las peores piezas de polvo:

peores lugares de polvo

luego usé gmic para eliminarlos de la línea de comandos:

gmic 08-34-51.jpg ../../../dustmask_20180606_sky_flat_neg.png +inpaint_patchmatch[0] [1],10,7,4,2,1,0 -o[2] 08-34-51-clean.jpg

Aunque esta no es una solución óptima porque esencialmente repinta esas áreas desde cero (sin usar la información de fondo), proporciona resultados satisfactorios en el cielo azul. Pensé que de esta manera, podría automatizar el proceso sobre los cientos de imágenes afectadas. Desafortunadamente, el polvo no es estacionario, por lo que esto no funciona. Se desplaza en el orden de 20 píxeles, que corresponde a unos 80 µm. No sé si esto se debe al polvo que se mueve físicamente, o si puede deberse al procesamiento de imágenes en la cámara, como la estabilización de la imagen o la corrección de la lente. He tomado algunas imágenes en bruto y JPEG, y para esas imágenes puedo ver visualmente un ligero cambio en la forma de la imagen.

Es muy sutil, pero si compara las siguientes dos imágenes, el trozo de polvo más grande y prominente se ha movido de centrado en píxel (1677, 619)a centrado en píxel (1655, 603). En el otro extremo, un píxel menos prominente a la derecha se ha movido de (4919, 1485)a (4940, 1483). ¿Quizás no debería ser demasiado sorprendente que los pedazos de polvo puedan y se muevan en relación al sensor?

Imagen 1 con polvo en el cielo

Imagen 2 con polvo en el cielo

Las fotos se toman con aproximadamente 90 minutos de diferencia. Las imágenes que publiqué están muestreadas por un factor 2.

Los datos EXIF ​​incluyen datos de Sony Makernote, que pueden incluir información sobre estabilización de imagen, como ImageStabilization = 1. No sé si incluye más detalles sobre la estabilización de imagen. Incluye un campo Sony_0x201f = 128 17 2 0, que parece variar entre las imágenes, pero es idéntico entre las dos imágenes mostradas arriba, por lo que no identifica (únicamente) información para corregir la estabilización de la imagen. No sé si algún otro campo sí. Los datos exif completos (según lo informado por exiftool -v) para una imagen muestran:

  ExifToolVersion = 10.10
  FileName = 08-35-11.jpg
  Directorio =.
  FileSize = 9440161
  FileModifyDate = 1528067625
  FileAccessDate = 1529519016
  FileInodeChangeDate = 1528150970
  FilePermissions = 33204
  Tipo de archivo = JPEG
  FileTypeExtension = JPG
  MIMEType = image / jpeg
JPEG APP1 (44908 bytes):
  ExifByteOrder = II
  + [Directorio IFD0 con 13 entradas]
  El | 0) ProcessingSoftware = digiKam-5.6.0
  El | 1) ImageDescription =                                
  El | 2) Hacer = SONY
  El | 3) Modelo = ILCE-6000
  El | 4) Orientación = 1
  El | 5) XResolution = 350 (350/1)
  El | 6) Resolución Y = 350 (350/1)
  El | 7) ResoluciónUnidad = 2
  El | 8) Software = ILCE-6000 v3.20
  El | 9) ModifyDate = 2018: 05: 11 08:35:11
  El | 10) YCbCrPosition = 2
  El | 11) ExifOffset (SubDirectorio) ->
  El | + [Directorio ExifIFD con 38 entradas]
  El | El | 0) Tiempo de exposición = 0.003125 (1/320)
  El | El | 1) Número F = 11 (110/10)
  El | El | 2) Programa de exposición = 3
  El | El | 3) ISO = 100
  El | El | 4) Tipo de sensibilidad = 2
  El | El | 5) RecommendedExposureIndex = 100
  El | El | 6) ExifVersion = 0230
  El | El | 7) DateTimeOriginal = 2018: 05: 11 08:35:11
  El | El | 8) CreateDate = 2018: 05: 11 08:35:11
  El | El | 9) Configuración de componentes = 1 2 3 0
  El | El | 10) CompressedBitsPerPixel = 3 (3/1)
  El | El | 11) Valor de brillo = 10.76328125 (27554/2560)
  El | El | 12) Compensación de exposición = 0 (0/10)
  El | El | 13) MaxApertureValue = 3.6171875 (926/256)
  El | El | 14) MeteringMode = 5
  El | El | 15) Fuente de luz = 0
  El | El | 16) Flash = 16
  El | El | 17) Longitud focal = 18 (180/10)
  El | El | 18) MakerNoteSony (SubDirectorio) ->
  El | El | + [Directorio MakerNotes con 94 entradas]
  El | El | El | 0) Sony_0x1003 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  El | El | El | 1) Sony_0x2000 = 0
  El | El | El | 2) PreviewImage =
  El | El | El | 3) Calificación = 0
  El | El | El | 4) Sony_0x2003 =
  El | El | El | 5) Contraste = 0
  El | El | El | 6) Saturación = 0
  El | El | El | 7) Nitidez = 0
  El | El | El | 8) Brillo = 0
  El | El | El | 9) LongExposureNoiseReduction = 1
  El | El | El | 10) HighISONoiseReduction = 2
  El | El | El | 11) HDR = 0 0
  El | El | El | 12) Sony_0x200c = 0 0 0
  El | El | El | 13) Sony_0x200d = 1 (10/10)
  El | El | El | 14) WBShiftAB_GM = 0 0
  El | El | El | 15) ShotInfo (SubDirectorio) ->
  El | El | El | + [Directorio de datos binarios, 390 bytes]
  El | El | El | El | FaceInfoOffset = 94
  El | El | El | El | SonyDateTime = 2018: 05: 11 08:35:11
  El | El | El | El | SonyImageHeight = 4000
  El | El | El | El | SonyImageWidth = 6000
  El | El | El | El | FacesDetected = 0
  El | El | El | El | FaceInfoLength = 37
  El | El | El | El | MetaVersion = DC7303320222000
  El | El | El | 16) CreativeStyle = Standard
  El | El | El | 17) Temperatura de color = 0
  El | El | El | 18) ColorCompensationFilter = 0
  El | El | El | 19) SceneMode = 0
  El | El | El | 20) ZoneMatching = 0
  El | El | El | 21) DynamicRangeOptimizer = 3
  El | El | El | 22) Estabilización de imagen = 1
  El | El | El | 23) ColorMode = 0
  El | El | El | 24) FullImageSize = 4000 6000
  El | El | El | 25) PreviewImageSize = 1080 1616
  El | El | El | 26) FileFormat = 3 3 1 0
  El | El | El | 27) Calidad = 2
  El | El | El | 28) FlashExposureComp = 0 (0/10)
  El | El | El | 29) WhiteBalanceFineTune = 0
  El | El | El | 30) WhiteBalance = 0
  El | El | El | 31) SonyModelID = 312
  El | El | El | 32) Teleconvertidor = 0
  El | El | El | 33) MultiFrameNoiseReduction = 0
  El | El | El | 34) PictureEffect = 0
  El | El | El | 35) SoftSkinEffect = 0
  El | El | El | 36) Corrección de viñetas = 2
  El | El | El | 37) LateralChromaticAberration = 2
  El | El | El | 38) DistortionCorrectionSetting = 0
  El | El | El | 39) Sony_0x2015 = 65535
  El | El | El | 40) LensType = 65535
  El | El | El | 41) LensSpec = ... 5c
  El | El | El | 42) AutoPortraitFramed = 0
  El | El | El | 43) FlashAction = 0
  El | El | El | 44) Sony_0x2018 = 0
  El | El | El | 45) Sony_0x2019 = 0
  El | El | El | 46) Sony_0x201a = 1
  El | El | El | 47) FocusMode = 2
  El | El | El | 48) AFAreaModeSetting = 1
  El | El | El | 49) FlexibleSpotPosition = 0 0
  El | El | El | 50) AFZoneSelected = 0
  El | El | El | 51) Sony_0x201f = 128 17 2 0
  El | El | El | 52) AFPointsUsed = 0 0 0 0 0 0 0 0 0 0
  El | El | El | 53) Sony_0x2021 = 0
  El | El | El | 54) FocalPlaneAFPointsUsed = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  El | El | El | 55) Sony_0x2023 = 0
  El | El | El | 56) Sony_0x5001 = 0 (0/1000)
  El | El | El | 57) Sony_0x5002 = 128
  El | El | El | 58) Modo de exposición = 7
  El | El | El | 59) Sony_0xb045 = 0
  El | El | El | 60) Sony_0xb046 = 0
  El | El | El | 61) JPEG Calidad = 65535
  El | El | El | 62) FlashLevel = 0
  El | El | El | 63) ReleaseMode = 0
  El | El | El | 64) SequenceNumber = 0
  El | El | El | 65) Anti-Blur = 2
  El | El | El | 66) Sony_0xb04c = 1 (10/10)
  El | El | El | 67) Sony_0xb04d = 0
  El | El | El | 68) DynamicRangeOptimizer = 1
  El | El | El | 69) Sony_0xb050 = 65535
  El | El | El | 70) Sony_0xb051 = 0
  El | El | El | 71) Auto inteligente = 0
  El | El | El | 72) Sony_0xb053 = 0
  El | El | El | 73) WhiteBalance = 0
  El | El | El | 74) Tag9400c (SubDirectorio) ->
  El | El | El | + [Directorio de datos binarios, 556 bytes]
  El | El | El | El | ReleaseMode2 = 0
  El | El | El | El | ShotNumberSincePowerUp = 2
  El | El | El | El | SequenceImageNumber = 0
  El | El | El | El | SequenceLength = 1
  El | El | El | El | SequenceFileNumber = 0
  El | El | El | El | SequenceLength = 1
  El | El | El | El | CameraOrientation = 1
  El | El | El | El | Calidad2 = 0
  El | El | El | El | SonyImageHeight = 500
  El | El | El | El | ModelReleaseYear = 14
  El | El | El | 75) Sony_0x9401 = ..f .... pW ..). 6Q. \. (. GG..6 \ 6.GG..6 \ 6 .. $ .......... ^. ..3..s. [Recorte]
  El | El | El | 76) Etiqueta9402 (Subdirectorio) ->
  El | El | El | + [Directorio de datos binarios, 400 bytes]
  El | El | El | El | Temperatura ambiente = 21
  El | El | El | El | FocusMode = 2
  El | El | El | El | AFAreaMode = 1
  El | El | El | El | FocusPosition2 = 202
  El | El | El | 77) Etiqueta9403 (Subdirectorio) ->
  El | El | El | + [Directorio de datos binarios, 1000 bytes]
  El | El | El | 78) Tag9404b (SubDirectorio) ->
  El | El | El | + [Directorio de datos binarios, 556 bytes]
  El | El | El | El | LensZoomPosition = 27
  El | El | El | 79) Etiqueta9405b (Subdirectorio) ->
  El | El | El | + [Directorio de datos binarios, 1992 bytes]
  El | El | El | El | SonyISO = 4096
  El | El | El | El | BaseISO = 4096
  El | El | El | El | StopsAboveBaseISO = 4096
  El | El | El | El | SonyExposureTime2 = 6208
  El | El | El | El | Tiempo de exposición = 0.003125
  El | El | El | El | SonyFNumber = 5888
  El | El | El | El | SonyMaxApertureValue = 5054
  El | El | El | El | SequenceImageNumber = 0
  El | El | El | El | ReleaseMode2 = 0
  El | El | El | El | HighISONoiseReduction = 2
  El | El | El | El | LongExposureNoiseReduction = 1
  El | El | El | El | PictureEffect2 = 0
  El | El | El | El | Programa de exposición = 1
  El | El | El | El | CreativeStyle = 0
  El | El | El | El | Nitidez = 0
  El | El | El | El | Distorsión Corrección = 0
  El | El | El | El | LensFormat = 1
  El | El | El | El | LensMount = 2
  El | El | El | El | LensType2 = 32787
  El | El | El | El | LensZoomPosition = 27
  El | El | El | 80) Etiqueta9406 (Subdirectorio) ->
  El | El | El | + [Directorio de datos binarios, 64 bytes]
  El | El | El | El | Temperatura de la batería = 87
  El | El | El | El | Nivel de batería = 55
  El | El | El | 81) Sony_0x9407 = .2WW. ^ .... AT..W ..>. WSi ... lw ... W ............. T..i .... ... T .... Wl
  El | El | El | 82) Sony_0x9408 = i .... * ...... \ ... * ..} ...... u} .. C. = .. @. [. 8k. & ... | ...... C ^ .. pp .. [recorte]
  El | El | El | 83) Sony_0x9409 =. ... l. (.... I ......... `... s .......... i7. @. Sp ......> ... ..... @ .......... z ...% ...>. [recorte]
  El | El | El | 86) Tag940c (SubDirectorio) ->
  El | El | El | + [Directorio de datos binarios, 64 bytes]
  El | El | El | El | LensMount2 = 4
  El | El | El | El | LensType3 = 32787
  El | El | El | El | CameraE-mountVersion = 336
  El | El | El | El | LensE-mountVersion = 263
  El | El | El | El | LensFirmwareVersion = 1
  El | El | El | 87) Sony_0x940d = ...... g ...... z ...? .. u ............. GO.D ..... qUx ... ? .... el .... 8 [recorte]
  El | El | El | 88) Tag940e (Subdirectorio) ->
  El | El | El | + [Directorio de datos binarios, 12288 bytes]
  El | El | El | 89) Sony_0xa100 =
  El | El | El | 90) Etiqueta2010g (Subdirectorio) ->
  El | El | El | + [Directorio de datos binarios, 6556 bytes]
  El | El | El | El | ReleaseMode2 = 0
  El | El | El | El | DynamicRangeOptimizer = 1
  El | El | El | El | ReleaseMode3 = 0
  El | El | El | El | ReleaseMode2 = 0
  El | El | El | El | FlashMode = 1
  El | El | El | El | StopsAboveBaseISO = 4096
  El | El | El | El | BrightnessValue = 17245
  El | El | El | El | DynamicRangeOptimizer = 1
  El | El | El | El | HDRSetting = 0
  El | El | El | El | Compensación de exposición = 0
  El | El | El | El | PictureProfile = 0
  El | El | El | El | PictureProfile = 0
  El | El | El | El | PictureEffect2 = 0
  El | El | El | El | Calidad2 = 0
  El | El | El | El | MeteringMode = 0
  El | El | El | El | Programa de exposición = 1
  El | El | El | El | WB_RGBLevels = 690 256 427
  El | El | El | El | Longitud focal = 180
  El | El | El | El | MinFocalLength = 180
  El | El | El | El | MaxFocalLength = 2000
  El | El | El | El | SonyISO = 4096
  El | El | El | El | LensFormat = 1
  El | El | El | El | LensMount = 2
  El | El | El | El | LensType2 = 32787
  El | El | El | 91) Sony_0x940f = liVi. $ ........) .... @ .. f ......... & .... @ ... Y @) .. Y @. @...........[recorte]
  El | El | El | 92) Tag9050 (Subdirectorio) ->
  El | El | El | + [Directorio de datos binarios, 944 bytes]
  El | El | El | El | FlashStatus = 64
  El | El | El | El | ImageCount = 3836
  El | El | El | El | SonyFNumber = 5888
  El | El | El | El | ReleaseMode2 = 0
  El | El | El | El | ImageCount2 = 3836
  El | El | El | El | SonyDateTime2 = .... #.
  El | El | El | El | ReleaseMode2 = 0
  El | El | El | El | InternalSerialNumber = 162254226 13
  El | El | El | El | LensMount = 2
  El | El | El | El | LensFormat = 1
  El | El | El | El | LensType2 = 32787
  El | El | El | El | LensSpecFeatures =.
  El | El | El | El | ImageCount3 = 44765
  El | El | El | 93) Sony_0x9412 = ... @. V ........................................ ...............[recorte]
  El | El | 19) Comentario del usuario =
  El | El | 20) FlashpixVersion = 0100
  El | El | 21) ColorSpace = 1
  El | El | 22) ExifImageWidth = 6000
  El | El | 23) ExifImageHeight = 4000
  El | El | 24) InteropOffset (SubDirectory) ->
  El | El | + [Directorio de InteropIFD con 2 entradas]
  El | El | El | 0) InteropIndex = R98
  El | El | El | 1) InteropVersion = 0100
  El | El | 25) FileSource = 3
  El | El | 26) SceneType = 1
  El | El | 27) CustomRendered = 0
  El | El | 28) Modo de exposición = 0
  El | El | 29) WhiteBalance = 0
  El | El | 30) DigitalZoomRatio = 1 (16/16)
  El | El | 31) FocalLengthIn35mmFormat = 27
  El | El | 32) SceneCaptureType = 0
  El | El | 33) Contraste = 0
  El | El | 34) Saturación = 0
  El | El | 35) Nitidez = 0
  El | El | 36) LensInfo = 18200 3.5 6.3 (180/10 2000/10 35/10 63/10)
  El | El | 37) LensModel = E 18-200mm F3.5-6.3 OSS
  El | 12) PrintIM (SubDirectorio) ->
  El | + [Directorio PrintIM con 3 entradas]
  El | El | PrintIMVersion = 0300
  El | El | 0) PrintIM_0x0002 = 1
  El | El | 1) PrintIM_0x0003 = 34
  El | El | 2) PrintIM_0x0101 = 0
  + [Directorio IFD1 con 13 entradas]
  El | 0) Compresión = 6
  El | 1) ImageDescription =                                
  El | 2) Hacer = SONY
  El | 3) Modelo = ILCE-6000
  El | 4) Orientación = 1
  El | 5) Resolución X = 72 (72/1)
  El | 6) YResolución = 72 (72/1)
  El | 7) ResoluciónUnidad = 2
  El | 8) Software = ILCE-6000 v3.20
  El | 9) ModifyDate = 2018: 05: 11 08:35:11
  El | 10) ThumbnailOffset = 38476
  El | 11) Longitud de miniatura = 6426
  El | 12) YCbCrPosition = 2
JPEG APP1 (2825 bytes):
  + [Directorio XMP, 2796 bytes]
  El | XMPToolkit = XMP Core 4.4.0-Exiv2
  El | Software = digiKam-5.6.0
  El | CreatorTool = digiKam-5.6.0
  El | Leyenda = Monumento Nacional Gran Cañón-Parashant, a lo largo de Clayhole Road
  El | Título = Monumento Nacional Gran Cañón-Parashant, a lo largo de Clayhole Road
JPEG APP13 (126 bytes):
  + [Directorio de Photoshop, 112 bytes]
  El | IPTCData (SubDirectorio) ->
  El | + [Directorio IPTC, 99 bytes]
  El | El | CurrentIPTCDigest = ~ .g..z .... 3P} R ..
  El | El | - IPTCEnvelope record -
  El | El | CodedCharacterSet =.% G
  El | El | - Registro de aplicación IPTCA -
  El | El | Programa de origen = digiKam
  El | El | ProgramVersion = 5.6.0
  El | El | ObjectName = Grand Canyon-Parashant National Monument, a lo largo de Clayhole Roa
JPEG APP2 (156 bytes):
  + [Directorio MPF0 con 3 entradas]
  El | 0) MPFVersion = 0100
  El | 1) NumberOfImages = 2
  El | 2) MPImageList (SubDirectorio) ->
  El | + [Directorio de datos binarios, 16 bytes]
  El | El | MPImageFlags = 2684354560
  El | El | MPImageFormat = 0
  El | El | MPImageType = 196608
  El | El | MPImageLength = 8768466
  El | El | MPImageStart = 0
  El | El | DependentImage1EntryNumber = 2
  El | El | DependentImage2EntryNumber = 0
  El | + [Directorio de datos binarios, 16 bytes]
  El | El | MPImageFlags = 1073741824
  El | El | MPImageFormat = 0
  El | El | MPImageType = 65538
  El | El | MPImageLength = 664145
  El | El | MPImageStart = 8724632
  El | El | DependentImage1EntryNumber = 0
  El | El | DependentImage2EntryNumber = 0
JPEG DQT (130 bytes):
JPEG DHT (416 bytes):
JPEG SOF0 (15 bytes):
  Ancho de imagen = 6000
  ImageHeight = 4000
  EncodingProcess = 0
  BitsPerSample = 8
  Componentes de color = 3
JPEG SOS
  Advertencia = [menor] Error al leer PreviewImage
  PreviewImage = SCALAR (0x19b5ab8)

¿Qué herramientas existen para eliminar automáticamente el polvo del sensor de una gran serie de fotos? Tengo cientos de fotos afectadas (esencialmente cualquier cosa tomada en F / 8 o menor). Es más obvio cuando la región afectada está en el cielo, por lo que una solución que funcione solo para el cielo es satisfactoria. Suponiendo que el polvo no se mueva demasiado , debería ser posible utilizar algún tipo de técnica de emparejamiento para calcular una nueva máscara para cada foto, antes de aplicarla con pintura o algún otro método. Aunque simple en teoría, implementar esto puede ser bastante laborioso en la práctica, y ni siquiera estoy seguro de si la pintura es una buena solución.

A menos que repare manualmente cada foto (toma 4 minutos de tiempo de cálculo solo en mi antiguo escritorio), qué herramientas existen para reparar toda mi serie de fotos (o al menos las tomadas a F / 8 o menos con cielo en las áreas afectadas) ?

Trabajo en Linux y mi kit de herramientas habitual consiste en digikam, darktable, gimp y Python. La cámara es una Sony A6000 (cámara de sistema compacta / sin espejo) bastante nueva. Algunas fotos se toman con una lente OSS Sony de 18–200 mm, otras con una lente manual Samyang de 12 mm.

gerrit
fuente
1
¡Oh hombre! ¡Otro trabajo para ML!
Por favor, lea mi perfil
1
@mattdm ML = ¿Aprendizaje automático? ¡Supongo que sí!
gerrit
3
Si. Creo que es hora de comenzar un grupo de apuestas para cuando este sitio se fusionará con ai.stackexchange.com :)
Lea mi perfil el
@xiota que he editado en la pregunta: Sony A6000; Estoy bastante seguro de que es el polvo del sensor porque se acumuló durante las vacaciones, fue visible con una lupa y desapareció después de la limpieza profesional del sensor. Supongo que es el polvo que se mueve en relación con el sensor, pero no he oído hablar de IBIS antes. ¿Alguna placa transparente en frente del sensor que puede cambiar de 50 a 100 µm?
gerrit
@xiota Soy nuevo en align_image_stack- ¡ Veré si me puede ayudar!
gerrit

Respuestas:

3

Algo como esto actualmente no tiene una solución técnica: supongo que debe hacerlo manualmente o esperar una solución respaldada por AI / ML.

Dicho esto, puede lograr cierto éxito con esta herramienta:

http://www.batchcrop.com/dust-spot-removal.php

Cuesta 49 $.

Andreas Hartmann
fuente
2
Terminé haciéndolo manualmente (con darktable), me llevó mucho tiempo, ¡pero obtuve un vistazo bueno y detallado de muchas fotos de vacaciones!
gerrit