Comment puis-je supprimer automatiquement et numériquement les taches de poussière du capteur de décalage d'une grande série de photos?

8

Dans le désert, mon capteur est devenu poussiéreux. J'étais absent pendant des semaines et je n'ai pas remarqué cela jusqu'à la fin de mon voyage, j'ai donc des centaines de photos avec des saletés de capteur. Pendant les vacances, la poussière s'est progressivement dégradée, car je changeais souvent d'objectif. Après mes vacances, j'ai fait nettoyer le capteur par un professionnel et les nouvelles photos n'ont pas de taches, mais je cherche une solution pour les photos de vacances.

Pour nettoyer mes photos, j'ai utilisé The Gimp pour produire un masque des emplacements des pires morceaux de poussière:

pires endroits de poussière

puis utilisé gmic pour les supprimer de la ligne de commande:

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

Bien que ce ne soit pas une solution optimale car il repeint essentiellement ces zones à partir de zéro (sans utiliser les informations d'arrière-plan), il fournit des résultats satisfaisants dans le ciel bleu. J'ai pensé que de cette façon, je pouvais automatiser le processus sur les centaines d'images affectées. Malheureusement, la poussière n'est pas stationnaire, donc cela ne fonctionne pas. Il se déplace de l'ordre de 20 pixels, ce qui correspond à environ 80 µm. Je ne sais pas si cela est dû à la poussière qui se déplace physiquement, ou si cela peut être dû au traitement d'image intégré à l'appareil, comme la stabilisation de l'image ou la correction de l'objectif. J'ai pris quelques images en raw et JPEG, et pour ces images je peux voir visuellement un léger changement dans la forme de l'image.

C'est très subtil, mais si vous comparez les deux images suivantes, le morceau de poussière le plus grand et le plus proéminent est passé du centre au pixel (1677, 619)au centre au pixel (1655, 603). À l'autre extrémité, un pixel moins visible à droite est passé de (4919, 1485)à (4940, 1483). Peut-être ne devrait-il pas être trop surprenant que des morceaux de poussière puissent se déplacer et se déplacent par rapport au capteur?

Image 1 avec de la poussière dans le ciel

Image 2 avec de la poussière dans le ciel

Les photos sont prises à environ 90 minutes d'intervalle. Les images que j'ai publiées sont sous-échantillonnées d'un facteur 2.

Les données EXIF ​​incluent les données Sony Makernote, qui peuvent inclure des informations sur la stabilisation d'image, telles que ImageStabilization = 1. Je ne sais pas si cela inclut plus de détails sur la stabilisation d'image. Il comprend un champ Sony_0x201f = 128 17 2 0, qui semble varier entre les images, mais est identique entre les deux images ci-dessus, de sorte qu'il n'identifie pas (uniquement) les informations à corriger pour la stabilisation de l'image. Je ne sais pas si un autre domaine le fait. Les données exif complètes (telles que rapportées par exiftool -v) pour une image montrent:

  ExifToolVersion = 10.10
  FileName = 08-35-11.jpg
  Répertoire =.
  FileSize = 9440161
  FileModifyDate = 1528067625
  FileAccessDate = 1529519016
  FileInodeChangeDate = 1528150970
  FilePermissions = 33204
  FileType = JPEG
  FileTypeExtension = JPG
  MIMEType = image / jpeg
JPEG APP1 (44908 octets):
  ExifByteOrder = II
  + [Répertoire IFD0 avec 13 entrées]
  | 0) ProcessingSoftware = digiKam-5.6.0
  | 1) ImageDescription =                                
  | 2) Marque = SONY
  | 3) Modèle = ILCE-6000
  | 4) Orientation = 1
  | 5) XResolution = 350 (350/1)
  | 6) Résolution Y = 350 (350/1)
  | 7) ResolutionUnit = 2
  | 8) Logiciel = ILCE-6000 v3.20
  | 9) ModifyDate = 2018: 05: 11 08:35:11
  | 10) YCbCrPositioning = 2
  | 11) ExifOffset (sous-répertoire) ->
  | + [Répertoire ExifIFD avec 38 entrées]
  | | 0) Temps d'exposition = 0,003125 (1/320)
  | | 1) FNumber = 11 (110/10)
  | | 2) Programme d'exposition = 3
  | | 3) ISO = 100
  | | 4) SensitivityType = 2
  | | 5) RecommendedExposureIndex = 100
  | | 6) ExifVersion = 0230
  | | 7) DateTimeOriginal = 2018: 05: 11 08:35:11
  | | 8) CreateDate = 2018: 05: 11 08:35:11
  | | 9) ComponentsConfiguration = 1 2 3 0
  | | 10) CompressedBitsPerPixel = 3 (3/1)
  | | 11) BrightnessValue = 10,76328125 (27554/2560)
  | | 12) Compensation d'exposition = 0 (0/10)
  | | 13) MaxApertureValue = 3,6171875 (926/256)
  | | 14) MeteringMode = 5
  | | 15) Source de lumière = 0
  | | 16) Flash = 16
  | | 17) FocalLength = 18 (180/10)
  | | 18) MakerNoteSony (sous-répertoire) ->
  | | + [Répertoire MakerNotes avec 94 entrées]
  | | | 0) Sony_0x1003 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  | | | 1) Sony_0x2000 = 0
  | | | 2) PreviewImage =
  | | | 3) Évaluation = 0
  | | | 4) Sony_0x2003 =
  | | | 5) Contraste = 0
  | | | 6) Saturation = 0
  | | | 7) Netteté = 0
  | | | 8) Luminosité = 0
  | | | 9) LongExposureNoiseReduction = 1
  | | | 10) HighISONoiseReduction = 2
  | | | 11) HDR = 0 0
  | | | 12) Sony_0x200c = 0 0 0
  | | | 13) Sony_0x200d = 1 (10/10)
  | | | 14) WBShiftAB_GM = 0 0
  | | | 15) ShotInfo (sous-répertoire) ->
  | | | + [Répertoire BinaryData, 390 octets]
  | | | | FaceInfoOffset = 94
  | | | | SonyDateTime = 2018: 05: 11 08:35:11
  | | | | SonyImageHeight = 4000
  | | | | SonyImageWidth = 6000
  | | | | FacesDetected = 0
  | | | | FaceInfoLength = 37
  | | | | MetaVersion = DC7303320222000
  | | | 16) CreativeStyle = Standard
  | | | 17) Température de couleur = 0
  | | | 18) ColorCompensationFilter = 0
  | | | 19) SceneMode = 0
  | | | 20) ZoneMatching = 0
  | | | 21) DynamicRangeOptimizer = 3
  | | | 22) Stabilisation d'image = 1
  | | | 23) ColorMode = 0
  | | | 24) FullImageSize = 4000 6000
  | | | 25) PreviewImageSize = 1080 1616
  | | | 26) FileFormat = 3 3 1 0
  | | | 27) Qualité = 2
  | | | 28) FlashExposureComp = 0 (0/10)
  | | | 29) WhiteBalanceFineTune = 0
  | | | 30) WhiteBalance = 0
  | | | 31) SonyModelID = 312
  | | | 32) Téléconvertisseur = 0
  | | | 33) MultiFrameNoiseReduction = 0
  | | | 34) PictureEffect = 0
  | | | 35) SoftSkinEffect = 0
  | | | 36) VignettingCorrection = 2
  | | | 37) LateralChromaticAberration = 2
  | | | 38) DistortionCorrectionSetting = 0
  | | | 39) Sony_0x2015 = 65535
  | | | 40) LensType = 65535
  | | | 41) LensSpec = ... 5c
  | | | 42) AutoPortraitFramed = 0
  | | | 43) FlashAction = 0
  | | | 44) Sony_0x2018 = 0
  | | | 45) Sony_0x2019 = 0
  | | | 46) Sony_0x201a = 1
  | | | 47) FocusMode = 2
  | | | 48) AFAreaModeSetting = 1
  | | | 49) FlexibleSpotPosition = 0 0
  | | | 50) AFZoneSelected = 0
  | | | 51) Sony_0x201f = 128 17 2 0
  | | | 52) AFPointsUsed = 0 0 0 0 0 0 0 0 0 0
  | | | 53) Sony_0x2021 = 0
  | | | 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
  | | | 55) Sony_0x2023 = 0
  | | | 56) Sony_0x5001 = 0 (0/1000)
  | | | 57) Sony_0x5002 = 128
  | | | 58) ExposureMode = 7
  | | | 59) Sony_0xb045 = 0
  | | | 60) Sony_0xb046 = 0
  | | | 61) JPEGQuality = 65535
  | | | 62) FlashLevel = 0
  | | | 63) ReleaseMode = 0
  | | | 64) SequenceNumber = 0
  | | | 65) Anti-flou = 2
  | | | 66) Sony_0xb04c = 1 (10/10)
  | | | 67) Sony_0xb04d = 0
  | | | 68) DynamicRangeOptimizer = 1
  | | | 69) Sony_0xb050 = 65535
  | | | 70) Sony_0xb051 = 0
  | | | 71) IntelligentAuto = 0
  | | | 72) Sony_0xb053 = 0
  | | | 73) WhiteBalance = 0
  | | | 74) Tag9400c (sous-répertoire) ->
  | | | + [Répertoire BinaryData, 556 octets]
  | | | | ReleaseMode2 = 0
  | | | | ShotNumberSincePowerUp = 2
  | | | | SequenceImageNumber = 0
  | | | | SequenceLength = 1
  | | | | SequenceFileNumber = 0
  | | | | SequenceLength = 1
  | | | | CameraOrientation = 1
  | | | | Qualité2 = 0
  | | | | SonyImageHeight = 500
  | | | | ModelReleaseYear = 14
  | | | 75) Sony_0x9401 = ..f .... pW ..). 6Q. \. (. GG..6 \ 6.GG..6 \ 6 .. $ .......... ^. ..3..s. [Snip]
  | | | 76) Tag9402 (sous-répertoire) ->
  | | | + [Répertoire BinaryData, 400 octets]
  | | | | Température ambiante = 21
  | | | | FocusMode = 2
  | | | | AFAreaMode = 1
  | | | | FocusPosition2 = 202
  | | | 77) Tag9403 (sous-répertoire) ->
  | | | + [Répertoire BinaryData, 1000 octets]
  | | | 78) Tag9404b (sous-répertoire) ->
  | | | + [Répertoire BinaryData, 556 octets]
  | | | | LensZoomPosition = 27
  | | | 79) Tag9405b (sous-répertoire) ->
  | | | + [Répertoire BinaryData, 1992 octets]
  | | | | SonyISO = 4096
  | | | | BaseISO = 4096
  | | | | StopsAboveBaseISO = 4096
  | | | | SonyExposureTime2 = 6208
  | | | | ExposureTime = 0,003125
  | | | | SonyFNumber = 5888
  | | | | SonyMaxApertureValue = 5054
  | | | | SequenceImageNumber = 0
  | | | | ReleaseMode2 = 0
  | | | | HighISONoiseReduction = 2
  | | | | LongExposureNoiseReduction = 1
  | | | | PictureEffect2 = 0
  | | | | Programme d'exposition = 1
  | | | | CreativeStyle = 0
  | | | | Netteté = 0
  | | | | DistortionCorrection = 0
  | | | | LensFormat = 1
  | | | | LensMount = 2
  | | | | LensType2 = 32787
  | | | | LensZoomPosition = 27
  | | | 80) Tag9406 (sous-répertoire) ->
  | | | + [Répertoire BinaryData, 64 octets]
  | | | | BatterieTempérature = 87
  | | | | BatteryLevel = 55
  | | | 81) Sony_0x9407 = .2WW. ^ .... AT..W ..>. WSi ... lw ... W ............. T..i .... ... T .... Wl
  | | | 82) Sony_0x9408 = i .... * ...... \ ... * ..} ...... u} .. C. = .. @. [. 8k. & ... | ...... C ^ .. pp .. [snip]
  | | | 83) Sony_0x9409 =. ... l. (.... I ......... `... s .......... i7. @. Sp ......> ... ..... @ .......... z ...% ...>. [snip]
  | | | 86) Tag940c (sous-répertoire) ->
  | | | + [Répertoire BinaryData, 64 octets]
  | | | | LensMount2 = 4
  | | | | LensType3 = 32787
  | | | | CameraE-mountVersion = 336
  | | | | LensE-mountVersion = 263
  | | | | LensFirmwareVersion = 1
  | | | 87) Sony_0x940d = ...... g ...... z ...? .. u ............. GO.D ..... qUx ... ? .... el .... 8 [snip]
  | | | 88) Tag940e (sous-répertoire) ->
  | | | + [Répertoire BinaryData, 12288 octets]
  | | | 89) Sony_0xa100 =
  | | | 90) Tag2010g (sous-répertoire) ->
  | | | + [Répertoire BinaryData, 6556 octets]
  | | | | ReleaseMode2 = 0
  | | | | DynamicRangeOptimizer = 1
  | | | | ReleaseMode3 = 0
  | | | | ReleaseMode2 = 0
  | | | | FlashMode = 1
  | | | | StopsAboveBaseISO = 4096
  | | | | BrightnessValue = 17245
  | | | | DynamicRangeOptimizer = 1
  | | | | HDRSetting = 0
  | | | | ExposureCompensation = 0
  | | | | PictureProfile = 0
  | | | | PictureProfile = 0
  | | | | PictureEffect2 = 0
  | | | | Qualité2 = 0
  | | | | MeteringMode = 0
  | | | | Programme d'exposition = 1
  | | | | WB_RGBLevels = 690 256 427
  | | | | FocalLength = 180
  | | | | MinFocalLength = 180
  | | | | MaxFocalLength = 2000
  | | | | SonyISO = 4096
  | | | | LensFormat = 1
  | | | | LensMount = 2
  | | | | LensType2 = 32787
  | | | 91) Sony_0x940f = liVi. $ ........) .... @ .. f ......... & .... @ ... Y @) .. Y @. @...........[couper]
  | | | 92) Tag9050 (sous-répertoire) ->
  | | | + [Répertoire BinaryData, 944 octets]
  | | | | FlashStatus = 64
  | | | | ImageCount = 3836
  | | | | SonyFNumber = 5888
  | | | | ReleaseMode2 = 0
  | | | | ImageCount2 = 3836
  | | | | SonyDateTime2 = .... #.
  | | | | ReleaseMode2 = 0
  | | | | InternalSerialNumber = 162 254 226 13
  | | | | LensMount = 2
  | | | | LensFormat = 1
  | | | | LensType2 = 32787
  | | | | LensSpecFeatures =.
  | | | | ImageCount3 = 44765
  | | | 93) Sony_0x9412 = ... @. V ........................................ ...............[couper]
  | | 19) UserComment =
  | | 20) FlashpixVersion = 0100
  | | 21) ColorSpace = 1
  | | 22) ExifImageWidth = 6000
  | | 23) ExifImageHeight = 4000
  | | 24) InteropOffset (sous-répertoire) ->
  | | + [Répertoire InteropIFD avec 2 entrées]
  | | | 0) InteropIndex = R98
  | | | 1) InteropVersion = 0100
  | | 25) FileSource = 3
  | | 26) SceneType = 1
  | | 27) CustomRendered = 0
  | | 28) ExposureMode = 0
  | | 29) WhiteBalance = 0
  | | 30) DigitalZoomRatio = 1 (16/16)
  | | 31) FocalLengthIn35mmFormat = 27
  | | 32) SceneCaptureType = 0
  | | 33) Contraste = 0
  | | 34) Saturation = 0
  | | 35) Netteté = 0
  | | 36) LensInfo = 18 200 3,5 6,3 (180/10 2000/10 35/10 63/10)
  | | 37) LensModel = E 18-200mm F3.5-6.3 OSS
  | 12) PrintIM (sous-répertoire) ->
  | + [Répertoire PrintIM avec 3 entrées]
  | | PrintIMVersion = 0300
  | | 0) PrintIM_0x0002 = 1
  | | 1) PrintIM_0x0003 = 34
  | | 2) PrintIM_0x0101 = 0
  + [Répertoire IFD1 avec 13 entrées]
  | 0) Compression = 6
  | 1) ImageDescription =                                
  | 2) Marque = SONY
  | 3) Modèle = ILCE-6000
  | 4) Orientation = 1
  | 5) XResolution = 72 (72/1)
  | 6) Résolution Y = 72 (72/1)
  | 7) ResolutionUnit = 2
  | 8) Logiciel = ILCE-6000 v3.20
  | 9) ModifyDate = 2018: 05: 11 08:35:11
  | 10) ThumbnailOffset = 38476
  | 11) ThumbnailLength = 6426
  | 12) YCbCrPositioning = 2
JPEG APP1 (2825 octets):
  + [Répertoire XMP, 2796 octets]
  | XMPToolkit = XMP Core 4.4.0-Exiv2
  | Logiciel = digiKam-5.6.0
  | CreatorTool = digiKam-5.6.0
  | Légende = Monument national du Grand Canyon-Parashant, le long de Clayhole Road
  | Titre = Monument national du Grand Canyon-Parashant, le long de Clayhole Road
JPEG APP13 (126 octets):
  + [Répertoire Photoshop, 112 octets]
  | IPTCData (sous-répertoire) ->
  | + [Répertoire IPTC, 99 octets]
  | | CurrentIPTCDigest = ~ .g..z .... 3P} R ..
  | | - Enregistrement IPTCEnvelope -
  | | CodedCharacterSet =.% G
  | | - Enregistrement IPTCApplication -
  | | OriginatingProgram = digiKam
  | | ProgramVersion = 5.6.0
  | | ObjectName = Grand Canyon-Parashant National Monument, le long du Clayhole Roa
JPEG APP2 (156 octets):
  + [Répertoire MPF0 avec 3 entrées]
  | 0) MPFVersion = 0100
  | 1) NumberOfImages = 2
  | 2) MPImageList (sous-répertoire) ->
  | + [Répertoire BinaryData, 16 octets]
  | | MPImageFlags = 2684354560
  | | MPImageFormat = 0
  | | MPImageType = 196608
  | | MPImageLength = 8768466
  | | MPImageStart = 0
  | | DependentImage1EntryNumber = 2
  | | DependentImage2EntryNumber = 0
  | + [Répertoire BinaryData, 16 octets]
  | | MPImageFlags = 1073741824
  | | MPImageFormat = 0
  | | MPImageType = 65538
  | | MPImageLength = 664145
  | | MPImageStart = 8724632
  | | DependentImage1EntryNumber = 0
  | | DependentImage2EntryNumber = 0
JPEG DQT (130 octets):
JPEG DHT (416 octets):
JPEG SOF0 (15 octets):
  ImageWidth = 6000
  ImageHeight = 4000
  EncodingProcess = 0
  BitsPerSample = 8
  ColorComponents = 3
JPEG SOS
  Warning = [mineur] Erreur lors de la lecture de PreviewImage
  PreviewImage = SCALAIRE (0x19b5ab8)

Quels outils existent pour éliminer automatiquement et numériquement la poussière du capteur d'une grande série de photos? J'ai des centaines de photos affectées (essentiellement tout ce qui a été pris à F / 8 ou moins). C'est plus évident lorsque la région affectée est dans le ciel, donc une solution qui fonctionne uniquement pour le ciel est satisfaisante. En supposant que la poussière ne se déplace pas trop loin, il devrait être possible d'utiliser une sorte de technique d'appariement pour calculer un nouveau masque pour chaque photo, avant de l'appliquer à l'aide de l'inpainting ou d'une autre méthode. Bien que simple en théorie, sa mise en œuvre peut être assez laborieuse dans la pratique - et je ne suis même pas sûr que la peinture soit une bonne solution.

À moins de réparer manuellement chaque photo (cela prend 4 minutes de temps de calcul seul sur mon ancien bureau), quels outils existent pour réparer toute ma série de photos (ou au moins celles prises à F / 8 ou moins avec du ciel dans les zones touchées) ?

Je travaille sur Linux et ma boîte à outils habituelle se compose de digikam, darktable, gimp et Python. L'appareil photo est un tout nouveau Sony A6000 (appareil photo sans miroir / compact). Certaines photos sont prises avec un objectif Sony 18–200 mm OSS, d'autres avec un objectif manuel Samyang 12 mm.

gerrit
la source
1
Oh mec - un autre travail pour ML!
Veuillez lire mon profil le
1
@mattdm ML = Apprentissage automatique? Je suppose que oui!
gerrit
3
Ouais. Je pense qu'il est temps de commencer un pool de paris pour savoir quand ce site fusionnera avec ai.stackexchange.com :)
Veuillez lire mon profil
@xiota, j'ai modifié la question: Sony A6000; Je suis assez certain que c'est de la poussière de capteur car elle s'est accumulée pendant les vacances, était visible avec une loupe et a disparu après un nettoyage professionnel du capteur. Je suppose que c'est la poussière qui se déplace par rapport au capteur, mais je n'ai jamais entendu parler d'IBIS auparavant. Une plaque transparente devant le capteur qui peut se déplacer de 50 à 100 µm?
gerrit
@xiota Je suis nouveau align_image_stack- je vais voir si cela peut m'aider!
gerrit

Réponses:

3

Quelque chose comme ça n'a actuellement aucune solution technique - je suppose que vous devez le faire manuellement ou attendre une solution soutenue par AI / ML.

Cela étant dit, vous pourriez obtenir un certain succès avec cet outil:

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

Il en coûte 49 $.

Andreas Hartmann
la source
2
J'ai fini par le faire manuellement (avec darktable), cela a pris beaucoup de temps mais j'ai eu un bon aperçu détaillé de nombreuses photos de vacances!
gerrit