如何使用Python的scikit-image在4波段地理基站上执行图像分割?

问题描述 投票:2回答:2

我正在尝试使用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数组并执行图像分割?

python image-processing numpy scikit-image geotiff
2个回答
3
投票

我相信你的问题是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。所以它假设你的形象是rgbskimage docsquickshift()显示它有一个标志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)

0
投票

链接页面中示例中的2个关键行,

from skimage.util import img_as_float
img = img_as_float(image[::2, ::2])

也就是说,你是对的。您需要将图像转换为其他格式。使用img_as_float()转换它。

© www.soinside.com 2019 - 2024. All rights reserved.