Wie kann ich automatisch Staubflecken von Schaltsensoren aus einer großen Fotoserie digital entfernen?

8

In der Wüste wurde mein Sensor staubig. Ich war wochenlang unterwegs und habe dies erst am Ende meiner Reise bemerkt, daher habe ich Hunderte von Fotos mit Sensorschmutz. Während des Urlaubs wurde der Staub allmählich schlimmer, da ich häufig die Linsen wechselte. Nach meinem Urlaub ließ ich den Sensor professionell reinigen und neue Fotos haben keine Flecken, aber ich suche nach einer Lösung für die Urlaubsfotos.

Um meine Fotos zu bereinigen, habe ich The Gimp verwendet, um eine Maske der Orte der schlimmsten Staubstücke zu erstellen:

schlimmste Staubstellen

Verwenden Sie dann gmic, um sie von der Befehlszeile zu entfernen:

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

Dies ist zwar keine optimale Lösung, da diese Bereiche im Wesentlichen von Grund auf neu gestrichen werden (ohne Verwendung der Hintergrundinformationen), liefert jedoch zufriedenstellende Ergebnisse bei blauem Himmel. Ich dachte mir, dass ich auf diese Weise den Prozess über die Hunderte von betroffenen Bildern automatisieren könnte. Leider ist der Staub nicht stationär, so dass dies nicht funktioniert. Es verschiebt sich um die Größenordnung von 20 Pixeln, was ungefähr 80 um entspricht. Ich weiß nicht, ob dies darauf zurückzuführen ist, dass sich der Staub physisch bewegt, oder ob dies auf eine Bildverarbeitung in der Kamera wie Bildstabilisierung oder Objektivkorrektur zurückzuführen ist. Ich habe einige Bilder sowohl im Roh- als auch im JPEG-Format aufgenommen, und für diese Bilder kann ich visuell eine leichte Verschiebung in der Form des Bildes erkennen.

Es ist sehr subtil, aber wenn Sie die folgenden zwei Bilder vergleichen, hat sich das größte und auffälligste Staubstück von einer auf Pixel (1677, 619)zentrierten zu einer auf Pixel zentrierten verschoben (1655, 603). Am anderen Ende hat sich ein weniger markantes Pixel rechts von (4919, 1485)nach verschoben (4940, 1483). Vielleicht sollte es nicht allzu überraschend sein, dass sich Staubstücke relativ zum Sensor verschieben können und tun?

Bild 1 mit Staub am Himmel

Bild 2 mit Staub am Himmel

Die Fotos werden im Abstand von ca. 90 Minuten aufgenommen. Die von mir geposteten Bilder werden um den Faktor 2 heruntergerechnet.

Die EXIF-Daten enthalten Sony Makernote-Daten, die Informationen zur Bildstabilisierung enthalten können, wie z ImageStabilization = 1. Ich weiß nicht, ob es weitere Details zur Bildstabilisierung enthält. Es enthält ein Feld Sony_0x201f = 128 17 2 0, das zwischen den Bildern zu variieren scheint, zwischen den beiden oben gezeigten Bildern jedoch identisch ist, sodass Informationen, die zur Korrektur der Bildstabilisierung korrigiert werden sollen, nicht (eindeutig) identifiziert werden. Ich weiß nicht, ob es ein anderes Feld gibt. Die vollständigen Exif-Daten (wie von gemeldet exiftool -v) für ein Bild zeigen:

  ExifToolVersion = 10.10
  FileName = 08-35-11.jpg
  Verzeichnis =.
  FileSize = 9440161
  FileModifyDate = 1528067625
  FileAccessDate = 1529519016
  FileInodeChangeDate = 1528150970
  FilePermissions = 33204
  FileType = JPEG
  FileTypeExtension = JPG
  MIMEType = image / jpeg
