Como posso remover automaticamente manchas de poeira do sensor de deslocamento de uma grande série de fotos?

8

Enquanto estava no deserto, meu sensor ficou empoeirado. Fiquei semanas fora e não notei isso até o final da minha viagem, por isso tenho centenas de fotos com sujeira no sensor. Durante as férias, a poeira piorou gradualmente à medida que eu trocava as lentes com frequência. Depois das minhas férias, limpei o sensor profissionalmente e as novas fotos não têm manchas, mas estou procurando uma solução para as fotos das férias.

Para limpar minhas fotos, usei o Gimp para produzir uma máscara dos locais dos piores pedaços de poeira:

piores locais de poeira

em seguida, usou o gmic para removê-los da linha de comando:

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

Embora essa não seja uma solução ideal, porque essencialmente recompõe essas áreas do zero (sem usar as informações de segundo plano), fornece resultados satisfatórios no céu azul. Imaginei que dessa maneira, eu poderia automatizar o processo através das centenas de imagens afetadas. Infelizmente, a poeira não é estacionária, portanto isso não funciona. Ele muda na ordem de 20 pixels, o que corresponde a cerca de 80 µm. Não sei se isso se deve à poeira fisicamente deslocada ou se pode ser devido ao processamento de imagens na câmera, como estabilização de imagem ou correção de lente. Tirei algumas imagens em bruto e JPEG e, para essas imagens, vejo visualmente uma ligeira mudança no formato da imagem.

É muito sutil, mas se você comparar as duas imagens a seguir, a maior e mais proeminente poeira passou de centralizada no pixel (1677, 619)para centralizada no pixel (1655, 603). Por outro lado, um pixel menos proeminente à direita passou de (4919, 1485)para (4940, 1483). Talvez não deva surpreender que pedaços de poeira possam se deslocar em relação ao sensor?

Imagem 1 com poeira no céu

Imagem 2 com poeira no céu

As fotos são tiradas com aproximadamente 90 minutos de intervalo. As imagens que publiquei foram reduzidas por um fator 2.

Os dados EXIF ​​incluem dados da Sony Makernote, que podem incluir informações sobre estabilização de imagem, como ImageStabilization = 1. Não sei se inclui mais detalhes sobre a estabilização de imagem. Ele inclui um campo Sony_0x201f = 128 17 2 0que parece variar entre as imagens, mas é idêntico entre as duas imagens mostradas acima, portanto, não identifica (exclusivamente) as informações para corrigir a estabilização da imagem. Não sei se existe outro campo. Os dados exif completos (conforme relatado por exiftool -v) para uma imagem mostram:

  ExifToolVersion = 10.10
  FileName = 08-35-11.jpg
  Diretório =.
  FileSize = 9440161
  FileModifyDate = 1528067625
  FileAccessDate = 1529519016
  FileInodeChangeDate = 1528150970
  FilePermissions = 33204
  FileType = JPEG
  FileTypeExtension = JPG
  MIMEType = imagem / jpeg
