首页 文章

在Python中按颜色搜索图像

提问于
浏览
4

我们有一个包含超过250,000张图像的数据库,我们通过颜色搜索进行搜索 . 所以,我们希望返回包含良好可见"reddish parts"的所有图像 . "reddish arts"我指的是任何颜色范围,从深红色到略微紫色 .

计划是拍摄一张图像,将其缩小到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

它与一些图像的效果相当不错,并且与其他图像相差无几 . 问题是:感知的颜色不仅取决于色调值,还取决于亮度和饱和度 . 例如 . 我们对黄色的定义完全没有达到较低的饱和度/亮度值 - >它只是变成绿褐色而与黄色无关 . 但这只是一个特例;棕色使我们成为橙色的一种低调的颜色......从整体看来,这个系统似乎变得非常复杂 .

我想我在这里做错了 . 尝试使用RGB值也失败了 . 试图用直方图找出更好的方法,但由于愚蠢或某事而失败了......

橙色,红色,蓝色等也可以是布尔...我们可以在我们的数据库中使用任何东西来检索搜索结果...我已经查看了很多类似的SO问题,但没有一个是有帮助的 . 我发现这个问题的大多数答案都没有有用的示例代码 .

救命! :-)

1 回答

  • 1

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

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

相关问题