पायथन, जीडीएएल और स्किटिट-इमेज का उपयोग करके इमेज प्रोसेसिंग


11

मैं एक प्रोसेसिंग से जूझ रहा हूं और उम्मीद है कि मैं यहां हल कर पाऊंगा।

मैं वानिकी पर लागू रिमोट सेंसिंग के साथ काम करता हूं, विशेषकर LiDAR डेटा के साथ काम कर रहा हूं। ट्री टॉप डिटेक्शन के लिए स्किकिट-इमेज का उपयोग करने का विचार है। चूंकि मैं पायथन में नया हूं, इसलिए मैंने निम्नलिखित करने के लिए एक महान व्यक्तिगत विजय पर विचार किया:

  1. एक सीएचएम आयात करें (matplotlib के साथ);
  2. एक गाऊसी फिल्टर चलाएं (स्किट-इमेज पैकेज के साथ);
  3. एक मैक्सिमा फिल्टर (स्किटिट-इमेज पैकेज के साथ) चलाएं;
  4. पीक_लोकल_मैक्स (स्किट-इमेज पैकेज के साथ) चलाएं;
  5. सीएचएम को स्थानीय मैक्सीमा (मैटप्लोटलिब के साथ) दिखाएं;

अब मेरी समस्या। जब मैं मैटप्लॉट के साथ आयात करता हूं, तो छवि अपने भौगोलिक निर्देशांक खो देती है। इसलिए मेरे पास जो निर्देशांक हैं, वे सिर्फ मूल छवि निर्देशांक हैं (यानी 250,312)। छवि में स्थानीय मैक्सीमा डॉट (छवि में लाल डॉट्स) के तहत मुझे पिक्सेल के मूल्य की आवश्यकता है। यहाँ मंच में मैंने एक व्यक्ति को एक ही बात पूछते हुए देखा ( बिना जीपीआर के बिना जीडीएएल रस्टर का पिक्सेल मूल्य प्राप्त करना? ), लेकिन उसके पास पहले से ही एक आकृति में अंक थे। मेरे मामले में अंक को स्किटिट-इमेज के साथ गणना की गई थी (यह प्रत्येक ट्री टॉप के निर्देशांक के साथ एक सरणी है)। इसलिए मेरे पास शेपफाइल नहीं है।

अंत में, मैं अंत में जो चाहता हूं वह भौगोलिक निर्देशांक में प्रत्येक स्थानीय मैक्सिमा के निर्देशांक के साथ एक txt फ़ाइल है, उदाहरण के लिए:

525412 62980123 1150 ...

सीएचएम में स्थानीय मैक्सिमा (लाल डॉट्स)

जवाबों:


11

सबसे पहले, साइट पर आपका स्वागत है!

Numpy सरणियों के पास सरणी में इनबिल्ट सिस्टम के समन्वय की अवधारणा नहीं है। 2 डी रेखापुंज के लिए उन्हें स्तंभ और पंक्ति द्वारा अनुक्रमित किया जाता है।

नोट: मैं यह धारणा बना रहा हूं कि आप एक रेखापुंज प्रारूप पढ़ रहे हैं जो GDAL द्वारा समर्थित है

पायथन में स्थानिक रेखापुंज डेटा आयात करने का सबसे अच्छा तरीका rasterioपैकेज के साथ है । रैस्टोरियो द्वारा आयात किया गया कच्चा डेटा अभी भी समन्वित प्रणालियों तक पहुंच के बिना एक सुव्यवस्थित सरणी है, लेकिन रैस्टरियो आपको स्रोत सरणी पर एक affine विधि तक पहुंच भी देता है, जिसका उपयोग आप raster कॉलम और पंक्तियों को अनुमानित निर्देशांक में बदलने के लिए कर सकते हैं। उदाहरण के लिए:

import rasterio

# The best way to open a raster with rasterio is through the context manager
# so that it closes automatically

with rasterio.open(path_to_raster) as source:

    data = source.read(1) # Read raster band 1 as a numpy array
    affine = source.affine

# ... do some work with scikit-image and get an array of local maxima locations
# e.g.
# maxima = numpy.array([[0, 0], [1, 1], [2, 2]])
# Also note that convention in a numy array for a 2d array is rows (y), columns (x)

for point in maxima: #Loop over each pair of coordinates
    column = point[1]
    row = point[0]
    x, y = affine * (column, row)
    print x, y

# Or you can do it all at once:

columns = maxima[:, 1]
rows = maxima[:, 0]

xs, ys = affine * (columns, rows)

और वहां से आप अपने परिणामों को हमारी पसंद की टेक्स्ट फ़ाइल में लिख सकते हैं (जैसा कि मैं उदाहरण के लिए इनबिल्ट csvमॉड्यूल पर एक नज़र डालने का सुझाव दूंगा )।


आपका बहुत बहुत धन्यवाद। ऐसा लगता है कि यह काम कर सकता है। चूंकि मैं इसमें नया हूं, मुझे अभी भी बहुत सारी चीजों से परिचित होना है। धैर्य के लिए धन्यवाद।
जोओ पाउलो परेरा

1
Rasterio 1.x में आप जियो समन्वय प्राप्त करने के लिए source.xy (पंक्ति, स्तंभ) का उपयोग कर सकते हैं।
bugmenot123

0

Matplotlib पर एक त्वरित नज़र से, मैं कहूंगा कि आपको आयात के बाद अक्ष के तराजू को बदलना होगा


मुझे लगता है कि समस्या डरावनी छवि में है। जब मैं इसे चलाता हूँ तो स्वचालित रूप से छवि निर्देशांक में परिवर्तन होता है।
जोओ पाउलो परेरा

0

कृपया निम्नलिखित कोड कोड के साथ प्रयास करें। इसका उपयोग छवि डेटा को रेखापुंज से पढ़ने और संसाधित डेटा को रेखापुंज (.geotiff फ़ाइल) में लिखने के लिए किया जा सकता है।

from PIL import Image,ImageOps
import numpy as np
from osgeo import gdal
#from osgeo import gdal_array
#from osgeo import osr
#from osgeo.gdalconst import *
#import matplotlib.pylab as plt

#from PIL import Image, ImageOps
#import gdal
#from PIL import Image
gdal.AllRegister()

################## Read Raster #################
inRaster='C:\python\Results\Database\Risat1CRS\CRS_LEVEL2_GEOTIFF\scene_HH\imagery_HH.tif'

inDS=gdal.Open(inRaster,1)
geoTransform = inDS.GetGeoTransform()
band=inDS.GetRasterBand(1)
datatype=band.DataType
proj = inDS.GetProjection()
rows = inDS.RasterYSize
cols=inDS.RasterXSize
data=band.ReadAsArray(0,0,cols,rows)#extraction of data to be processed#
############write raster##########
driver=inDS.GetDriver()
outRaster='C:\\python\\Results\\Database\\Temporary data base\\clipped_26July2017\\demo11.tif'
outDS = driver.Create(outRaster, cols,rows, 1,datatype)
geoTransform = inDS.GetGeoTransform()
outDS.SetGeoTransform(geoTransform)
proj = inDS.GetProjection()
outDS.SetProjection(proj)
outBand = outDS.GetRasterBand(1)
outBand.WriteArray(data1,0,0)
#data is the output array to written in tiff file
outDS=None 
im2=Image.open('C:\\python\\Results\\Database\\Temporary data base\\clipped_26July2017\\demo11.tif');
im2.show()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.