我正在尝试使用Python中的example data模块读取4波段(红色,绿色,蓝色,近红外)geotiff(quickshift segmentation)并执行scikit-image
。
我创建了以下脚本(基于scikit example):
from __future__ import print_function
from osgeo import gdal
import matplotlib.pyplot as plt
import numpy as np
from skimage.segmentation import felzenszwalb, slic, quickshift
from skimage.segmentation import mark_boundaries
from skimage.util import img_as_float
image = r'C:\path\to\my\geotiff.tif'
img = io.imread(image, as_grey=False, plugin="gdal")
segments_quick = quickshift(img, kernel_size=3, max_dist=6, ratio=0.5)
我收到以下错误:
ValueError: the input array must be have a shape == (.., ..,[ ..,] 3)), got (4, 436, 553)
我很确定numpy数组需要以某种方式重新形成。如何正确地将多波段地理数据读入numpy数组并执行图像分割?
我相信你的问题是quickshift()
认为你的形象是rgb
。我从您提供的链接中下载了一个随机图像,然后将其读入skimage。
img = io.imread('./m_4111722_ne_11_1_20100704.tif')
我将其调整为128x128x4(使计算变得简单)
img = transform.resize(img, (128, 128, 4))
然后跑了quickshift()
segments = quickshift(img, kernel_size=3, max_dist=6, ratio=0.5)
并得到了同样的错误。
ValueError: the input array must be have a shape == (.., ..,[ ..,] 3)), got (128, 128, 4)
它说,在堆栈跟踪中更高
skimage/segmentation/_quickshift.pyx inskimage.segmentation._quickshift.\
quickshift (skimage/segmentation/_quickshift.c:1710)()
/****/****/anaconda/lib/python2.7/site-packages/skimage/color/colorconv.pyc in rgb2lab(rgb)
901 This function uses rgb2xyz and xyz2lab.
902 """
--> 903 return xyz2lab(rgb2xyz(rgb))
所以你可以看到_quickshift.pyx
试图转换rgb --> xyz
然后xyz --> lab
。所以它假设你的形象是rgb
。 skimage docs的quickshift()
显示它有一个标志convert2lab
默认为True
。
convert2lab:bool,optional(默认为True)在分段之前是否应将输入转换为Lab色彩空间。为此,假设输入为RGB。
如果我重新运行你的函数,并将该标志设置为False
segments = quickshift(img, kernel_size=3, convert2lab=False, max_dist=6, ratio=0.5)
它运行。
plt.imshow(segments);
编辑:
另外,我注意到你的图像形状是(4, 436, 553)
,这也是有问题的。 skimage
希望色彩通道能够持久。这可以解决
img = img.transpose(1, 2, 0)
链接页面中示例中的2个关键行,
from skimage.util import img_as_float
img = img_as_float(image[::2, ::2])
也就是说,你是对的。您需要将图像转换为其他格式。使用img_as_float()转换它。