Автор Тема: Странная работа функции PXLXOR  (Прочитано 739 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Bob

  • Зашел в гости
  • *
  • Сообщений: 17
    • Просмотр профиля
Странная работа функции PXLXOR
« : Декабрь 13, 2022, 09:55:38 pm »
Доброго вечера.
Столкнулся со следующей проблемой.
При подсчете контрольной суммы пикселей в заданной области (327, 490, 334, 501) возвращается значение  0 если область меньше чем 12х12.
Код: Clickermann
  1. LOGCLEAR
  2. GETSCREEN
  3. $PXLXOR = PXLXOR(327, 490, 334, 501) //контрольная сумма пикселей в области 7х11
  4. LOGWRITE ("$PXLXOR (7х11) = ",$PXLXOR)
  5.  
  6. $PXLXOR = PXLXOR(327, 490, 339, 502) //контрольная сумма пикселей в области 12х12
  7. LOGWRITE ("$PXLXOR (12х12) = ",$PXLXOR)
  8. halt
  9.  


Лог
21:53:35 $PXLXOR (7х11) = 0
21:53:35 $PXLXOR (12х12) = 16579836

В чём здесь проблема?
Версия кликермена 4.13.014 Вин 7х64
« Последнее редактирование: Декабрь 13, 2022, 10:26:07 pm от Bob »

kiril

  • Освоившийся
  • **
  • Сообщений: 83
    • Просмотр профиля
Re: Странная работа функции PXLXOR
« Ответ #1 : Декабрь 14, 2022, 12:54:32 am »
Лог
0:52:22 $PXLXOR (7х11) = 131590
0:52:22 $PXLXOR (12х12) = 7961715
Версия кликермана 4.13.014

Bob

  • Зашел в гости
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Странная работа функции PXLXOR
« Ответ #2 : Декабрь 14, 2022, 08:20:39 pm »
Спасибо за ответ.
 Поэкспериментировав выявил следующее. Если область анализа состоит из пикселей одного цвета и площадь области менее чем 12х12.
Пробовал на программе Paint.NET
 Изначально выявил это на анализе области в которую вписана единица (площадь 7х11). Область состоит из пикселей разного цвета но контрольная сумма функции PXLXOR возвращает 0. Файл изображения в ссылке.
https://disk.yandex.ru/i/cK9IGSJxN-4A5A

Vint

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3871
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • Просмотр профиля
Re: Странная работа функции PXLXOR
« Ответ #3 : Декабрь 15, 2022, 02:39:33 pm »
Доброго вечера.
Столкнулся со следующей проблемой.
При подсчете контрольной суммы пикселей в заданной области (327, 490, 334, 501) возвращается значение  0 если область меньше чем 12х12.
Код: Clickermann
  1. LOGCLEAR
  2. GETSCREEN
  3. $PXLXOR = PXLXOR(327, 490, 334, 501) //контрольная сумма пикселей в области 7х11
  4. LOGWRITE ("$PXLXOR (7х11) = ",$PXLXOR)
  5.  
  6. $PXLXOR = PXLXOR(327, 490, 339, 502) //контрольная сумма пикселей в области 12х12
  7. LOGWRITE ("$PXLXOR (12х12) = ",$PXLXOR)
  8. halt
  9.  


Лог
21:53:35 $PXLXOR (7х11) = 0
21:53:35 $PXLXOR (12х12) = 16579836

В чём здесь проблема?

Никакой проблемы нет, так и должно работать.
В справке к функции есть уточнение:
Цитировать
Такой способ не очень надежен в плане получения уникального хеша для простых изображений, но весьма быстр.
Используй PXLCRC и будет тебе счастье.

Чтобы понять почему так получилось, как работает XOR посмотри таблицу истинности для XOR.
Например у тебя есть число в двоичном виде 01010101. Второй операнд 00001111. Ты биты установленные во втором числе (1) ты переключаешь в первом числе биты на противоположные, но только те, которые установлены во втором числе (1)
01010101
00001111
-------------
01011010

Если результат опять сделать XOR с тем же числом, то опять получим первое число

01011010
00001111
-------------
01010101

Короче, очень ненадёжный способ на некоторых комбинациях, как и написано, проблема с уникальностью.
А ты используешь на изображении с применением COLORMODE(7), чем усугубил ситуацию. Там цвета такие.

твой зелёный цвет: 8388479
01111111 11111111 01111111

цвет фона: 8355711
01111111 01111111 01111111

Как говорится найди два одно отличие
              0 XOR 01111111 = 01111111
01111111 XOR 01111111 = 00000000

Этот зелёный цвет отличается от фона на 1 бит. Если зелёный встретится в изображении чётное число раз, G канал превратится в 0 и не влияет на остальной подсчёт. С фоном тоже самое. Если и тот и тот чётное - итог 0.

(327, 490, 334, 501) // область 8х12 (не 7х11)  8*12 = 96 - чётное количество пикселов всего и так получилось фон и зелёный тоже оба чётные.
(327, 490, 339, 502) // область 13х13 (не 12х12)  13*13 = 169 операций - нечётное количество всего, какой-то из 2-х (фон или зелёный) обязательно будут нечётными.

Используй PXLCRC и не мучайся.
PXLXOR - если уж очень нужна выгода в миллисекунды и при этом много цветов и большая область. Чем выше применяемый COLORMOD, тем хуже результат, т.к. колормод просто забивает биты справа единицами.



Bob

  • Зашел в гости
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Странная работа функции PXLXOR
« Ответ #4 : Декабрь 19, 2022, 12:30:52 am »
Премного благодарен за столь развернутый ответ.