Author Topic: Странная работа функции PXLXOR  (Read 2590 times)

0 Members and 1 Guest are viewing this topic.

Bob

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Странная работа функции PXLXOR
« on: December 13, 2022, 09:55:38 PM »
Доброго вечера.
Столкнулся со следующей проблемой.
При подсчете контрольной суммы пикселей в заданной области (327, 490, 334, 501) возвращается значение  0 если область меньше чем 12х12.
Code: (clickermann) [Select]
LOGCLEAR
GETSCREEN
$PXLXOR = PXLXOR(327, 490, 334, 501) //контрольная сумма пикселей в области 7х11
LOGWRITE ("$PXLXOR (7х11) = ",$PXLXOR)

$PXLXOR = PXLXOR(327, 490, 339, 502) //контрольная сумма пикселей в области 12х12
LOGWRITE ("$PXLXOR (12х12) = ",$PXLXOR)
 halt


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

В чём здесь проблема?
Версия кликермена 4.13.014 Вин 7х64
« Last Edit: December 13, 2022, 10:26:07 PM by Bob »

kiril

  • Активный участник
  • ***
  • Posts: 106
    • View Profile
Re: Странная работа функции PXLXOR
« Reply #1 on: December 14, 2022, 12:54:32 AM »
Лог
0:52:22 $PXLXOR (7х11) = 131590
0:52:22 $PXLXOR (12х12) = 7961715
Версия кликермана 4.13.014

Bob

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

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Странная работа функции PXLXOR
« Reply #3 on: December 15, 2022, 02:39:33 PM »
Доброго вечера.
Столкнулся со следующей проблемой.
При подсчете контрольной суммы пикселей в заданной области (327, 490, 334, 501) возвращается значение  0 если область меньше чем 12х12.
Code: (clickermann) [Select]
LOGCLEAR
GETSCREEN
$PXLXOR = PXLXOR(327, 490, 334, 501) //контрольная сумма пикселей в области 7х11
LOGWRITE ("$PXLXOR (7х11) = ",$PXLXOR)

$PXLXOR = PXLXOR(327, 490, 339, 502) //контрольная сумма пикселей в области 12х12
LOGWRITE ("$PXLXOR (12х12) = ",$PXLXOR)
 halt


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

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

Никакой проблемы нет, так и должно работать.
В справке к функции есть уточнение:
Quote
Такой способ не очень надежен в плане получения уникального хеша для простых изображений, но весьма быстр.
Используй 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

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Странная работа функции PXLXOR
« Reply #4 on: December 19, 2022, 12:30:52 AM »
Премного благодарен за столь развернутый ответ.