Có phương tiện nào để kiểm tra xem có bất kỳ 2 lớp raster nào có nội dung giống hệt nhau không?
Chúng tôi có một vấn đề về dung lượng lưu trữ được chia sẻ của công ty: hiện tại nó lớn đến mức phải mất hơn 3 ngày để tiến hành sao lưu toàn bộ. Điều tra sơ bộ cho thấy một trong những thủ phạm tiêu tốn không gian lớn nhất là bật / tắt các trình quét thực sự nên được lưu trữ dưới dạng các lớp 1 bit với nén CCITT.
Hình ảnh mẫu này hiện là 2 bit (vì vậy 3 giá trị có thể) và được lưu dưới dạng tiff nén LZW, 11 MB trong hệ thống tệp. Sau khi chuyển đổi thành 1 bit (vì vậy 2 giá trị có thể) và áp dụng nén CCITT Nhóm 4, chúng tôi giảm xuống còn 1,3 MB, gần như là một mức tiết kiệm đầy đủ.
(Đây thực sự là một công dân cư xử rất tốt, có những người khác được lưu trữ dưới dạng float 32bit!)
Đây là tin tuyệt vời! Tuy nhiên, có gần 7.000 hình ảnh để áp dụng điều này quá. Sẽ thật đơn giản để viết một kịch bản để nén chúng:
for old_img in [list of images]:
convert_to_1bit_and_compress(old_img)
remove(old_img)
replace_with_new(old_img, new_img)
... nhưng nó thiếu một bài kiểm tra quan trọng: phiên bản mới được nén có giống hệt nội dung không?
if raster_diff(old_img, new_img) == "Identical":
remove(old_img)
rename(new_img, old_img)
Có một công cụ hoặc phương pháp nào có thể tự động (dis) chứng minh nội dung của Image-A giống với nội dung của Image-B không?
Tôi có quyền truy cập ArcGIS 10.2 và QGIS, nhưng tôi cũng có thể mở hầu hết mọi thứ khác ngoài việc có thể kiểm tra tất cả các hình ảnh này bằng tay để đảm bảo tính chính xác trước khi ghi đè. Nó sẽ là khủng khiếp để convert nhầm lẫn và ghi đè lên một hình ảnh mà thực sự đã có hơn on / off các giá trị trong đó. Hầu hết chi phí hàng ngàn đô la để thu thập và tạo ra.
cập nhật: Người phạm tội lớn nhất là các phao 32 bit có phạm vi lên tới 100.000px cho một bên, vì vậy ~ 30 GB không nén.
NoData
xử lý thích hợp ở lại trong cuộc trò chuyện.
len(numpy.unique(yourraster)) == 2
, thì bạn biết rằng nó có 2 giá trị duy nhất và bạn có thể thực hiện việc này một cách an toàn.
numpy.unique
sẽ đắt hơn về mặt tính toán (cả về thời gian và không gian) so với hầu hết các cách khác để kiểm tra sự khác biệt là một hằng số. Khi phải đối mặt với sự khác biệt giữa hai trình quét điểm nổi rất lớn thể hiện nhiều điểm khác biệt (chẳng hạn như so sánh bản gốc với phiên bản nén bị mất), nó có thể sẽ bị sa lầy mãi mãi hoặc thất bại hoàn toàn.
gdalcompare.py
đã cho thấy lời hứa tuyệt vời ( xem câu trả lời )
raster_diff(old_img, new_img) == "Identical"
sẽ là kiểm tra xem giá trị cực đại của giá trị tuyệt đối của chênh lệch bằng 0, trong đó vùng được lấy trên toàn bộ phạm vi lưới. Đây có phải là loại giải pháp bạn đang tìm kiếm? (Nếu vậy, nó cũng cần được tinh chỉnh để kiểm tra xem có bất kỳ giá trị NoData nào cũng phù hợp không.)