Использование Depix для тестирования устранения мозаики
Использование Depix для тестирования устранения мозаики

Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.

0. Предисловие

Недавно я видел различные публичные аккаунты, рекламирующие проект Github под названием Depix.,Цель — устранить мозаику текста.,С настроем попробоватьтестПосмотрел этот проект。

Слишком долго не читать версию: Паблики в определенной степени преувеличили эффект от этого проекта, но нам все равно нужно обратить внимание на использование различных методов защиты личной жизни.

Адрес проекта:https://github.com/beurtschipper/Depix

Пример, прилагаемый к проекту, выглядит следующим образом:

В документации к этому проекту говорится, что для создания демозаичного изображения вам нужно только мозаичное изображение и последовательность символов Де Брейна, содержащаяся в мозаичном изображении. (Результаты теста показаны на картинке выше)

Давайте проверим это дальше.

1. Подготовка

1.1 Настройка среды

Сначала установите Python3 и PIP3.

Тест, который я проводил здесь, проводился в облаке Linux. Тестируемой средой Python была Python3. Процесс установки здесь описываться не будет.

Для запуска проекта требуется подушка среды и образ. Введите команду для установки с помощью pip:

Язык кода:javascript
копировать
pip3 install pillow
pip3 install image

Если скорость загрузки слишком низкая, вам необходимо переключиться на внутренний источник и повторить тестирование.

1.2 Регулярная работа

Чтобы проверить эффект бега, сначала выполните процедуру, поставляемую с тестируемым программным обеспечением:

Язык кода:javascript
копировать
python3 depix.py -p images/testimages/testimage3_pixels.png -s images/searchimages/debruinseq_notepad_Windows10_closeAndSpaced.png -o output.png

Если тест пройден успешно, файл output.png появится в том же каталоге. Если его можно открыть нормально и вы видите «Привет с другой стороны», как показано выше, тест пройден.

Если выдается сообщение об ошибке «Нет модуля с именем xxx», это означает, что операционная среда настроена неправильно. Вам необходимо сначала найти, в каком пакете находится отсутствующий модуль, а затем использовать pip для загрузки отсутствующего пакета.

2. Практическое тестирование

Согласно инструкции на сайте проекта, для удаления мозаики на тексте необходимо сделать следующие приготовления:

  1. Вырежьте мозаичную часть картинки, которую нужно расшифровать как отдельную прямоугольную картинку.
  2. Создайте последовательность Де Брейна и используйте эту последовательность для создания изображения с тем же шрифтом и размером, что и часть мозаики в изображении, подлежащем декодированию. (Подробности будут объяснены позже здесь)
  3. Вызовите скрипт для демозаики.

Подробности заключаются в следующем.

2.1 Подготовка изображений к декодированию

Здесь мы используем скриншоты Блокнота + функцию мозаики, которая поставляется с определенным программным обеспечением для чата.

Уменьшите размытие мозаики, чтобы весь текст был стерт.

Эффект следующий:

До мозаики:

После мозаики:

Текстовое содержимое: 998877665544.

2.2 Последовательность Де Брейна (последовательность Де Брейна)

2.2.1 Введение в последовательность Де Брюйна

Последовательности де Брюйна обычно имеют два атрибута: элементы и порядки.

Элемент: В этой последовательности содержится x разных символов.

Порядок: извлеките y из x разных символов и объедините их. Это порядок.

Если существует последовательность Де Брюйна из x элементов порядка y, соедините эту последовательность из конца в конец. Тогда строка, состоящая из символов y, извлеченных из x, может быть найдена в этой последовательности и может быть найдена только один раз.

Пример: Последовательность Де Брюина 2-го порядка, состоящая всего из 3 элементов (abc): a a b a c b b c c (Последовательность, сгенерированная приведенным ниже онлайн-генератором, добавит в конец последовательности символ, который совпадает с началом последовательности) Соедините последовательность из конца в конец, чтобы сформировать кольцо. Если вы случайно выберете 2 символа из abc, чтобы сформировать строку, их можно будет найти в этом кольце последовательности, и их можно будет найти только один раз.

2.2.2 Генерация последовательности Де Брюйна

Создать веб-сайт:https://damip.net/article-de-bruijn-sequence

Пока мы вводим символы и длину, содержащиеся в последовательности, которую мы хотим сгенерировать, соответствующая последовательность может быть сгенерирована.

