如何使用scikit-image计算手的测量值?

时间:2015-01-12 20:25:37

标签: python image opencv image-processing scikit-image

我正在尝试图像处理,我的目标是输出人手的测量值,并将人手的图像作为输入。我目前的思维过程是在图像中包含四分之一以提供参考值。因此,我的输入如下:

hand-image

我目前正在使用scikit-image进行图像处理,我的代码如下所示:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches

from skimage import data
from skimage.filter import threshold_otsu
from skimage.segmentation import clear_border
from skimage.morphology import label, closing, square
from skimage.measure import regionprops
from skimage.color import label2rgb
from skimage import io, color


#image = data.coins()[50:-50, 50:-50]
filename = io.imread("hand2.JPG")
image = color.rgb2gray(filename)

# apply threshold
thresh = threshold_otsu(image)
bw = closing(image > thresh, square(3))

# remove artifacts connected to image border
cleared = bw.copy()
#clear_border(cleared)

# label image regions
label_image = label(cleared)
borders = np.logical_xor(bw, cleared)
label_image[borders] = -1
image_label_overlay = label2rgb(label_image, image=image)

fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(12, 12))
ax.imshow(image_label_overlay)

for region in regionprops(label_image):

    # skip small images
    if region.area < 1000:
        continue

    print "Perimeter: "
    print region.perimeter
    print "Area: "
    print region.area
    print ""

    # draw rectangle around segments
    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)

plt.show()

我可以将图像分割成区域,但我不知道如何将手部分转换为单个手指和手的宽度的测量值。我想我很接近,我只是不知道如何继续!

编辑:也许我应该为此使用opencv?

1 个答案:

答案 0 :(得分:1)

它并不清楚你想要的输出,但这是我最好的猜测。我使用SLIC分割算法来识别图像中的区域。根据它们的区域属性(区域),我选择最大的两个(手和硬币)并显示它们以及它们的主轴。

Output of hand/coin segmentation

import numpy as np
import matplotlib.pyplot as plt
import math

from skimage import io, segmentation, measure, color

image = io.imread("hand2.JPG")

label_image = segmentation.slic(image, n_segments=2)
label_image = measure.label(label_image)

regions = measure.regionprops(label_image)
areas = [r.area for r in regions]
ix = np.argsort(areas)

hand = regions[ix[-1]]
coin = regions[ix[-2]]

selected_labels = np.zeros_like(image[..., 0], dtype=np.uint8)

fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(12, 12))

for n, region in enumerate([hand, coin]):
    selected_labels[region.coords[:, 0], region.coords[:, 1]] = n + 2

    y0, x0 = region.centroid
    orientation = region.orientation

    x1 = x0 + math.cos(orientation) * 0.5 * region.major_axis_length
    y1 = y0 - math.sin(orientation) * 0.5 * region.major_axis_length
    x2 = x0 - math.sin(orientation) * 0.5 * region.minor_axis_length
    y2 = y0 - math.cos(orientation) * 0.5 * region.minor_axis_length

    ax.plot((x0, x1), (y0, y1), '-r', linewidth=2.5)
    ax.plot((x0, x2), (y0, y2), '-r', linewidth=2.5)
    ax.plot(x0, y0, '.g', markersize=15)

image_label_overlay = color.label2rgb(selected_labels, image=image, bg_label=0)
ax.imshow(image_label_overlay, cmap='gray')
ax.axis('image')
plt.show()