JPEG APP1 (44908 Byte):
  ExifByteOrder = II
  + [IFD0-Verzeichnis mit 13 Einträgen]
  | 0) ProcessingSoftware = digiKam-5.6.0
  | 1) ImageDescription =                                
  | 2) Make = SONY
  | 3) Modell = ILCE-6000
  | 4) Orientierung = 1
  | 5) XResolution = 350 (350/1)
  | 6) YResolution = 350 (350/1)
  | 7) ResolutionUnit = 2
  | 8) Software = ILCE-6000 v3.20
  | 9) ModifyDate = 2018: 05: 11 08:35:11
  | 10) YCbCrPositioning = 2
  | 11) ExifOffset (Unterverzeichnis) ->
  | + [ExifIFD-Verzeichnis mit 38 Einträgen]
  | | 0) ExposureTime = 0,003125 (1/320)
  | | 1) FNumber = 11 (110/10)
  | | 2) ExposureProgram = 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) Komponentenkonfiguration = 1 2 3 0
  | | 10) CompressedBitsPerPixel = 3 (3/1)
  | | 11) Helligkeitswert = 10,76328125 (27554/2560)
  | | 12) ExposureCompensation = 0 (0/10)
  | | 13) MaxApertureValue = 3,6171875 (926/256)
  | | 14) Messmodus = 5
  | | 15) Lichtquelle = 0
  | | 16) Flash = 16
  | | 17) FocalLength = 18 (180/10)
  | | 18) MakerNoteSony (Unterverzeichnis) ->
  | | + [MakerNotes-Verzeichnis mit 94 Einträgen]
  | | | 0) Sony_0x1003 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  | | | 1) Sony_0x2000 = 0
  | | | 2) PreviewImage =
  | | | 3) Bewertung = 0
  | | | 4) Sony_0x2003 =
  | | | 5) Kontrast = 0
  | | | 6) Sättigung = 0
  | | | 7) Schärfe = 0
  | | | 8) Helligkeit = 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 (Unterverzeichnis) ->
  | | | + [BinaryData-Verzeichnis, 390 Byte]
  | | | | FaceInfoOffset = 94
  | | | | SonyDateTime = 2018: 05: 11 08:35:11
  | | | | SonyImageHeight = 4000
  | | | | SonyImageWidth = 6000
  | | | | FacesDetected = 0
  | | | | FaceInfoLength = 37
  | | | | MetaVersion = DC7303320222000
  | | | 16) CreativeStyle = Standard
  | | | 17) Farbtemperatur = 0
  | | | 18) ColorCompensationFilter = 0
  | | | 19) SceneMode = 0
  | | | 20) ZoneMatching = 0
  | | | 21) DynamicRangeOptimizer = 3
  | | | 22) ImageStabilization = 1
  | | | 23) ColorMode = 0
  | | | 24) FullImageSize = 4000 6000
  | | | 25) PreviewImageSize = 1080 1616
  | | | 26) FileFormat = 3 3 1 0
  | | | 27) Qualität = 2
  | | | 28) FlashExposureComp = 0 (0/10)
  | | | 29) WhiteBalanceFineTune = 0
  | | | 30) WhiteBalance = 0
  | | | 31) SonyModelID = 312
  | | | 32) Telekonverter = 0
  | | | 33) MultiFrameNoiseReduction = 0
  | | | 34) PictureEffect = 0
  | | | 35) SoftSkinEffect = 0
  | | | 36) Vignettierungskorrektur = 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 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 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-Unschärfe = 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 (Unterverzeichnis) ->
  | | | + [BinaryData-Verzeichnis, 556 Bytes]
  | | | | ReleaseMode2 = 0
  | | | | ShotNumberSincePowerUp = 2
  | | | | SequenceImageNumber = 0
  | | | | SequenceLength = 1
  | | | | SequenceFileNumber = 0
  | | | | SequenceLength = 1
  | | | | CameraOrientation = 1
  | | | | Qualität2 = 0
  | | | | SonyImageHeight = 500
  | | | | ModelReleaseYear = 14
  | | | 75) Sony_0x9401 = ..f .... pW ..). 6Q. \. (. GG..6 \ 6.GG..6 \ 6 .. $ .......... ^. ..3..s. [Snip]
  | | | 76) Tag9402 (Unterverzeichnis) ->
  | | | + [BinaryData-Verzeichnis, 400 Byte]
  | | | | Umgebungstemperatur = 21
  | | | | FocusMode = 2
  | | | | AFAreaMode = 1
  | | | | FocusPosition2 = 202
  | | | 77) Tag9403 (Unterverzeichnis) ->
  | | | + [BinaryData-Verzeichnis, 1000 Bytes]
  | | | 78) Tag9404b (Unterverzeichnis) ->
  | | | + [BinaryData-Verzeichnis, 556 Bytes]
  | | | | LensZoomPosition = 27
  | | | 79) Tag9405b (Unterverzeichnis) ->
  | | | + [BinaryData-Verzeichnis, 1992 Bytes]
  | | | | Sony ISO = 4096
  | | | | BaseISO = 4096
  | | | | StopsAboveBaseISO = 4096
  | | | | SonyExposureTime2 = 6208
  | | | | ExposureTime = 0,003125
  | | | | SonyFNumber = 5888
  | | | | SonyMaxApertureValue = 5054
  | | | | SequenceImageNumber = 0
  | | | | ReleaseMode2 = 0
  | | | | HighISONoiseReduction = 2
  | | | | LongExposureNoiseReduction = 1
  | | | | PictureEffect2 = 0
  | | | | ExposureProgram = 1
  | | | | CreativeStyle = 0
  | | | | Schärfe = 0
  | | | | DistortionCorrection = 0
  | | | | LensFormat = 1
  | | | | LensMount = 2
  | | | | LensType2 = 32787
  | | | | LensZoomPosition = 27
  | | | 80) Tag9406 (Unterverzeichnis) ->
  | | | + [BinaryData-Verzeichnis, 64 Bytes]
  | | | | Batterietemperatur = 87
  | | | | Batterielevel = 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 (Unterverzeichnis) ->
  | | | + [BinaryData-Verzeichnis, 64 Bytes]
  | | | | 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 (Unterverzeichnis) ->
  | | | + [BinaryData-Verzeichnis, 12288 Byte]
  | | | 89) Sony_0xa100 =
  | | | 90) Tag2010g (Unterverzeichnis) ->
  | | | + [BinaryData-Verzeichnis, 6556 Byte]
  | | | | 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ät2 = 0
  | | | | Messmodus = 0
  | | | | ExposureProgram = 1
  | | | | WB_RGBLevels = 690 256 427
  | | | | Brennweite = 180
  | | | | MinFocalLength = 180
  | | | | MaxFocalLength = 2000
  | | | | Sony ISO = 4096
  | | | | LensFormat = 1
  | | | | LensMount = 2
  | | | | LensType2 = 32787
  | | | 91) Sony_0x940f = liVi. $ ........) .... @ .. f ......... & .... @ ... Y @) .. Y @. @ ........... [snip]
  | | | 92) Tag9050 (Unterverzeichnis) ->
  | | | + [BinaryData-Verzeichnis, 944 Bytes]
  | | | | 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 ........................................ ............... [snip]
  | | 19) UserComment =
  | | 20) FlashpixVersion = 0100
  | | 21) ColorSpace = 1
  | | 22) ExifImageWidth = 6000
  | | 23) ExifImageHeight = 4000
  | | 24) InteropOffset (Unterverzeichnis) ->
  | | + [InteropIFD-Verzeichnis mit 2 Einträgen]
  | | | 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) Kontrast = 0
  | | 34) Sättigung = 0
  | | 35) Schärfe = 0
  | | 36) LensInfo = 18 200 3,5 6,3 (180/10 2000/10 35/10 63/10)
  | | 37) LensModel = E 18-200 mm F3.5-6.3 OSS
  | 12) PrintIM (Unterverzeichnis) ->
  | + [PrintIM-Verzeichnis mit 3 Einträgen]
  | | PrintIMVersion = 0300
  | | 0) PrintIM_0x0002 = 1
  | | 1) PrintIM_0x0003 = 34
  | | 2) PrintIM_0x0101 = 0
  + [IFD1-Verzeichnis mit 13 Einträgen]
  | 0) Komprimierung = 6
  | 1) ImageDescription =                                
  | 2) Make = SONY
  | 3) Modell = ILCE-6000
  | 4) Orientierung = 1
  | 5) XResolution = 72 (72/1)
  | 6) YResolution = 72 (72/1)
  | 7) ResolutionUnit = 2
  | 8) Software = ILCE-6000 v3.20
  | 9) ModifyDate = 2018: 05: 11 08:35:11
  | 10) ThumbnailOffset = 38476
  | 11) ThumbnailLength = 6426
  | 12) YCbCrPositioning = 2
