python代码慢速皮肤检测

2024-05-16 08:52:33 发布

您现在位置:Python中文网/ 问答频道 /正文

此代码将颜色空间更改为LAB,并使用阈值来查找图像的皮肤区域。但速度慢得可笑。我不知道怎么让它快点?在

from colormath.color_objects import *

def skinDetection(img, treshold=80, color=[255,20,147]):

    print img.shape
    res=img.copy()
    for x in range(img.shape[0]):
        for y in range(img.shape[1]):
            RGBimg=RGBColor(img[x,y,0],img[x,y,1],img[x,y,2])
            LABimg=RGBimg.convert_to('lab', debug=False)
            if (LABimg.lab_l > treshold):
                res[x,y,:]=color
            else: 
                res[x,y,:]=img[x,y,:]

    return res

Tags: 代码inimgfor颜色lab空间range
2条回答

我建议您按照一个简单的过程来优化代码:
1添加一些性能指标。您必须了解代码的哪个部分占用了大部分时间。
2用性能更好的功能更新这些功能
三。衡量绩效改进

在Python中,嵌套循环总是很慢。迭代每个像素,因此需要很多时间。在

向量化操作总是更快,也就是说,将数组作为一个整体执行操作,并让底层的C例程执行循环。在

我对colormath不太了解,因此我不能为这个库提供相应的代码(也不知道它是否存在),但是对于scikit-image,我可以:

def mask2(rgb, threshold=80, color=[255,20,147]):
    res = rgb.copy()
    lab = skimage.color.rgb2lab(rgb)
    mask = lab[:,:,0] > threshold
    res[mask] = np.array(color).reshape(1,-1).repeat(mask.sum(),axis=0)
    return res

我将整个图像转换为实验室空间,然后确定一个遮罩(其中L高于阈值),然后将这些像素设置为新的颜色。此方法产生的结果与您的方法稍有不同(可能是因为不同的转换实现),但它可能满足您的需要。在

下面是一个完整的脚本,包括您的方法(mask1)和性能度量。在

^{pr2}$

我在代码中嵌入了一个图像,代码的某些部分只是用来解码的。在

这个脚本的输出是

4.43572092984 0.0531735152348 83.4197421453

所以我的方法比你的快80倍。对于更大的图像(这个只有24 x 24像素),差别更大,大约是120倍。在

看看矢量化的力量吧!在

相关问题 更多 >