রাস্টার ভিন্ন: চিত্রগুলির অভিন্ন মান রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?


10

2 প্রদত্ত রাস্টার স্তরগুলির অভিন্ন সামগ্রী রয়েছে কিনা তা দেখার জন্য কি কোনও উপায় আছে ?

আমাদের কর্পোরেট শেয়ারড স্টোরেজ ভলিউমটিতে আমাদের একটি সমস্যা রয়েছে: এটি এখন এত বড় যে পুরো ব্যাক আপ নিতে 3 দিনের বেশি সময় লাগে। প্রাথমিক তদন্তে প্রকাশ পেয়েছে যে সবচেয়ে বড় স্পেস গ্রাসকারী অপরাধীরা অন / অফ রেস্টারদেরকে সত্যই সিসিআইটিটি সংকোচনের সাথে 1-বিট স্তর হিসাবে সংরক্ষণ করতে হবে।

একটি সাধারণ বর্তমান / না উপস্থিত উপস্থিত রাস্টার

এই নমুনা চিত্রটি বর্তমানে 2 বিট (তাই 3 সম্ভাব্য মান) এবং এলজিডাব্লু সংক্ষেপিত টিফ হিসাবে সংরক্ষণ করা হয়েছে, ফাইল সিস্টেমে 11 এমবি। 1 বিট রূপান্তরিত (সুতরাং 2 সম্ভাব্য মান) এবং সিসিআইটিটি গ্রুপ 4 সংক্ষেপণের প্রয়োগের পরে আমরা এটিকে 1.3 মেগাবাইটে নামিয়ে আনব, সঞ্চয়ের বিশালতার প্রায় পুরো ক্রম।

(এটি আসলে খুব ভাল আচরণের নাগরিক, 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)

এমন কোনও সরঞ্জাম বা পদ্ধতি রয়েছে যা চিত্র-এ-এর সামগ্রীটি স্বয়ংক্রিয়ভাবে (ডিস্ক) প্রমাণ করতে পারে যে চিত্র-বি এর সামগ্রীর সাথে মূল্য-অভিন্ন?

আমার কাছে আরকিজিআইএস 10.2 এবং কিউজিআইএস এ অ্যাক্সেস রয়েছে তবে ওভাররাইট করার আগে যথাযথতা নিশ্চিত করার জন্য এই সমস্ত চিত্র নিজে নিজেই পরিদর্শন করার প্রয়োজনকে বাধা দিতে পারে তার চেয়ে অন্য যে কোনও কিছুর জন্য আমি উন্মুক্ত। এটা তোলে ভুল করে রূপান্তর করতে ভয়ঙ্কর হতে হবে এবং একটি চিত্র যে সত্যিই ওভাররাইট করবে হয়নি এটা মান বন্ধ / উপর বেশী। সংগ্রহ এবং উত্পন্ন করতে হাজার হাজার ডলার ব্যয় হয়।

একটি খুব খারাপ ফলাফল

আপডেট: সবচেয়ে বড় অপরাধীরা 32 বিট ফ্লোট যা একপাশে 100,000 পিক্সের অবধি, তাই GB 30 গিগাবাইট কমপ্রেসড।


1
বাস্তবায়নের এক উপায় raster_diff(old_img, new_img) == "Identical"হ'ল পরীক্ষা করা হবে যে পার্থক্যের নিখুঁত মানের জোনাল সর্বাধিক 0 সমান, যেখানে অঞ্চলটি পুরো গ্রিডের পরিমাণের উপরে নেওয়া হয়। এটি কি আপনি খুঁজছেন এমন সমাধান? (যদি তাই হয়, এটা পরিশ্রুত করা চেক করার জন্য যে কোন NoData মান সামঞ্জস্যপূর্ণ, খুব প্রয়োজন হবে।)
whuber

1
@ NoDataকথোপকথনে যথাযথ পরিচালনা পরিচালনা নিশ্চিত করার জন্য ধন্যবাদ ।
ম্যাট উইলকি

যদি আপনি এটি যাচাই করতে পারেন len(numpy.unique(yourraster)) == 2, তবে আপনি জানেন যে এর 2 টি অনন্য মান রয়েছে এবং আপনি নিরাপদে এটি করতে পারেন।
রিমকো গ্রিলিচ