Здесь, согласно принципу алгоритма, введенному публичной учетной записью, вам нужно сгенерировать только последовательность порядка 2 (длина кода: 2).

(Здесь генерируется уровень 3)

Поскольку протестированные нами символы мозаики содержат только цифры, то все цифры нужно вводить только в столбец «Алфавит». 1234567890Просто отлично。

Сгенерированная последовательность выглядит следующим образом:

Примечание: Длина последовательности Де Брюина порядка x символов y равна: l e n = x y len=x^y len=xy. То есть: длина 10-символьной последовательности Де Брюина третьего порядка равна 1000. Здесь онлайн-генератор увеличивает длину символов y-1, чтобы добиться того же эффекта, что и при соединении «голова-хвост».

2.2.3 Получение изображений последовательности Де Брюйна

После получения последовательности Де Брюйна вам необходимо преобразовать последовательность в текстовое изображение с тем же стилем (размером шрифта, цветом и т. д., даже лучше использовать тот же редактор и инструмент создания снимков экрана), что и декодируемый текст.

Поскольку изображение, которое нужно декодировать, представляет собой текст в Блокноте, нам нужно только вставить приведенную выше последовательность в тот же Блокнот и сделать снимок экрана.

Полученное изображение выглядит следующим образом:

2.3 Фактическое декодирование

2.3.1 Команда декодирования

Предположим, что имя сохраненного изображения последовательности Де Брюйна — search.png, а имя изображения, которое нужно декодировать, — toFind.png.

Тогда команда декодирования будет выглядеть так:

Язык кода:javascript
копировать
python3 depix.py -p toFind.png -s search.png -o op.png

2.3.2 Анализ эффекта декодирования

Эффект декодирования заключается в следующем:

Эффект не такой мощный, как может похвастаться паблик-аккаунт, и видна только часть первого символа.

Но после тестирования после многократного декодирования можно увидеть больше данных.

Эффект после декодирования файла, сгенерированного впервые, следующий:

Напишите скрипт для выполнения циклического декодирования:

Язык кода:javascript
копировать
#/bin/bash
for I in { 
   1..50};do
	let op=$I+1
  python3 depix.py -p op$I.png -s search.png -o op$op.png
done
echo done.

Эффект после расшифровки 51 раз:

Похоже, что алгоритм все же имеет определенный эффект.

Однако после нескольких декодирований выходное изображение почти такое же, как и в этот раз, что указывает на то, что это предел алгоритма.

2.4 Простой анализ

Сначала мы открываем основной файл сценария depix.py. С точки зрения кода, функции требуются три параметра: изображение, которое нужно декодировать, изображение последовательности Де Брюина и выходное изображение, а также пути к изображению, которое нужно декодировать, и изображение последовательности Де Брюэна присваиваются двум переменным. PixelatedImagePath и searchImagePath соответственно:

Язык кода:javascript
копировать
parser = argparse.ArgumentParser(description = usage)
parser.add_argument('-p', '--pixelimage', help = 'Path to image with pixelated rectangle', required=True) #Картинка для декодирования (обязательно)
parser.add_argument('-s', '--searchimage', help = 'Path to image with patterns to search', required=True) Требуется изображение последовательности #Debruin
parser.add_argument('-o', '--outputimage', help = 'Path to output image', nargs='?', default='output.png') #Выходное изображение, необязательно, по умолчанию — output.png
args = parser.parse_args()
pixelatedImagePath = args.pixelimage
searchImagePath = args.searchimage

Поскольку мы уже знаем, что принцип этого метода заключается в кодировании изображений последовательности Де Брюина в одной и той же форме, а затем сравнении их с исходными изображениями для нахождения тех же блоков, то пока мы отслеживаем, какую операцию проделала эта картинка последовательности , вы можете узнать область применения этого алгоритма.

Отследите переменную searchImagePath и обнаружите, что она используется в качестве параметра функции LoadedImage ниже. Изображение загружается в переменную searchImage. Первый вызов переменной searchImage происходит в функции findRectangleMatches:

Язык кода:javascript
копировать
logging.info("Loading search image from %s" % searchImagePath)
searchImage = LoadedImage(searchImagePath) # Загрузить изображение последовательности Де Брюйна
# упущение
logging.info("Finding matches in search image") 
rectangleMatches = findRectangleMatches(rectangeSizeOccurences, pixelatedSubRectanges, searchImage) #Первый звонок

