如何计算 scikit-image 中超像素的平均颜色
How to calculate average color of a superpixel in scikit-image
我使用 scikit 图像库中的 quickshift 方法对图像进行了分割。如何计算超像素的平均颜色和面积?如何解释 quickshift() 方法的 return 值?文档说 return 值是 "Integer mask indicating segment labels" 但这对我来说并不清楚。我如何制作一个原始图像形状的布尔数组,填充其中存在特定超像素的位置,在本演示文稿中我的生活会更轻松(我曾经在 OpenCV 中使用过这种掩码)。你能帮我吗?我的代码(来自 scikit-image 网站的简化示例):
from skimage.data import astronaut
from skimage.segmentation import felzenszwalb, slic, quickshift
from skimage.segmentation import mark_boundaries
from skimage.util import img_as_float
img = img_as_float(astronaut()[::2, ::2])
segments_quick = quickshift(img, kernel_size=3, max_dist=6, ratio=0.5)
print("Quickshift number of segments: %d" % len(np.unique(segments_quick)))
plt.imshow(mark_boundaries(img, segments_quick))
plt.show()
skimage.measure.regionprops
函数returns标记区域的属性,包括您感兴趣的区域:平均值和面积。您按如下方式使用它:
from skimage import measure
regions = measure.regionprops(segments_quick, intensity_image=img)
regions
是一个列表,每个条目代表一个超像素的 RegionProperty 对象。您可以查询区域属性如下:
print([r.area for r in regions])
print([r.mean_intensity for r in regions])
这是一个简单、直接和通用的代码,用其超像素的平均值表示每个像素。
这里的label数组是通过SLIC得到的,其他方法也可以生成labels
import numpy as np
import cv2
from skimage import segmentation
from skimage.data import astronaut
img=cv2.cvtColor(astronaut(),cv2.COLOR_BGR2RGB)
label=segmentation.slic(img,compactness=10, n_segments=1000)
def mean_image(image,label):
im_rp=image.reshape((image.shape[0]*image.shape[1],image.shape[2]))
sli_1d=np.reshape(label,-1)
uni=np.unique(sli_1d)
uu=np.zeros(im_rp.shape)
for i in uni:
loc=np.where(sli_1d==i)[0]
#print(loc)
mm=np.mean(im_rp[loc,:],axis=0)
uu[loc,:]=mm
oo=np.reshape(uu,[image.shape[0],image.shape[1],image.shape[2]]).astype('uint8')
cv2.imshow('img',oo)
output=mean_image(img,label) # displays the output image.
对我来说最简单的方法是:
from skimage import segmentation, color
from skimage.io import imread
from skimage.future import graph
from matplotlib import pyplot as plt
img = imread('test.jpeg')
img_segments = segmentation.slic(img, compactness=20, n_segments=500)
superpixels = color.label2rgb(img_segments, img, kind='avg')
我使用 scikit 图像库中的 quickshift 方法对图像进行了分割。如何计算超像素的平均颜色和面积?如何解释 quickshift() 方法的 return 值?文档说 return 值是 "Integer mask indicating segment labels" 但这对我来说并不清楚。我如何制作一个原始图像形状的布尔数组,填充其中存在特定超像素的位置,在本演示文稿中我的生活会更轻松(我曾经在 OpenCV 中使用过这种掩码)。你能帮我吗?我的代码(来自 scikit-image 网站的简化示例):
from skimage.data import astronaut
from skimage.segmentation import felzenszwalb, slic, quickshift
from skimage.segmentation import mark_boundaries
from skimage.util import img_as_float
img = img_as_float(astronaut()[::2, ::2])
segments_quick = quickshift(img, kernel_size=3, max_dist=6, ratio=0.5)
print("Quickshift number of segments: %d" % len(np.unique(segments_quick)))
plt.imshow(mark_boundaries(img, segments_quick))
plt.show()
skimage.measure.regionprops
函数returns标记区域的属性,包括您感兴趣的区域:平均值和面积。您按如下方式使用它:
from skimage import measure
regions = measure.regionprops(segments_quick, intensity_image=img)
regions
是一个列表,每个条目代表一个超像素的 RegionProperty 对象。您可以查询区域属性如下:
print([r.area for r in regions])
print([r.mean_intensity for r in regions])
这是一个简单、直接和通用的代码,用其超像素的平均值表示每个像素。
这里的label数组是通过SLIC得到的,其他方法也可以生成labels
import numpy as np
import cv2
from skimage import segmentation
from skimage.data import astronaut
img=cv2.cvtColor(astronaut(),cv2.COLOR_BGR2RGB)
label=segmentation.slic(img,compactness=10, n_segments=1000)
def mean_image(image,label):
im_rp=image.reshape((image.shape[0]*image.shape[1],image.shape[2]))
sli_1d=np.reshape(label,-1)
uni=np.unique(sli_1d)
uu=np.zeros(im_rp.shape)
for i in uni:
loc=np.where(sli_1d==i)[0]
#print(loc)
mm=np.mean(im_rp[loc,:],axis=0)
uu[loc,:]=mm
oo=np.reshape(uu,[image.shape[0],image.shape[1],image.shape[2]]).astype('uint8')
cv2.imshow('img',oo)
output=mean_image(img,label) # displays the output image.
对我来说最简单的方法是:
from skimage import segmentation, color
from skimage.io import imread
from skimage.future import graph
from matplotlib import pyplot as plt
img = imread('test.jpeg')
img_segments = segmentation.slic(img, compactness=20, n_segments=500)
superpixels = color.label2rgb(img_segments, img, kind='avg')