@ রেমকো অ্যালগরিদম অন্তর্নিহিত numpy.uniqueঅন্যান্য পার্থক্য স্থির কিনা তা পরীক্ষা করার অন্যান্য উপায়ের তুলনায় গণনাগতভাবে (সময় এবং স্থান উভয় ক্ষেত্রে উভয়ই) ব্যয়বহুল হতে চলেছে। যখন দুটি খুব বড় ভাসমান পয়েন্ট রাস্টারগুলির মধ্যে একটি পার্থক্যের মুখোমুখি হয় যা অনেক পার্থক্য প্রদর্শন করে (যেমন একটি ক্ষতিগ্রস্থ সংকোচিত সংস্করণের সাথে একটি আসল তুলনা করা) তখন এটি চিরতরে ডুবে যায় বা পুরোপুরি ব্যর্থ হয়।
whuber

1
অ্যারন, আমি অন্যান্য কাজ করার জন্য প্রকল্পটি বন্ধ করে দিয়েছি। এর একটি কারণ হ'ল উন্নয়নের সময়টি ক্রমবর্ধমান: অনেকগুলি প্রান্তের কেস স্বয়ংক্রিয়ভাবে হ্যান্ডেল করার জন্য, তাই সমস্যাগুলি সমাধান করার পরিবর্তে সমস্যাগুলি লোকেদের ফিরিয়ে দেওয়ার সিদ্ধান্ত নেওয়া হয়েছিল। (উদাহরণস্বরূপ "আপনার ডিস্কের কোটা এক্স, আপনি এটির ভিতরে কীভাবে কাজ করবেন তা শিখেন" ") তবে gdalcompare.pyদুর্দান্ত প্রতিশ্রুতি দেখিয়েছেন ( উত্তর দেখুন )
ম্যাট উইলকি

উত্তর:


8

আপনার রেস্টারদেরকে ন্যালি অ্যারেগুলিতে রূপান্তর করার চেষ্টা করুন এবং তারপরে তাদের অ্যারে_ইক্যালের সাথে একই আকার এবং উপাদান রয়েছে কিনা তা পরীক্ষা করে দেখুন । যদি সেগুলি একই হয় তবে ফলাফলটি হওয়া উচিত 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"

এটি দেখতে মিষ্টি এবং সাধারণ looks আমি দুটি বিবরণ সম্পর্কে কৌতূহলী (যা প্রযুক্তিগত যদিও তারা গুরুত্বপূর্ণ, হতে পারে)। প্রথমত, এই সমাধানটি নোডাটা মানগুলি সঠিকভাবে পরিচালনা করে? দ্বিতীয়ত, গ্রিডের তুলনা যেমন জোনাল সারসংক্ষেপগুলির জন্য অন্তর্নির্মিত ফাংশনগুলি ব্যবহার করে এর গতি কীভাবে তুলনা করে?
হোবার

1
শুভ পয়েন্টগুলি আমি স্ক্রিপ্টটিতে একটি দ্রুত সমন্বয় করেছি যা আকার এবং উপাদানগুলিকে বিবেচনা করা উচিত। আপনার উত্থিত পয়েন্টগুলি আমি যাচাই করব এবং ফলাফলগুলি প্রতিবেদন করব।
হারুন

1
@ হুন্ডার NoDataপরিচালনা সম্পর্কে , RasterToNumPyArrayডিফল্টরূপে অ্যারে ইনপুট রাস্টার এর নোটাটা মান নির্ধারণ করে। ব্যবহারকারী একটি পৃথক মান নির্দিষ্ট করতে পারে, যদিও এটি ম্যাট-এর ক্ষেত্রে প্রযোজ্য নয়। গতি সম্পর্কে, 10২১০ টি কলাম এবং 50 76৫০ সারি (ডিউকিউকিউ সীমা) এর সাথে 2 4-বিট রাস্টারদের তুলনা করতে স্ক্রিপ্টটি 4.5 মিনিট সময় নিয়েছিল। আমি পদ্ধতিটি কোনও জোনাল সারসংক্ষেপের সাথে তুলনা করি নি।
হারুন

1
আমি gdal সমতুল্যে ভাঁজ করেছি, gis.stackexchange.com/questions/32995/…
ম্যাট উইলকি

4