Функция, которая ее вызывает, находится в файле function.py в папке depixlib и определяется следующим образом:

Язык кода:javascript
копировать
def findRectangleMatches(rectangeSizeOccurences, pixelatedSubRectanges, searchImage):
	rectangleMatches = { 
   }
	for rectangeSizeOccurence in rectangeSizeOccurences:
		rectangleSize = rectangeSizeOccurence
		rectangleWidth = rectangleSize[0]
		rectangleHeight = rectangleSize[1]
		pixelsInRectangle = rectangleWidth*rectangleHeight
		# logging.info('For rectangle size {}x{}'.format(rectangleWidth, rectangleHeight))
		# filter out the desired rectangle size
		matchingRectangles = []
		for colorRectange in pixelatedSubRectanges:
			if (colorRectange.width, colorRectange.height) == rectangleSize:
				matchingRectangles.append(colorRectange)
		for x in range(searchImage.width - rectangleWidth):
			for y in range(searchImage.height - rectangleHeight):
				r = g = b = 0
				matchData = []
				for xx in range(rectangleWidth):
					for yy in range(rectangleHeight):
						newPixel = searchImage.imageData[x+xx][y+yy]
						rr,gg,bb = newPixel
						matchData.append(newPixel)
						r += rr
						g += gg
						b += bb
				averageColor = (int(r / pixelsInRectangle), int(g / pixelsInRectangle), int(b / pixelsInRectangle))
				for matchingRectangle in matchingRectangles:
					if (matchingRectangle.x,matchingRectangle.y) not in rectangleMatches:
						rectangleMatches[(matchingRectangle.x,matchingRectangle.y)] = []
					if matchingRectangle.color == averageColor:
						newRectangleMatch = RectangleMatch(x, y, matchData)
						rectangleMatches[(matchingRectangle.x,matchingRectangle.y)].append(newRectangleMatch)
			# if x % 64 == 0:
			# logging.info('Scanning in searchImage: {}/{}'.format(x, searchImage.width - rectangleWidth))
	return rectangleMatches

Из цикла xy в коде мы видим, что эта функция делит изображение последовательности Де Брюина на маленькие квадраты размером прямоугольник Ширина * прямоугольник Высота и усредняет цвета в маленьких квадратах. Это мозаика линейного коробчатого фильтра, упомянутая в проекте.

Кратко поясним, что метод кодирования мозаики линейного коробчатого фильтра следующий:

  1. Разделите изображение, которое нужно закодировать, на серию небольших квадратных областей на основе пикселей.
  2. Усредните цвета всех пикселей в каждой области, чтобы получить средний цвет каждой области.
  3. Используйте средний цвет каждой области, чтобы заполнить эту область и добиться эффекта мозаики. Следовательно, если площадь каждого участка будет больше, изображение будет размытым, и наоборот, изображение будет более четким.

Далее давайте посмотрим, как получается прямоугольник Ширина * прямоугольник Высота.

Раскомментируйте приведенный ниже код.

Язык кода:javascript
копировать
logging.info('For rectangle size {}x{}'.format(rectangleWidth, rectangleHeight))

После повторного запуска обнаруживается, что здесь выводится размер каждого квадрата мозаики на изображении, подлежащем декодированию, что указывает на то, что в процессе декодирования мозаики скрипт вычисляет размер каждого квадрата мозаики на изображении, которое нужно декодируются, а затем вычисляют размер на основе этого размера. Изображения последовательности Де Брюйна обрабатываются мозаично.

Результат вывода:

Размер мозаики, рассчитанный с помощью Paint:

Что касается метода расчета этого размера пикселя, его необходимо проследить до логики обработки декодируемого изображения.

После того, как скрипт прочитает изображение, подлежащее декодированию, он сначала выполнит поиск всех прямоугольных блоков одного цвета и сохранит найденные прямоугольные блоки одного цвета в списке:

Язык кода:javascript
копировать
pixelatedImage = LoadedImage(pixelatedImagePath) # Прочитайте картинку, которую нужно расшифровать.
#...
pixelatedSubRectanges = findSameColorSubRectangles(pixelatedImage, pixelatedRectange) #Находим прямоугольную область того же цвета
# ...
def findSameColorSubRectangles(pixelatedImage, rectangle):  #Определение функции в файле function.py
	sameColorRectanges = []
	x = rectangle.x
	maxx = rectangle.x + rectangle.width + 1
	maxy = rectangle.y + rectangle.height + 1
	while x < maxx:
		y = rectangle.y
		while y < maxy:
			sameColorRectange = findSameColorRectangle(pixelatedImage, (x, y), (maxx, maxy))
			if sameColorRectange == False:
				continue
			# logging.info("Found rectangle at (%s, %s) with size (%s,%s) and color %s" % (x, y, sameColorRectange.width,sameColorRectange.height,sameColorRectange.color))
			sameColorRectanges.append(sameColorRectange)
			y += sameColorRectange.height
		x += sameColorRectange.width
	return sameColorRectanges

