Я бы предложил использовать функции mysql для сравнения с вашим случайно заданным изображением. Сначала давайте создадим простой пример таблицы
DROP TABLE IF EXISTS images;
CREATE TABLE images (
id INTEGER AUTO_INCREMENT PRIMARY KEY,
rgb_values VARCHAR(255)
);
Теперь давайте определим функции, которые мы будем использовать в нашем запросе. Первый позволяет использовать для разделения строки на любой разделитель и получить желаемый элемент обратно по индексу:
DROP FUNCTION SPLIT_STR;
CREATE FUNCTION SPLIT_STR(
x VARCHAR(255),
delim VARCHAR(12),
pos INT
)
RETURNS VARCHAR(255)
RETURN
REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
delim, '')
;
Далее мы определяем функцию для вычисления разности изображений по вашему алгоритму (или любому алгоритму, который вы хотите использовать):
DROP FUNCTION IMAGE_DIFF;
CREATE FUNCTION IMAGE_DIFF(
from_val VARCHAR(255),
to_val VARCHAR(255)
)
RETURNS INTEGER(4)
RETURN
ABS((SPLIT_STR(to_val, ',', 1) - SPLIT_STR(from_val, ',',1))) +
ABS((SPLIT_STR(to_val, ',', 2) - SPLIT_STR(from_val, ',',2))) +
ABS((SPLIT_STR(to_val, ',', 3) - SPLIT_STR(from_val, ',',3))) +
ABS((SPLIT_STR(to_val, ',', 4) - SPLIT_STR(from_val, ',',4))) +
ABS((SPLIT_STR(to_val, ',', 5) - SPLIT_STR(from_val, ',',5))) +
ABS((SPLIT_STR(to_val, ',', 6) - SPLIT_STR(from_val, ',',6))) +
ABS((SPLIT_STR(to_val, ',', 7) - SPLIT_STR(from_val, ',',7))) +
ABS((SPLIT_STR(to_val, ',', 8) - SPLIT_STR(from_val, ',',8))) +
ABS((SPLIT_STR(to_val, ',', 9) - SPLIT_STR(from_val, ',',9)))
;
Давайте создадим несколько примеров данных:
INSERT INTO images(rgb_values) VALUES ("237,128,73,69,35,249,199,183,178");
INSERT INTO images(rgb_values) VALUES ("39,212,164,170,202,49,93,77,145");
INSERT INTO images(rgb_values) VALUES ("28,242,83,167,92,161,115,38,108");
INSERT INTO images(rgb_values) VALUES ("72,81,73,2,77,109,177,204,120");
INSERT INTO images(rgb_values) VALUES ("165,149,106,248,39,26,167,237,139");
INSERT INTO images(rgb_values) VALUES ("183,40,156,131,120,19,71,88,69");
INSERT INTO images(rgb_values) VALUES ("138,136,112,36,69,245,130,196,24");
INSERT INTO images(rgb_values) VALUES ("1,194,153,107,16,102,164,154,74");
INSERT INTO images(rgb_values) VALUES ("172,161,17,179,140,244,23,219,115");
INSERT INTO images(rgb_values) VALUES ("166,151,48,62,154,227,44,21,201");
INSERT INTO images(rgb_values) VALUES ("118,73,212,180,150,64,254,177,68");
INSERT INTO images(rgb_values) VALUES ("119,220,226,254,14,175,123,11,134");
INSERT INTO images(rgb_values) VALUES ("118,93,238,31,77,36,105,151,216");
INSERT INTO images(rgb_values) VALUES ("123,108,177,136,9,24,119,175,88");
INSERT INTO images(rgb_values) VALUES ("11,207,12,215,215,80,101,213,143");
INSERT INTO images(rgb_values) VALUES ("132,158,46,188,7,245,241,126,214");
INSERT INTO images(rgb_values) VALUES ("167,238,186,86,109,164,219,199,238");
INSERT INTO images(rgb_values) VALUES ("216,93,139,246,153,39,226,152,143");
INSERT INTO images(rgb_values) VALUES ("98,229,7,203,230,224,57,154,252");
INSERT INTO images(rgb_values) VALUES ("7,95,145,120,35,6,116,240,64");
INSERT INTO images(rgb_values) VALUES ("45,194,172,223,96,168,18,4,215");
INSERT INTO images(rgb_values) VALUES ("243,161,214,235,134,190,207,63,127");
INSERT INTO images(rgb_values) VALUES ("74,189,249,85,148,169,65,3,81");
INSERT INTO images(rgb_values) VALUES ("46,113,191,20,108,139,60,249,6");
INSERT INTO images(rgb_values) VALUES ("153,246,189,175,5,125,9,197,160");
INSERT INTO images(rgb_values) VALUES ("202,248,23,59,81,175,197,180,114");
INSERT INTO images(rgb_values) VALUES ("73,136,252,137,222,197,118,64,69");
INSERT INTO images(rgb_values) VALUES ("172,224,251,32,154,175,201,33,14");
INSERT INTO images(rgb_values) VALUES ("141,126,112,12,45,214,243,127,49");
INSERT INTO images(rgb_values) VALUES ("116,155,23,205,62,235,111,136,205");
, а затем выполните запрос, используя нашу недавно определенную функцию, для изображения, с которым вы хотите сравнить:
mysql> SELECT id
-> , image_diff(rgb_values, '255,191,234,123,85,23,255,255,255') rgb_diff
-> FROM images
-> ORDER BY 2 DESC;
+----+----------+
| id | rgb_diff |
+----+----------+
| 19 | 1150 |
| 10 | 1148 |
| 3 | 1122 |
| 27 | 1094 |
| 9 | 1070 |
| 15 | 1069 |
| 23 | 1061 |
| 21 | 1059 |
| 7 | 1034 |
| 12 | 1024 |
| 24 | 1022 |
| 30 | 1016 |
| 29 | 989 |
| 28 | 962 |
| 2 | 947 |
| 4 | 933 |
| 16 | 893 |
| 6 | 885 |
| 8 | 875 |
| 20 | 848 |
| 25 | 835 |
| 26 | 815 |
| 1 | 777 |
| 22 | 758 |
| 14 | 745 |
| 11 | 706 |
| 18 | 683 |
| 5 | 656 |
| 13 | 645 |
| 17 | 494 |
+----+----------+
30 rows in set (0.01 sec)