2014-10-14 2 views
0

Я создал следующую таблицу sqlite-DB и заполнил ее информацией о частоте различных цветов пикселов набора изображений, которые я проанализировал. Я хотел бы выбирать изображения в соответствии с одинаковыми цветами. Я был вдохновлен проектом Мэтью Мюллера (http://research.cs.wisc.edu/vision/piximilar/), повторно созданным похожим веб-сайтом и собираюсь изменить шаблон поиска, который он предлагает.Ищете SQL-запрос для выбора изображений с похожими цветами

Каждое изображение состоит из 100 пикселей и, следовательно, сумма столбцов цвет1 ... color6 всегда 100.

id int | filename text | color1 int | color2 int | color3 int | color4 int | color5 int | color6 int | 
------------------------------------------------------------------------------------------------------ 
1  | 1.bmp   | 23   | 25   | 50   | 0   | 0   | 0   | 
2  | 2.bmp   | 25   | 12   | 11   | 2   | 37   | 13   | 
3  | 3.bmp   | 15   | 16   | 17   | 18   | 19   | 15   | 
4  | 4.bmp   | 0   | 100  | 0   | 0   | 0   | 0   | 
... 

Я пытаюсь написать запрос SQL для выбора всех кортежей, где

a) один из столбцов имеет частоту выше определенного порогового значения. Пример с DB выше: порог = 40 -> строки с идентификаторами 1 и 4.

b) сумма двух из столбцов превышает определенный порог. Пример с БД выше: пороговое значение = 60 -> строки с идентификаторами 1, 2 и 4 возвращаются

с) строки сортируются в соответствии с тем, как «ближе»/«похожи» они в какой-то кортеж. Пример с БД выше: «близость» к идентификатору 2 является цель: Результирующий порядок: 2, 3, 1, 4

Я был бы признателен за ваши предложения для хороших запросов а, Ь и с очень много. Спасибо, Дани

+0

Для a вы хотите «где color1> 40 или color2> 40 и т. Д.» Для b вам нужно что-то подобное, но с каждой доступной комбинацией из двух столбцов. c слишком сложно для моих скудных талантов. –

ответ

1

Я думаю, что ваши запросы будет легче писать, если вы нормализовать свои таблицы

files 

file_id, filename 
1, 1.bmp 
2, 2.bmp 

file_colors 

file_id, color_id, color_value 
1, 1, 23 
1, 2, 25 
1, 3, 50 
1, 4, 0 
1, 5, 0 

а) Любой 1 цвет выше определенного значения

select file_id from file_colors 
group by file_id 
having count(case when color_value >= 40 then 1 end) > 0 

б) Любая сумма 2 цвета выше определенного значения

select distinct file_id from file_colors t1 
join file_colors t2 on t1.file_id = t2.file_id 
where t1.color_id <> t2.color_id 
and t1.color_value + t2.color_value >= 60 

c) Вы не определили «разницу». Запрос ниже вычисляет его как сумму абсолютного расстояния для каждого цвета.

select t1.file_id 
from file_colors t1 
join file_colors t2 on t2.file_id = 2 and t2.color_id = t1.color_id 
group by t1.file_id 
order by sum(abs(t1.color_value - t2.color_value)) 
+0

Этот звук отличный, я нормализую свой дБ, и попробую его и вернусь к вам, большое спасибо! –

+0

Я смог подтвердить, что а) и б) работать по желанию. c) однако, похоже, игнорирует информацию о цвете упомянутого файла (file_id = 2 в вашем ответе), но список возвращаемых изображений всегда начинается с полных равномерных изображений (например, голубое небо, темная ночь). Я фактически использовал следующий запрос: select files.file_id, files.filename как dateiname из файлов join file_colors t1 на t1.file_id = files.file_id join file_colors t2 на t2.color_id = t1.color_id и t2.file_id = 250 group by t1.file_id order by sum (abs (t1.color_anzahl - t2.color_anzahl)) предел 100; и получил: http: //wunderwald.ch/pics/l.png –

+0

Есть ли у вас другое предложение для запроса для отображения изображений с почти одинаковыми подсчетами цветных пикселей в качестве первого изображения (вверху слева, file_id = 250 в моем примере)? Благодарю. –

Смежные вопросы