আপনি gdalcompare.py স্ক্রিপ্ট http://www.gdal.org/gdalcompare.html সাথে চেষ্টা করে দেখতে পারেন । স্ক্রিপ্টের উত্স কোডটি http://trac.osgeo.org/gdal/browser/trunk/gdal/swig/python/scriptts/gdalcompare.py এ রয়েছে এবং কারণ এটি একটি অজগর স্ক্রিপ্ট এটি অপ্রয়োজনীয় অপসারণ করা সহজ হওয়া উচিত আপনার বর্তমান প্রয়োজন অনুসারে পরীক্ষা করে নতুন যুক্ত করুন। স্ক্রিপ্টটি ব্যান্ড দ্বারা দুটি চিত্র ব্যান্ডের চিত্রের ডেটা পড়ে পিক্সেল তুলনা করে পিক্সেল বলে মনে হচ্ছে এবং এটি সম্ভবত বেশ দ্রুত এবং পুনরায় ব্যবহারযোগ্য পদ্ধতি।


1
আকর্ষণীয়, আমি gdal ভালবাসি, এই স্ক্রিপ্ট সম্পর্কে জানতাম না। ফলাফলগুলি ব্যাখ্যা করার জন্য ডকস অস্তিত্বহীন যদিও বিচ্ছিন্ন ;-)। আমার প্রাথমিক পরীক্ষায় এটি বর্ণ ব্যাখ্যা এবং প্যালেটগুলির মধ্যে পার্থক্যের প্রতিবেদন করে, যার অর্থ এটি আমার বর্তমান প্রয়োজনের জন্য খুব নির্দিষ্ট হতে পারে। আমি এখনও এটি অন্বেষণ করছি। (দ্রষ্টব্য: এই উত্তরটি এখানে খুব ভাল ফিট হিসাবে খুব সংক্ষিপ্ত, লিঙ্কের উত্তরগুলি নিরুত্সাহিত করা হয়েছে, দয়া করে এটি শিখিয়ে দেখুন)।
ম্যাট উইলকি

1

আমি আপনাকে পরামর্শ দেব যে আপনি প্রতিটি চিত্রের জন্য আপনার রাস্টার বৈশিষ্ট্য টেবিলটি তৈরি করুন , তারপরে আপনি টেবিলগুলি তুলনা করতে পারেন। এটি সম্পূর্ণ চেক নয় (যেমন দুজনের মধ্যে পার্থক্য গণনা করার জন্য), তবে একই চিত্রের মানগুলির সাথে আপনার চিত্রগুলি পৃথক হওয়ার সম্ভাবনা খুব ছোট। এছাড়াও এটি আপনাকে নোডাটা ছাড়াই অনন্য মানের সংখ্যা দেয় (সারণির সারিগুলির সংখ্যা থেকে)। যদি আপনার মোট গণনা চিত্রের আকারের চেয়ে কম হয় তবে আপনি জানেন যে আপনার নোডাটা পিক্সেল রয়েছে।


এই 32-বিট ভাসমান সঙ্গে কাজ করবে? দুটি টেবিল তৈরি এবং তুলনা করা আসলে দুটি রাস্টার (যে নীতিগতভাবে কেবল শূন্য এবং নোডাটা হওয়া উচিত) এর পার্থক্যের মানগুলি পরীক্ষা করার চেয়ে আরও দ্রুত (বা সহজ) হতে পারে?
whuber

আপনি ঠিক বলেছেন যে এটি 32-বিট ফ্লোট দিয়ে কাজ করবে না এবং আমি গতিটি পরীক্ষা করিনি। তবে, অ্যাট্রিবিউট টেবিলটি তৈরি করতে কেবলমাত্র একবারে ডেটা পড়তে হবে এবং যখন আপনি জানেন যে এটি ব্যর্থ হবে তখন 1-বিট সংক্ষেপণ এড়াতে সহায়তা করতে পারে। এছাড়াও আমি চিত্রগুলির আকার জানি না, তবে কখনও কখনও আপনি এগুলিকে মেমরিতে সঞ্চয় করতে পারবেন না।
Radouxju

@radouxju চিত্রগুলি একদিকে 100,000 পিক্স অবধি রয়েছে, তাই range 30 জিবি সঙ্কুচিত। আমাদের এতটা র‌্যামের মেশিন নেই (যদিও সম্ভবত ভার্চুয়াল সহ ...)
ম্যাট উইলকি

