Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.
Недавно я видел различные публичные аккаунты, рекламирующие проект Github под названием Depix.,Цель — устранить мозаику текста.,С настроем попробоватьтестПосмотрел этот проект。
Слишком долго не читать версию: Паблики в определенной степени преувеличили эффект от этого проекта, но нам все равно нужно обратить внимание на использование различных методов защиты личной жизни.
Адрес проекта:https://github.com/beurtschipper/Depix
Пример, прилагаемый к проекту, выглядит следующим образом:
В документации к этому проекту говорится, что для создания демозаичного изображения вам нужно только мозаичное изображение и последовательность символов Де Брейна, содержащаяся в мозаичном изображении. (Результаты теста показаны на картинке выше)
Давайте проверим это дальше.
Сначала установите Python3 и PIP3.
Тест, который я проводил здесь, проводился в облаке Linux. Тестируемой средой Python была Python3. Процесс установки здесь описываться не будет.
Для запуска проекта требуется подушка среды и образ. Введите команду для установки с помощью pip:
pip3 install pillow
pip3 install image
Если скорость загрузки слишком низкая, вам необходимо переключиться на внутренний источник и повторить тестирование.
Чтобы проверить эффект бега, сначала выполните процедуру, поставляемую с тестируемым программным обеспечением:
python3 depix.py -p images/testimages/testimage3_pixels.png -s images/searchimages/debruinseq_notepad_Windows10_closeAndSpaced.png -o output.png
Если тест пройден успешно, файл output.png появится в том же каталоге. Если его можно открыть нормально и вы видите «Привет с другой стороны», как показано выше, тест пройден.
Если выдается сообщение об ошибке «Нет модуля с именем xxx», это означает, что операционная среда настроена неправильно. Вам необходимо сначала найти, в каком пакете находится отсутствующий модуль, а затем использовать pip для загрузки отсутствующего пакета.
Согласно инструкции на сайте проекта, для удаления мозаики на тексте необходимо сделать следующие приготовления:
Подробности заключаются в следующем.
Здесь мы используем скриншоты Блокнота + функцию мозаики, которая поставляется с определенным программным обеспечением для чата.
Уменьшите размытие мозаики, чтобы весь текст был стерт.
Эффект следующий:
До мозаики:
После мозаики:
Текстовое содержимое: 998877665544.
Последовательности де Брюйна обычно имеют два атрибута: элементы и порядки.
Элемент: В этой последовательности содержится x разных символов.
Порядок: извлеките y из x разных символов и объедините их. Это порядок.
Если существует последовательность Де Брюйна из x элементов порядка y, соедините эту последовательность из конца в конец. Тогда строка, состоящая из символов y, извлеченных из x, может быть найдена в этой последовательности и может быть найдена только один раз.
Пример: Последовательность Де Брюина 2-го порядка, состоящая всего из 3 элементов (abc): a a b a c b b c c (Последовательность, сгенерированная приведенным ниже онлайн-генератором, добавит в конец последовательности символ, который совпадает с началом последовательности) Соедините последовательность из конца в конец, чтобы сформировать кольцо. Если вы случайно выберете 2 символа из abc, чтобы сформировать строку, их можно будет найти в этом кольце последовательности, и их можно будет найти только один раз.
Создать веб-сайт: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, чтобы добиться того же эффекта, что и при соединении «голова-хвост».
После получения последовательности Де Брюйна вам необходимо преобразовать последовательность в текстовое изображение с тем же стилем (размером шрифта, цветом и т. д., даже лучше использовать тот же редактор и инструмент создания снимков экрана), что и декодируемый текст.
Поскольку изображение, которое нужно декодировать, представляет собой текст в Блокноте, нам нужно только вставить приведенную выше последовательность в тот же Блокнот и сделать снимок экрана.
Полученное изображение выглядит следующим образом:
Предположим, что имя сохраненного изображения последовательности Де Брюйна — search.png, а имя изображения, которое нужно декодировать, — toFind.png.
Тогда команда декодирования будет выглядеть так:
python3 depix.py -p toFind.png -s search.png -o op.png
Эффект декодирования заключается в следующем:
Эффект не такой мощный, как может похвастаться паблик-аккаунт, и видна только часть первого символа.
Но после тестирования после многократного декодирования можно увидеть больше данных.
Эффект после декодирования файла, сгенерированного впервые, следующий:
Напишите скрипт для выполнения циклического декодирования:
#/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 раз:
Похоже, что алгоритм все же имеет определенный эффект.
Однако после нескольких декодирований выходное изображение почти такое же, как и в этот раз, что указывает на то, что это предел алгоритма.
Сначала мы открываем основной файл сценария depix.py. С точки зрения кода, функции требуются три параметра: изображение, которое нужно декодировать, изображение последовательности Де Брюина и выходное изображение, а также пути к изображению, которое нужно декодировать, и изображение последовательности Де Брюэна присваиваются двум переменным. PixelatedImagePath и searchImagePath соответственно:
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:
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 и определяется следующим образом:
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 в коде мы видим, что эта функция делит изображение последовательности Де Брюина на маленькие квадраты размером прямоугольник Ширина * прямоугольник Высота и усредняет цвета в маленьких квадратах. Это мозаика линейного коробчатого фильтра, упомянутая в проекте.
Кратко поясним, что метод кодирования мозаики линейного коробчатого фильтра следующий:
Далее давайте посмотрим, как получается прямоугольник Ширина * прямоугольник Высота.
Раскомментируйте приведенный ниже код.
logging.info('For rectangle size {}x{}'.format(rectangleWidth, rectangleHeight))
После повторного запуска обнаруживается, что здесь выводится размер каждого квадрата мозаики на изображении, подлежащем декодированию, что указывает на то, что в процессе декодирования мозаики скрипт вычисляет размер каждого квадрата мозаики на изображении, которое нужно декодируются, а затем вычисляют размер на основе этого размера. Изображения последовательности Де Брюйна обрабатываются мозаично.
Результат вывода:
Размер мозаики, рассчитанный с помощью Paint:
Что касается метода расчета этого размера пикселя, его необходимо проследить до логики обработки декодируемого изображения.
После того, как скрипт прочитает изображение, подлежащее декодированию, он сначала выполнит поиск всех прямоугольных блоков одного цвета и сохранит найденные прямоугольные блоки одного цвета в списке:
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
Далее программа удалит из декодируемого изображения ненужные цветовые блоки:
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
Отсюда видно, что логика оценки программы бесполезных цветовых блоков (цветов фона) заключается в том, что, пока они чисто белые/чисто черные, они будут пропущены. Здесь делаются два вывода:
Затем найдите количество вхождений квадратов каждого размера из цветового блока:
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.
Следующая логика обработки заключается в кодировании изображений последовательности Де Брюйна, затем сопоставлении различных цветовых блоков и их дальнейшем анализе.
Последующие тесты на эффект демозаики проводились несколько раз и выяснилось, что сфера применения этого скрипта ограничена.
С точки зрения результатов испытаний и алгоритма этот алгоритм имеет следующие ограничения.
Фактически, после многих попыток выяснилось, что единственная успешная расшифровка была на этот раз в этой статье, а примеры в статье могли решить только несколько чисел.
ноИз-за этого мы не можем ослабить защиту личной жизни.。При публикации изображения,Для защиты личной информации рекомендуется использовать несколько методов мозаики/мозаики + размазывания.,Дальнейшее повышение безопасности.
Издатель: Full stack программист и руководитель стека, укажите источник для перепечатки: https://javaforall.cn/149162.html Исходная ссылка: https://javaforall.cn