JPEG APP1 (2825 Byte):
  + [XMP-Verzeichnis, 2796 Bytes]
  | XMPToolkit = XMP Core 4.4.0-Exiv2
  | Software = digiKam-5.6.0
  | CreatorTool = digiKam-5.6.0
  | Bildunterschrift = Grand Canyon-Parashant National Monument entlang der Clayhole Road
  | Titel = Grand Canyon-Parashant National Monument entlang der Clayhole Road
JPEG APP13 (126 Bytes):
  + [Photoshop-Verzeichnis, 112 Bytes]
  | IPTCData (Unterverzeichnis) ->
  | + [IPTC-Verzeichnis, 99 Bytes]
  | | CurrentIPTCDigest = ~ .g..z .... 3P} R ..
  | | - IPTCEnvelope-Datensatz -
  | | CodedCharacterSet =.% G.
  | | - IPTCApplication-Datensatz -
  | | OriginatingProgram = digiKam
  | | ProgramVersion = 5.6.0
  | | ObjectName = Grand Canyon-Parashant National Monument entlang des Clayhole Roa
JPEG APP2 (156 Bytes):
  + [MPF0-Verzeichnis mit 3 Einträgen]
  | 0) MPFVersion = 0100
  | 1) NumberOfImages = 2
  | 2) MPImageList (Unterverzeichnis) ->
  | + [BinaryData-Verzeichnis, 16 Bytes]
  | | MPImageFlags = 2684354560
  | | MPImageFormat = 0
  | | MPImageType = 196608
  | | MPImageLength = 8768466
  | | MPImageStart = 0
  | | DependentImage1EntryNumber = 2
  | | DependentImage2EntryNumber = 0
  | + [BinaryData-Verzeichnis, 16 Bytes]
  | | MPImageFlags = 1073741824
  | | MPImageFormat = 0
  | | MPImageType = 65538
  | | MPImageLength = 664145
  | | MPImageStart = 8724632
  | | DependentImage1EntryNumber = 0
  | | DependentImage2EntryNumber = 0
