【问题标题】:TypeError: unsupported operand type(s) for +: 'numpy.ndarray' and 'str'类型错误:+ 不支持的操作数类型:“numpy.ndarray”和“str”
【发布时间】:2016-01-26 21:08:33
【问题描述】:

我正在使用 OpenCv 库在 python 中编程。

我正在尝试使用 opencv 删除阴影,因此之后我想计算 NDVI(Arcpy 库)。所以如果我从原始图像计算 NDVI,它工作正常,但是如果我想从消除阴影后的结果中计算 NDVI,我得到了这个错误:

Traceback (most recent call last):

  File "C:/Python27/sombras_ndvi.py", line 36, in <module>

    NIR = arcpy.sa.Raster(sumada3+ '\Band_1')

TypeError: unsupported operand type(s) for +: 'numpy.ndarray' and 'str'

完整的代码是这样的:

#I create a workspace to calculate NDVI..

arcpy.CheckOutExtension("spatial")

env.workspace = r'C:\python27\archivos'

#the first step is apply some filters to finally delete shades.

img = cv2.imread('C:\python27\Archivos\image02.jpg',0)

orig = cv2.imread('C:\python27\Archivos\image02.jpg')


thresh = 45
maxValue = 255

blur = cv2.blur(img, (15,15))

medianblur = cv2.medianBlur(blur,11)

th, dst = cv2.threshold(blur, thresh, maxValue, cv2.THRESH_BINARY_INV)


dst2_3channel= cv2.cvtColor(dst,cv2.COLOR_GRAY2BGR) 

sumada3 = cv2.add(dst2_3channel,orig)

#NOW I TRY TO CALCULATE NDVI


NIR = arcpy.sa.Raster(sumada3+ '\Band_1')

red = arcpy.sa.Raster(sumada3+ '\Band_2')

#NDVI = (NIR-red)/(NIR+red)

num = arcpy.sa.Float(NIR-red)

denom = arcpy.sa.Float(NIR+red)

NDVI = arcpy.sa.Divide(num, denom)

ndvi_out = ('NDVI_sombras.jpg')

NDVI.save(ndvi_out)

【问题讨论】:

  • sumada3 是一个 numpy 像素值数组,而 '\Band_1' 是一个字符串。正如错误消息所说,+ 操作对于这种输入类型组合是未定义的。我不太清楚你想在这里做什么。 '\Band_1' 应该代表什么? sumada3 + '\Band_1' 的结果应该是什么类型的对象?

标签: python opencv numpy arcgis arcpy


【解决方案1】:

arcpy.sa.Raster 创建一个光栅对象。但是,它需要一个现有的栅格数据集作为输入。它不能接受一个 numpy 数组作为输入;合适的工具是arcpy.NumPyArrayToRaster

【讨论】:

  • 最重要的是,附加 \Band_1 不会选择 numpy 数组的层。您可能需要深入研究 numpy 数组的文档才能弄清楚这一点。
猜你喜欢
  • 2015-12-11
  • 2017-05-27
  • 1970-01-01
  • 2021-06-18
  • 2021-10-15
  • 2014-06-15
  • 2019-04-08
  • 2018-07-07
  • 2014-06-16
相关资源
最近更新 更多