我们拥有一个包含超过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问题,但没有一个有帮助。我发现这个问题的大多数答案都没有有用的示例代码。
帮助! : - )