JPEG APP1 (44908 bytes):
  ExifByteOrder = II
  + [Diretório IFD0 com 13 entradas]
  | 0) ProcessingSoftware = digiKam-5.6.0
  | 1) ImageDescription =                                
  | 2) Marca = SONY
  | 3) Modelo = ILCE-6000
  | 4) Orientação = 1
  | 5) XResolução = 350 (350/1)
  | 6) Resolução Y = 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 (SubDirectory) ->
  | + [Diretório ExifIFD com 38 entradas]
  | | 0) ExposureTime = 0.003125 (1/320)
  | | 1) FNumber = 11 (110/10)
  | | 2) Programa de Exposição = 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) ExposureCompensation = 0 (0/10)
  | | 13) MaxApertureValue = 3.6171875 (926/256)
  | | 14) MeteringMode = 5
  | | 15) Fonte de luz = 0
  | | 16) Flash = 16
  | | 17) Comprimento focal = 18 (180/10)
  | | 18) MakerNoteSony (subdiretório) ->
  | | + [Diretório MakerNotes com 94 entradas]
  | | | 0) Sony_0x1003 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  | | | 1) Sony_0x2000 = 0
  | | | 2) PreviewImage =
  | | | 3) Classificação = 0
  | | | 4) Sony_0x2003 =
  | | | 5) Contraste = 0
  | | | 6) Saturação = 0
  | | | 7) Nitidez = 0
  | | | 8) Brilho = 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 (subdiretório) ->
  | | | + [Diretório BinaryData, 390 bytes]
  | | | | FaceInfoOffset = 94
  | | | | SonyDateTime = 2018: 05: 11 08:35:11
  | | | | SonyImageHeight = 4000
  | | | | SonyImageWidth = 6000
  | | | | FacesDetected = 0
  | | | | FaceInfoLength = 37
  | | | | MetaVersion = DC7303320222000
  | | | 16) CreativeStyle = Padrão
  | | | 17) ColorTemperature = 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) Qualidade = 2
  | | | 28) FlashExposureComp = 0 (0/10)
  | | | 29) WhiteBalanceFineTune = 0
  | | | 30) WhiteBalance = 0
  | | | 31) SonyModelID = 312
  | | | 32) Teleconversor = 0
  | | | 33) MultiFrameNoiseReduction = 0
  | | | 34) PictureEffect = 0
  | | | 35) SoftSkinEffect = 0
  | | | 36) VignettingCorrection = 2
  | | | 37) LateralChromaticAberration = 2
  | | | 38) DistortionCorrectionSetting = 0
  | | | 39) Sony_0x2015 = 65535
  | | | 40) Tipo de lente = 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
  | | | 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-desfocagem = 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 (subdiretório) ->
  | | | + [Diretório BinaryData, 556 bytes]
  | | | | ReleaseMode2 = 0
  | | | | ShotNumberSincePowerUp = 2
  | | | | SequenceImageNumber = 0
  | | | | SequenceLength = 1
  | | | | SequenceFileNumber = 0
  | | | | SequenceLength = 1
  | | | | CameraOrientation = 1
  | | | | Qualidade2 = 0
  | | | | SonyImageHeight = 500
  | | | | ModelReleaseYear = 14
  | | | 75) Sony_0x9401 = ..f .... pW ..). 6Q. \. (. GG..6 \ 6.GG..6 \ 6 .. $ .......... ^. ..3..s. [Snip]
  | | | 76) Tag9402 (subdiretório) ->
  | | | + [Diretório BinaryData, 400 bytes]
  | | | | AmbientTemperature = 21
  | | | | FocusMode = 2
  | | | | AFAreaMode = 1
  | | | | FocusPosition2 = 202
  | | | 77) Tag9403 (subdiretório) ->
  | | | + [Diretório BinaryData, 1000 bytes]
  | | | 78) Tag9404b (subdiretório) ->
  | | | + [Diretório BinaryData, 556 bytes]
  | | | | LensZoomPosition = 27
  | | | 79) Tag9405b (subdiretório) ->
  | | | + [Diretório BinaryData, 1992 bytes]
  | | | | 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
  | | | | ExposureProgram = 1
  | | | | CreativeStyle = 0
  | | | | Nitidez = 0
  | | | | DistortionCorrection = 0
  | | | | LensFormat = 1
  | | | | LensMount = 2
  | | | | LensType2 = 32787
  | | | | LensZoomPosition = 27
  | | | 80) Tag9406 (subdiretório) ->
  | | | + [Diretório BinaryData, 64 bytes]
  | | | | BatteryTemperature = 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. (.... eu ......... `s .......... i7. @. Sp ......> ... ..... @ .......... z ...% ...>.
  | | | 86) Tag940c (subdiretório) ->
  | | | + [Diretório BinaryData, 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 (subdiretório) ->
  | | | + [Diretório BinaryData, 12288 bytes]
  | | | 89) Sony_0xa100 =
  | | | 90) Tag2010g (subdiretório) ->
  | | | + [Diretório BinaryData, 6556 bytes]
  | | | | 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
  | | | | Qualidade2 = 0
  | | | | MeteringMode = 0
  | | | | ExposureProgram = 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 @. @...........[recorte]
  | | | 92) Tag9050 (subdiretório) ->
  | | | + [Diretório BinaryData, 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 ........................................ ...............[recorte]
  | | 19) Comentário do Usuário =
  | | 20) FlashpixVersion = 0100
  | | 21) ColorSpace = 1
  | | 22) ExifImageWidth = 6000
  | | 23) ExifImageHeight = 4000
  | | 24) InteropOffset (SubDirectory) ->
  | | + [Diretório InteropIFD com 2 entradas]
  | | | 0) InteropIndex = R98
  | | | 1) InteropVersion = 0100
  | | 25) Origem do arquivo = 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) Saturação = 0
  | | 35) Nitidez = 0
  | | 36) LensInfo = 18 200 3,5 6,3 (180/10 2000/10 35/10 63/10)
  | | 37) Modelo da lente = E 18-200mm F3.5-6.3 OSS
  | 12) PrintIM (SubDirectory) ->
  | + [Diretório PrintIM com 3 entradas]
  | | PrintIMVersion = 0300
  | | 0) PrintIM_0x0002 = 1
  | | 1) PrintIM_0x0003 = 34
  | | 2) PrintIM_0x0101 = 0
  + [Diretório IFD1 com 13 entradas]
  | 0) Compressão = 6
  | 1) ImageDescription =                                
  | 2) Marca = SONY
  | 3) Modelo = ILCE-6000
  | 4) Orientação = 1
  | 5) Resolução X = 72 (72/1)
  | 6) Resolução Y = 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 bytes):
  + [Diretório XMP, 2796 bytes]
  | XMPToolkit = XMP Core 4.4.0-Exiv2
  | Software = digiKam-5.6.0
  | Ferramenta de criação = digiKam-5.6.0
  | Legenda = Monumento Nacional Grand Canyon-Parashant, ao longo da Estrada Clayhole
  | Título = Monumento Nacional Grand Canyon-Parashant, ao longo da Estrada Clayhole
JPEG APP13 (126 bytes):
  + [Diretório do Photoshop, 112 bytes]
  | IPTCData (subdiretório) ->
  | + [Diretório IPTC, 99 bytes]
  | | CurrentIPTCDigest = ~ .g..z .... 3P} R ..
  | | - Registro IPTCEnvelope -
  | | CodedCharacterSet =.% G
  | | - Registro IPTCApplication -
  | | OriginatingProgram = digiKam
  | | ProgramVersion = 5.6.0
  | | ObjectName = Monumento Nacional Parashant do Grand Canyon, ao longo da Roa de Clayhole
JPEG APP2 (156 bytes):
  + [Diretório MPF0 com 3 entradas]
  | 0) MPFVersion = 0100
  | 1) NumberOfImages = 2
  | 2) MPImageList (subdiretório) ->
  | + [Diretório BinaryData, 16 bytes]
  | | MPImageFlags = 2684354560
  | | MPImageFormat = 0
  | | MPImageType = 196608
  | | MPImageLength = 8768466
  | | MPImageStart = 0
  | | DependentImage1EntryNumber = 2
  | | DependentImage2EntryNumber = 0
  | + [Diretório BinaryData, 16 bytes]
  | | MPImageFlags = 1073741824
  | | MPImageFormat = 0
  | | MPImageType = 65538
  | | MPImageLength = 664145
  | | MPImageStart = 8724632
  | | DependentImage1EntryNumber = 0
  | | DependentImage2EntryNumber = 0
DQT JPEG (130 bytes):
JPEG DHT (416 bytes):
SOF0 JPEG (15 bytes):
  ImageWidth = 6000
  ImageHeight = 4000
  EncodingProcess = 0
  BitsPerSample = 8
  ColorComponents = 3
JPEG SOS
  Aviso = [menor] Erro ao ler PreviewImage
  PreviewImage = SCALAR (0x19b5ab8)

Quais ferramentas existem para remover digitalmente automaticamente a poeira do sensor de uma grande série de fotos? Tenho centenas de fotos afetadas (essencialmente qualquer coisa tirada em F / 8 ou menor). É mais óbvio quando a região afetada está no céu; portanto, uma solução que funciona apenas para o céu é satisfatória. Supondo que o pó não se mova muito longe, deve ser possível usar algum tipo de técnica de correspondência para calcular uma nova máscara para cada foto, antes de aplicá-la usando tinta ou outro método. Embora seja simples na teoria, implementar isso pode ser bastante trabalhoso na prática - e nem tenho certeza se a pintura é uma boa solução.

Além de reparar manualmente cada foto (leva 4 minutos de tempo de cálculo sozinho na minha área de trabalho antiga), quais ferramentas existem para reparar toda a minha série de fotos (ou pelo menos as que foram tiradas em F / 8 ou menor com céu nas áreas afetadas) ?

Eu trabalho no Linux e meu kit de ferramentas usual consiste em digikam, darktable, gimp e Python. A câmera é uma Sony A6000 relativamente nova (câmera sem espelho / compacta). Algumas fotos são tiradas com uma lente OSS Sony 18–200 mm, outras com uma lente manual Samyang 12 mm.

gerrit
fonte
1
Oh cara - outro trabalho para ML!
Por favor, leia meu perfil
1
@mattdm ML = Aprendizado de máquina? Suponho que sim!
gerrit
3
Sim. Eu estou pensando que é hora de começar um pool de apostas para quando este site se fundirá em ai.stackexchange.com :)
Por favor, leia meu perfil
@xiota Eu editei a pergunta: Sony A6000; Estou bastante certo de que é poeira do sensor porque se acumulou durante as férias, ficou visível com uma lupa e desapareceu após a limpeza profissional do sensor. Suponho que seja a poeira se movendo em relação ao sensor, mas nunca ouvi falar do IBIS antes. Alguma placa transparente na frente do sensor que pode mudar de 50 a 100 µm?
Gerrit
@xiota Sou novo align_image_stack- vou ver se isso pode me ajudar!
gerrit

Respostas:

3

Algo assim atualmente não tem solução técnica - acho que você precisa fazer isso manualmente ou aguardar uma solução com suporte de AI / ML.

Com isso dito, você pode obter algum sucesso com esta ferramenta:

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

Custa 49 $.

Andreas Hartmann
fonte
2
Acabei fazendo isso manualmente (com mesa escura), demorou muito tempo, mas consegui uma boa e detalhada olhada em muitas fotos de férias!
Gerrit #