Czy istnieje sposób, aby sprawdzić, czy jakieś 2 podane warstwy rastrowe mają identyczną zawartość ?
Mamy problem z wolumenem naszej wspólnej pamięci masowej w firmie: jest on teraz tak duży, że wykonanie pełnej kopii zapasowej zajmuje ponad 3 dni. Wstępne dochodzenie ujawnia, że jednym z największych zajmujących miejsce sprawców są rastry on / off, które naprawdę powinny być przechowywane jako warstwy 1-bitowe z kompresją CCITT.
Ten przykładowy obraz jest obecnie 2-bitowy (czyli 3 możliwe wartości) i zapisany jako skompresowany plik tiff LZW, 11 MB w systemie plików. Po konwersji na 1bit (czyli 2 możliwe wartości) i zastosowaniu kompresji CCITT Group 4, zmniejszamy ją do 1,3 MB, czyli prawie pełnego rzędu wielkości oszczędności.
(W rzeczywistości jest to bardzo dobrze wychowany obywatel, istnieją inne przechowywane jako 32-bitowe float!)
To fantastyczna wiadomość! Istnieje jednak prawie 7 000 zdjęć, które można zastosować. Łatwo byłoby napisać skrypt do ich skompresowania:
for old_img in [list of images]:
convert_to_1bit_and_compress(old_img)
remove(old_img)
replace_with_new(old_img, new_img)
... ale brakuje istotnego testu: czy nowo skompresowana wersja jest identyczna z treścią?
if raster_diff(old_img, new_img) == "Identical":
remove(old_img)
rename(new_img, old_img)
Czy istnieje narzędzie lub metoda, która może (nie) automatycznie udowodnić, że zawartość obrazu A jest identyczna z treścią obrazu B?
Mam dostęp do ArcGIS 10.2 i QGIS, ale jestem również otwarty na większość innych rzeczy, niż jest w stanie uniknąć konieczności ręcznego sprawdzania wszystkich tych obrazów w celu zapewnienia poprawności przed nadpisaniem. Byłoby straszne błędnie konwertować i nadpisać obraz, który naprawdę nie mają więcej niż on / off wartości w nim. Większość kosztuje tysiące dolarów na zebranie i wygenerowanie.
aktualizacja: największymi przestępcami są 32-bitowe zmiennoprzecinkowe o zasięgu do 100 000 pikseli na bok, więc ~ 30 GB bez kompresji.
NoData
obsługi pozostaje w rozmowie.
len(numpy.unique(yourraster)) == 2
, to wiesz, że ma 2 unikalne wartości i możesz to bezpiecznie zrobić.
numpy.unique
będzie droższy pod względem obliczeniowym (zarówno pod względem czasu, jak i przestrzeni) niż większość innych sposobów sprawdzania, czy różnica jest stała. W obliczu różnicy między dwoma bardzo dużymi zmiennoprzecinkowymi rastrami, które wykazują wiele różnic (takich jak porównanie oryginału do wersji ze stratną kompresją), prawdopodobnie zapadłby się na zawsze lub całkowicie zawiódł.
gdalcompare.py
raster_diff(old_img, new_img) == "Identical"
byłoby sprawdzenie, czy strefowe maksimum wartości bezwzględnej różnicy wynosi 0, gdzie strefa jest przejmowana przez cały zasięg siatki. Czy tego rodzaju rozwiązania szukasz? (Jeśli tak, należy dopracować, aby sprawdzić, czy wartości NoData również są spójne.)