在分割图像的一部分周围切割补丁
Cutting a patch around a segment of a segmented image
我将图像分割成超像素如下:
from skimage.data import astronaut
img = astronaut()
segments_slic = slic(img, n_segments=250, compactness=10, sigma=1,
start_label=1)
fig = plt.figure(figsize = (16,8));
plt.imshow(mark_boundaries(img, segments_slic))
得到如下图片:
我想在每个超像素周围切一块。例如,考虑一下红色头盔发光部分周围的补丁:
如果我想仔细(手动)查看使用 plt.imshow(segments_slic[425:459,346:371])
的细分,我会在细分周围获取此补丁:
具有特定超像素标签的像素在行 425:459
和列 346:371
上延伸。
目前,我正在这样做:
补丁=列表()
for superpixel in np.unique(segments_slic ):
x_min = np.min(np.where(segments == 15)[0]);
x_max = np.max(np.where(segments == 15)[0]);
y_min = np.min(np.where(segments == 15)[1]);
y_max = np.max(np.where(segments == 15)[1]);
patches.append(I[x_min:x_max,y_min:y_max,:]);
不确定是否正确,虽然看起来不错。为每个超像素生成这样的补丁的最佳方法是什么?另外,是否可以将patch中不属于超像素的像素设置为黑色?
您可以使用 regionprops
并通过 region.bbox
访问补丁坐标,如
from skimage.data import astronaut
import matplotlib.pyplot as plt
from skimage.segmentation import slic
from skimage.segmentation import mark_boundaries
from skimage.measure import regionprops
import matplotlib.patches as mpatches
img = astronaut()
segments_slic = slic(img, n_segments=250, compactness=10, sigma=1, start_label=1)
fig, ax = plt.subplots(figsize=(16, 8))
ax.imshow(img)
for region in regionprops(segments_slic):
# draw rectangle around segmented coins
minr, minc, maxr, maxc = region.bbox
rect = mpatches.Rectangle((minc, minr), maxc - minc, maxr - minr,
fill=False, edgecolor='red', linewidth=2)
ax.add_patch(rect)
# access patch via img[minr:maxr, minc:maxc]
plt.imshow(mark_boundaries(img, segments_slic))
plt.show()
这导致
示例改编自 here。
编辑:此外,使用 region.image
您可以获得您所在区域的掩码,以将其他区域设置为黑色。
我将图像分割成超像素如下:
from skimage.data import astronaut
img = astronaut()
segments_slic = slic(img, n_segments=250, compactness=10, sigma=1,
start_label=1)
fig = plt.figure(figsize = (16,8));
plt.imshow(mark_boundaries(img, segments_slic))
得到如下图片:
我想在每个超像素周围切一块。例如,考虑一下红色头盔发光部分周围的补丁:
如果我想仔细(手动)查看使用 plt.imshow(segments_slic[425:459,346:371])
的细分,我会在细分周围获取此补丁:
具有特定超像素标签的像素在行 425:459
和列 346:371
上延伸。
目前,我正在这样做: 补丁=列表()
for superpixel in np.unique(segments_slic ):
x_min = np.min(np.where(segments == 15)[0]);
x_max = np.max(np.where(segments == 15)[0]);
y_min = np.min(np.where(segments == 15)[1]);
y_max = np.max(np.where(segments == 15)[1]);
patches.append(I[x_min:x_max,y_min:y_max,:]);
不确定是否正确,虽然看起来不错。为每个超像素生成这样的补丁的最佳方法是什么?另外,是否可以将patch中不属于超像素的像素设置为黑色?
您可以使用 regionprops
并通过 region.bbox
访问补丁坐标,如
from skimage.data import astronaut
import matplotlib.pyplot as plt
from skimage.segmentation import slic
from skimage.segmentation import mark_boundaries
from skimage.measure import regionprops
import matplotlib.patches as mpatches
img = astronaut()
segments_slic = slic(img, n_segments=250, compactness=10, sigma=1, start_label=1)
fig, ax = plt.subplots(figsize=(16, 8))
ax.imshow(img)
for region in regionprops(segments_slic):
# draw rectangle around segmented coins
minr, minc, maxr, maxc = region.bbox
rect = mpatches.Rectangle((minc, minr), maxc - minc, maxr - minr,
fill=False, edgecolor='red', linewidth=2)
ax.add_patch(rect)
# access patch via img[minr:maxr, minc:maxc]
plt.imshow(mark_boundaries(img, segments_slic))
plt.show()
这导致
示例改编自 here。
编辑:此外,使用 region.image
您可以获得您所在区域的掩码,以将其他区域设置为黑色。