আপনি সম্ভবত অর্জজিআইএসের নেটিভ ক্রিয়াকলাপটি বজায় রাখলে সম্ভবত র‌্যাম কোনও সমস্যা হবে না। গ্রিডগুলি প্রক্রিয়াকরণ করার সময় এটি র‍্যাম ব্যবহারের সাথে বেশ ভাল: অভ্যন্তরীণভাবে এটি সারিগুলির একসাথে, সারিগুলির দল এবং আয়তক্ষেত্রাকার উইন্ডো দ্বারা প্রক্রিয়াকরণ সারি-সারি করতে পারে। অন্য থেকে একটি গ্রিড বিয়োগের মতো স্থানীয় ক্রিয়াকলাপগুলি ইনপুট এবং আউটপুট গতিতে মূলত কাজ করতে পারে, প্রতিটি ইনপুট ডেটাসেটের জন্য কেবলমাত্র একটি (অপেক্ষাকৃত ক্ষুদ্র) বাফার প্রয়োজন। একটি অ্যাট্রিবিউট টেবিল তৈরি করার জন্য একটি অতিরিক্ত হ্যাশ টেবিল প্রয়োজন - যা কেবলমাত্র এক বা দুটি মান প্রদর্শিত হলে বিয়োগযোগ্য হবে, তবে নির্বিচারে গ্রিডগুলির জন্য এটি প্রচুর পরিমাণে হতে পারে।
whuber

নম্পি 2 * 30 জি অ্যারে দিয়ে অদলবদল করতে পারে, এটি আরকিজিআইএস নয়। আমি প্রিন্টস্ক্রিনের ভিত্তিতে ধরে নিয়েছি যে চিত্রগুলি শ্রেণিবদ্ধ চিত্রসমূহ (কেবলমাত্র পূর্ববর্তী মানগুলির সাথে), তাই আপনি এতগুলি ক্লাস আশা করবেন না।
রেডাক্সজু

0

আমি যে সহজ সমাধানটি পেয়েছি তা হল রাস্টারদের সম্পর্কে কিছু সংক্ষিপ্ত পরিসংখ্যান গণনা করা এবং সেগুলি তুলনা করা। আমি সাধারণত স্ট্যান্ডার্ড বিচ্যুতি এবং গড় ব্যবহার করি যা বেশিরভাগ পরিবর্তনের পক্ষে মজবুত, যদিও তথ্যগুলি ইচ্ছাকৃতভাবে চালিত করে তাদের বোকা বানানো সম্ভব।

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.")

2
এই পরিসংখ্যানকে বোকা বানানোর এক বিশাল উপায় হ'ল ঘরের বিষয়বস্তুগুলিকে অনুমতি দেওয়া (যা ঘটতে পারে এবং যখন চিত্রের মাত্রা একেবারেই সঠিক না হয়)। খুব বড় রাস্টারগুলিতে এসডি বা গড় উভয়ই নির্ভরযোগ্যতার সাথে ছড়িয়ে ছিটিয়ে থাকা কয়েকটি ছোট পরিবর্তনগুলি সনাক্ত করতে পারে না (বিশেষত যদি কয়েকটি পিক্সেল সবেমাত্র বাদ পড়ে যায়)। সম্ভবত তারা গ্রিডের পাইকারি পুনরায় মডেলিং সনাক্ত করতে পারে না, তবে প্রদত্ত ঘন সমঝোতা ব্যবহৃত হত (যা গড় এবং এসডি সংরক্ষণের উদ্দেশ্যে)। গ্রিডগুলির পার্থক্যের এসডিটির তুলনায় শূন্যের তুলনায় এটি বুদ্ধিমান মনে হবে।
whuber

0

সবচেয়ে সহজ উপায় হ'ল একটি রাস্টারকে অন্যের থেকে বিয়োগ করা, যদি ফলাফলটি 0 হয় তবে উভয় চিত্র একই। এছাড়াও আপনি হিস্টগ্রাম বা প্লটটি রঙ দ্বারা ফলাফল দেখতে পারেন।


বিয়োগটি তুলনা করার জন্য ভাল উপায় বলে মনে হচ্ছে। তবে আমি বিশ্বাস করি নোডাটা মানগুলির সাথে সমস্যা সনাক্ত করতে হিস্টোগ্রাম খুব কার্যকর হবে না। ধরুন, উদাহরণস্বরূপ, যে সংক্ষেপণ পদ্ধতিটি গ্রিডের চারপাশে এক পিক্সেল সীমানাটি সরিয়ে ফেলেছে (এটি ঘটতে পারে!) তবে অন্যথায় সঠিক ছিল: সমস্ত পার্থক্য এখনও শূন্য হবে। এছাড়াও, আপনি কি লক্ষ্য করেছেন যে ওপি 7000 রাস্টার ডেটা সেট দিয়ে এটি করা দরকার? আমি নিশ্চিত নই যে তিনি 000০০০ টি প্লট পরীক্ষা করে দেখতে পাবেন।
হোবার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.