Далее программа удалит из декодируемого изображения ненужные цветовые блоки:

Язык кода:javascript
копировать
pixelatedSubRectanges = removeMootColorRectangles(pixelatedSubRectanges)  #Удалить ненужные цветовые блоки

def removeMootColorRectangles(colorRectanges):   #Определение функции
	pixelatedSubRectanges = []
	for colorRectange in colorRectanges:
			if colorRectange.color in [(0,0,0),(255,255,255)]:  #Если цвет чисто белый/чисто черный, пропустите цветовой блок
				continue
			pixelatedSubRectanges.append(colorRectange)   #Добавляем цветовой блок к списку пиксельныхSubRectanges
	return pixelatedSubRectanges

Отсюда видно, что логика оценки программы бесполезных цветовых блоков (цветов фона) заключается в том, что, пока они чисто белые/чисто черные, они будут пропущены. Здесь делаются два вывода:

  1. Этот алгоритм лучше работает на сплошном цветном фоне.
  2. Если вам нужно разложить мозаику под другие цвета фона, вам необходимо изменить здесь значение RGB соответствующего цвета фона.

Затем найдите количество вхождений квадратов каждого размера из цветового блока:

Язык кода:javascript
копировать
def findRectangleSizeOccurences(colorRectanges):
	rectangeSizeOccurences = { 
   }
	for colorRectange in colorRectanges:
		size = (colorRectange.width, colorRectange.height)
		if size in rectangeSizeOccurences:
			rectangeSizeOccurences[size] += 1
		else:
			rectangeSizeOccurences[size] = 1
	return rectangeSizeOccurences

Размер квадрата здесь — это размер квадрата, используемый для обработки последовательности Де Брюина в findRectangleMatches.

Следующая логика обработки заключается в кодировании изображений последовательности Де Брюйна, затем сопоставлении различных цветовых блоков и их дальнейшем анализе.

3. Резюме

Последующие тесты на эффект демозаики проводились несколько раз и выяснилось, что сфера применения этого скрипта ограничена.

С точки зрения результатов испытаний и алгоритма этот алгоритм имеет следующие ограничения.

  1. Принцип этого алгоритма состоит в том, чтобы закодировать диаграмму последовательности Де Брюйна в той же мозаичной форме, а затем сравнить изображение закодированной последовательности с изображением, подлежащим декодированию, чтобы найти возможные текстовые последовательности. Этот принцип был описан во многих публичных аккаунтах и ​​не будет здесь обсуждаться. Отсюда можно сделать вывод, что если форма мозаики отличается от формы мозаики в алгоритме или увеличивается неоднозначность мозаики, это увеличивает сложность декодирования.
    1. Форма мозаики и алгоритм мозаики в алгоритме не совпадают.
    2. Увеличено размытие мозаики (т.е. увеличен размер среднего цветового пятна)
    3. Цвет фона мозаичного текста не должен быть сплошным, насколько это возможно.
  2. Многократное кодирование текста мозаики также усложнит активацию успешного урока.
  3. Из процесса декодирования видно, что декодирование должно генерировать последовательность Де Брюина, содержащую все символы декодируемого текста. Поэтому мы должны понять, какие символы содержатся в декодируемом тексте. Это также ограничивает возможности метода для декодирования последовательностей символов, таких как английские символы и цифры. Как китайский...

Фактически, после многих попыток выяснилось, что единственная успешная расшифровка была на этот раз в этой статье, а примеры в статье могли решить только несколько чисел.

ноИз-за этого мы не можем ослабить защиту личной жизни.。При публикации изображения,Для защиты личной информации рекомендуется использовать несколько методов мозаики/мозаики + размазывания.,Дальнейшее повышение безопасности.

Издатель: Full stack программист и руководитель стека, укажите источник для перепечатки: https://javaforall.cn/149162.html Исходная ссылка: https://javaforall.cn

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose