我正在尝试将一张四波段(RGB和nr红外)的栅格图像转换成ArcMap中的numPy数组。成功转换为numpy数组后,我想计算图像中没有数据的像素数。在ArcMap中检查时,这些像素的颜色标记为“None”,它们看起来是黑色的,但它们缺少第1、2或3波段的红、绿和/或蓝通道数据。我需要找到它们。
以下是我目前的进展:
运行时错误 跟踪(最近的调用在最上面) 文件“”,第14行 在c:\program files (x86)\arcgis\desktop10.2\arcpy\arcpy__init__.py中的文件,第1814行,RasterToNumPyArray函数 返回_RasterToNumPyArray(*args, **kwargs) 运行时错误:错误999998:意外错误。
我能够从这里的代码中将光栅图像转换为numPY数组。
不确定numPY数组如何存储,但是在迭代它时,数据从y轴开始打印,并按列向下(逐列)打印图像,而不是按x轴(逐行)打印。
我需要更改此设置,以便可以从左上到右下按像素(RGBA)读取数据。然而,我对numPy的了解不足以做到这一点。
我认为问题可能是所讨论的tiff文件大小:它在2.5MB时运行良好,但在4GB时会出现问题。 :(
以下是我目前的进展:
import numpy
import os
myDir = "C:\\Temp\\temp"
# myFile = "4_pixel_test.tif"
myFile = "4band.tif"
# import 4band (R,G,B & nr Infrared) image
fName = os.path.join(myDir, myFile)
head, tail = os.path.split(fName)
# Convert Raster to Array, Default using LowerLeft as Origin
rasArray = arcpy.RasterToNumPyArray(fName)
# find out the number of bands in the image
nbands = rasArray.shape[0] # int
# print nbands (int)
blackCount = 0 # count the black pixels per image
th = 0 # Threhold value
# print rasArray
r, g, b, a = rasArray # not working
rCheck = numpy.any(r <= th)
gCheck = numpy.any(g <= th)
bCheck = numpy.any(b <= th)
aCheck = numpy.any(a == 0)
print rCheck
print gCheck
print bCheck
print aCheck
# show the results
if rCheck:
print ("Black pixel (red): %s" % (tail))
elif gCheck:
print ("Black pixel (green): %s" % (tail))
elif bCheck:
print ("Black pixel (blue): %s" % (tail))
else:
print ("%s okay" % (tail))
if aCheck:
print ("Transparent pixel: %s" % (tail))
运行时错误 跟踪(最近的调用在最上面) 文件“”,第14行 在c:\program files (x86)\arcgis\desktop10.2\arcpy\arcpy__init__.py中的文件,第1814行,RasterToNumPyArray函数 返回_RasterToNumPyArray(*args, **kwargs) 运行时错误:错误999998:意外错误。
# previous code which might have incorrect numpy import
# options so I'm going with default options until I know better
# import numpy
# import os
#
# myDir = "C:\\Temp\\temp"
# myFile = "4_pixel_test.tif"
# fName = os.path.join(myDir, myFile)
#
# Convert Raster to Array
# rasArray = arcpy.RasterToNumPyArray(fName)
# maxVal = rasArray.max()
# minVal = rasArray.min()
# maxValpos = numpy.unravel_index(rasArray.argmax(),rasArray.shape)
# minValpos = numpy.unravel_index(rasArray.argmin(),rasArray.shape)
#
# desc = arcpy.Describe(fName)
# utmX = desc.extent.upperLeft.X + maxValpos[0]
# utmY = desc.extent.upperLeft.Y - maxValpos[1]
#
# for pixel in numpy.nditer(rasArray):
# # r,g,b = pixel # doesn't work - single dimension array
# print pixel
#
我能够从这里的代码中将光栅图像转换为numPY数组。
不确定numPY数组如何存储,但是在迭代它时,数据从y轴开始打印,并按列向下(逐列)打印图像,而不是按x轴(逐行)打印。
我需要更改此设置,以便可以从左上到右下按像素(RGBA)读取数据。然而,我对numPy的了解不足以做到这一点。
我认为问题可能是所讨论的tiff文件大小:它在2.5MB时运行良好,但在4GB时会出现问题。 :(