在Python中按颜色搜索图像

时间:2014-09-20 00:01:14

标签: python image search colors

我们拥有一个包含超过250,000张图片的数据库,我们希望通过颜色搜索这些图像 - 类似于Google的颜色搜索方式。因此,我们定义了12种不同的颜色:从黑色到红色,绿色和蓝色到白​​色。如果用户选择例如红色,我们想要返回包含明显“红色部分”的所有图像。 “红色艺术”是指任何颜色范围从深红色到略微紫色的颜色。

计划是拍摄一张图像,将其缩小到64x64像素并使用所有像素的HSL值。这就是我们计算不同颜色范围的方法:

from PIL import Image
import colorsys

image = Image.open('test.jpg').convert('RGBA').resize((64, 64), Image.ANTIALIAS)
red, orange, yellow, green, turquoise, blue, lilac, pink, white, gray, black, brown = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
for px in image.getdata():
    h, s, l = colorsys.rgb_to_hsv(px[0]/255., px[1]/255., px[2]/255.)
    h = h * 360
    s = s * 100
    l = l * 100

    if l > 95:
        white += 1
    elif l < 8:
        black += 1
    elif s < 8:
        gray += 1
    elif h < 12 or h > 349:
        red += 1
    elif h > 11 and h < 35:
        if s > 70:
            orange += 1
        else:
            brown += 1
    elif h > 34 and h < 65:
        yellow += 1
    elif h > 64 and h < 150:
        green += 1
    elif h > 149 and h < 200:
        turquoise += 1
    elif h > 195 and h < 250:
        blue += 1
    elif h > 245 and h < 275:
        lilac += 1
    elif h > 274 and h < 350:
        pink += 1

print 'White:', white
print 'Black:', black
print 'Gray:', gray
print 'Red:', red
print 'Orange:', orange
print 'Brown:', brown
print 'Yellow:', yellow
print 'Green:', green
print 'Turquoise:', turquoise
print 'Blue:', blue
print 'Lilac:', lilac
print 'Pink:', pink

它可以很好地处理一些图像,并且可以与其他图像失败。问题是:感知的颜色不仅取决于色调值,还取决于亮度和饱和度。例如。对于较低的饱和度/亮度值,我们对黄色的定义完全失败 - &gt;它只是变成绿褐色,与黄色无关。但这只是一个特例;棕色使我们成为橙色的一种次级色调......从整体看来,这个系统似乎变得非常复杂。

我想我在这里做错了什么。尝试使用RGB值也失败了。试图用直方图找出更好的方法,但由于愚蠢或其他原因而失败......

橙色,红色,蓝色等也可以是布尔...我们可以在我们的数据库中使用任何东西来检索搜索结果...我正在尝试使用本机Python库+枕头而不愿意使用scipy或numpy或任何其他第三方应用程序,除非确实有必要。我看了很多类似的 SO问题,但没有一个有帮助。我发现这个问题的大多数答案都没有有用的示例代码。

帮助! : - )

1 个答案:

答案 0 :(得分:1)

Here's使用PIL的一些代码。它可能适合您的需求。

here's使用其他软件包的替代版本。