래스터 차이 : 이미지의 값이 동일한 지 확인하는 방법은 무엇입니까? 잘 행동하는 시민입니다. 다른 사람들은 32 비트

주어진 2 개의 래스터 레이어가 동일한 내용을 가지고 있는지 확인하는 수단이 있습니까?

회사 공유 스토리지 볼륨에 문제가 있습니다. 현재 전체 백업을 수행하는 데 3 일이 걸리기에는 너무 큽니다. 예비 조사에 따르면 가장 큰 공간을 소비하는 범인 중 하나는 실제로 CCITT 압축을 사용하여 1 비트 레이어로 저장해야하는 온 / 오프 래스터입니다.

전형적인 현재 / 비 존재 래스터

이 샘플 이미지는 현재 2 비트 (3 가지 가능한 값)이며 파일 시스템에서 11MB의 LZW 압축 tiff로 저장됩니다. 1 비트 (가능한 2 개의 값)로 변환하고 CCITT Group 4 압축을 적용한 후에는 1.3MB로 줄어 듭니다.

(이것은 실제로 매우 잘 행동하는 시민입니다. 다른 사람들은 32 비트 부동으로 저장됩니다!)

이것은 환상적인 소식입니다! 그러나 이것을 적용하기에는 거의 7,000 개의 이미지가 있습니다. 압축 할 스크립트를 작성하는 것은 간단합니다.

for old_img in [list of images]:
    convert_to_1bit_and_compress(old_img)
    remove(old_img)
    replace_with_new(old_img, new_img)

…하지만 중요한 테스트가 누락되었습니다. 새로 압축 된 버전이 컨텐츠와 동일합니까?

  if raster_diff(old_img, new_img) == "Identical":
      remove(old_img)
      rename(new_img, old_img)

Image-A의 내용이 Image-B의 내용과 가치가 동일하다는 것을 자동으로 증명할 수있는 도구 나 방법이 있습니까?

ArcGIS 10.2 및 QGIS에 액세스 할 수 있지만 덮어 쓰기 전에 정확성을 보장하기 위해 이러한 모든 이미지를 수동으로 검사 할 필요가없는 것 외에는 대부분 열려 있습니다. 실제로 ON / OFF 값보다 많은 값을 가진 이미지를 실수로 변환하고 덮어 쓰는 것은 끔찍한 일입니다. 수집하고 생성하는 데 대부분 수천 달러가 소요됩니다.

업데이트 : 가장 큰 범죄자는 최대 30px의 압축되지 않은 32 비트 수레입니다.



답변

래스터를 numpy 배열로 변환 한 다음 array_equal 과 모양 및 요소가 동일한 지 확인하십시오 . 동일한 경우 결과는 다음 True과 같아야합니다 .

ArcGIS :

import arcpy, numpy

raster1 = r'C:\path\to\raster.tif'
raster2 = r'C:\path\to\raster.tif'

r1 = arcpy.RasterToNumPyArray(raster1)
r2 = arcpy.RasterToNumPyArray(raster2)

d = numpy.array_equal(r1,r2)

if d == False:
    print "They differ"

else:
    print "They are the same"

GDAL :

import numpy
from osgeo import gdal

raster1 = r'C:\path\to\raster.tif'
raster2 = r'C:\path\to\raster.tif'

ds1 = gdal.Open(raster1)
ds2 = gdal.Open(raster2)

r1 = numpy.array(ds1.ReadAsArray())
r2 = numpy.array(ds2.ReadAsArray())

d = numpy.array_equal(r1,r2)

if d == False:
    print "They differ"

else:
    print "They are the same"

답변

gdalcompare.py 스크립트 http://www.gdal.org/gdalcompare.html을 사용해보십시오 . 스크립트의 소스 코드는 http://trac.osgeo.org/gdal/browser/trunk/gdal/swig/python/scripts/gdalcompare.py에 있으며 파이썬 스크립트이기 때문에 불필요한 스크립트를 쉽게 제거 할 수 있습니다 현재 요구에 맞는 새로운 테스트 및 추가 스크립트는 밴드별로 두 이미지의 이미지 데이터를 읽어 픽셀 단위로 비교하는 것으로 보이며 아마도 매우 빠르고 재사용 가능한 방법 일 것입니다.


답변

각 이미지에 대해 래스터 속성 테이블 을 작성하고 테이블을 비교할 것을 제안합니다 . 이것은 완전한 검사가 아니며 (두 값의 차이를 계산하는 것과 같음) 이미지가 동일한 히스토그램 값으로 다를 가능성은 매우 작습니다. 또한 NoData가없는 고유 한 값의 수를 제공합니다 (테이블의 행 수에서). 총 개수가 이미지 크기보다 작 으면 NoData 픽셀이있는 것입니다.


답변

내가 찾은 가장 간단한 해결책은 래스터에 대한 요약 통계를 계산하고 비교하는 것입니다. 나는 일반적으로 표준 편차와 평균을 사용하는데, 이는 대부분의 변경에 강하지 만 데이터를 의도적으로 조작하여 속일 수 있습니다.

mean_obj = arcpy.GetRasterProperties(input_raster, 'MEAN')
mean = float(mean_obj.getOutput(0))
if round(mean, 4) != 0.2010:
    print("raster differs from expected mean.")

std_obj = arcpy.GetRasterProperties(input_raster, 'STD')
std = float(std_obj.getOutput(0))
if round(std, 4) != 0.0161:
    print("raster differs from expected standard deviation.")

답변

가장 쉬운 방법은 한 래스터를 다른 래스터에서 빼는 것입니다. 결과가 0이면 두 이미지가 동일합니다. 또한 색상별로 히스토그램 또는 플롯을 볼 수 있습니다.