JPEG DQT (130 Byte):
JPEG DHT (416 Bytes):
JPEG SOF0 (15 Bytes):
  ImageWidth = 6000
  ImageHeight = 4000
  EncodingProcess = 0
  BitsPerSample = 8
  ColorComponents = 3
JPEG SOS
  Warnung = [geringfügig] Fehler beim Lesen von PreviewImage
  PreviewImage = SCALAR (0x19b5ab8)

Welche Tools gibt es, um Sensorstaub aus einer großen Fotoserie automatisch digital zu entfernen? Ich habe Hunderte von betroffenen Fotos (im Wesentlichen alles, was mit F / 8 oder kleiner aufgenommen wurde). Es ist am offensichtlichsten, wenn sich die betroffene Region am Himmel befindet, sodass eine Lösung, die nur für den Himmel funktioniert, zufriedenstellend ist. Unter der Annahme, dass sich der Staub nicht zu weit bewegt , sollte es möglich sein, eine neue Maske zu verwenden, um für jedes Foto eine neue Maske zu berechnen, bevor Sie sie mit Inpainting oder einer anderen Methode anwenden. Obwohl dies theoretisch einfach ist, kann die Implementierung in der Praxis recht mühsam sein - und ich bin mir nicht einmal sicher, ob Inpainting eine gute Lösung ist.

Ohne jedes Foto manuell zu reparieren (es dauert allein auf meinem alten Desktop 4 Minuten Rechenzeit), welche Tools gibt es, um meine gesamte Fotoserie zu reparieren (oder zumindest diejenigen, die mit F / 8 oder kleiner mit Himmel in den betroffenen Bereichen aufgenommen wurden)? ?

Ich arbeite unter Linux und mein übliches Toolkit besteht aus Digikam, Darktable, Gimp und Python. Die Kamera ist eine ziemlich neue Sony A6000 (spiegellose / kompakte Systemkamera). Einige Fotos wurden mit einem Sony 18–200 mm OSS-Objektiv aufgenommen, andere mit einem manuellen Samyang 12 mm-Objektiv.

gerrit
quelle
1
Oh man - ein weiterer Job für ML!
Bitte lesen Sie mein Profil
1
@mattdm ML = Maschinelles Lernen? Ich nehme an, es ist!
Gerrit
3
Ja. Ich denke, es ist Zeit, einen Wettpool zu starten, wenn diese Seite in ai.stackexchange.com verschmilzt :)
Bitte lesen Sie mein Profil
@xiota Ich habe in die Frage bearbeitet: Sony A6000; Ich bin mir ziemlich sicher, dass es sich um Sensorstaub handelt, da er sich im Urlaub angesammelt hat, mit einer Lupe sichtbar war und nach professioneller Sensorreinigung verschwunden ist. Ich nehme an, es ist der Staub, der sich relativ zum Sensor bewegt, aber ich habe noch nie von IBIS gehört. Eine transparente Platte vor dem Sensor, die sich um 50–100 µm verschieben kann?
Gerrit
@xiota Ich bin neu in align_image_stack- ich werde sehen, ob es mir helfen kann!
Gerrit

Antworten:

3

So etwas hat derzeit keine technische Lösung - ich denke, Sie müssen es manuell tun oder auf eine AI / ML-gestützte Lösung warten.

Wenn dies gesagt wird, können Sie mit diesem Tool einige Erfolge erzielen:

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

Es kostet 49 $.

Andreas Hartmann
quelle
2
Am Ende habe ich es manuell gemacht (mit Darktable), es hat lange gedauert, aber ich habe mir viele Urlaubsfotos gut und detailliert angesehen!
Gerrit