Mathematica для порчи изображений

Как ярко светит после бури солнце

из песенки

Знаю, вы уже давно интересуетесь, как сделать из неинтересной картинки странную. Вот один из способов, для которого понадобится Wolfram Mathematica версии, если прикинуть, не ниже 7. Восьмая подойдёт точно. Откроем её.

Скопируйте неинтересную картинку и вставьте её в только что открытый чистый notebook — получится, в зависимости от условий, или картинка, или путь к ней. В первом случае просто присвойте её переменной, вычислив

image = <картинка>;

Во втором — вычислите

image = Import[<путь>];

После этого можно делать много всякого, но мы вытащим пиксели изображения в список:

data = ImageData[image];

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

Действие p1 вырежет из картинки горизонтальную полосу, а потом вклеит её в другом месте:

p1[li_] := Block[{ len = Length[li], indicesFrom, indexWhere, liWithout}, indicesFrom = Sort@RandomInteger[{1, len}, {2}]; indexWhere = RandomInteger[{0, len - 1 + Subtract @@ indicesFrom}]; liWithout = Drop[li, indicesFrom]; (* картинка без вырезанной полосы *) Join[ (* cклеим вновь *) Take[liWithout, indexWhere], (* новую верхнюю часть *) Take[li, indicesFrom], (* вырезанную полосу *) Drop[liWithout, indexWhere]]] (* и новую нижнюю часть *)

Равномерное распределение индексов выбрано просто так. Может быть, вы найдёте вкус в каком-то другом.

Действие p2 вместо вставки полосы на новое место перевернёт её вверх ногами. (А вот почему бы не переворачивать её и вторым способом? Сделайте это сами, т. к. я сообразил только сейчас.)

p2[li_] := Block[{ len = Length[li], indicesFrom}, indicesFrom = Sort@RandomInteger[{1, len}, {2}]; Join[ Take[li, {1, indicesFrom[[1]]}], Reverse[Take[li, indicesFrom], 1], Take[li, {indicesFrom[[2]], -1}]]]

Действие с именем r1 вырежет полосу, начинающуюся сверху, и приклеит её вниз. Это может происходить и через p1 но недостаточно часто.

r1[li_] := Block[{ len = Length[li], by}, by = RandomInteger[{0, len - 1}]; RotateLeft[li, by]]

И ещё есть два готовых действия — Transpose (оно очень пригодится, чтобы строки время от времени превращались в…) и Reverse. Образуем из всего этого список:

operations = {p1, p2, r1, Reverse, Transpose};

Всё готово, можно начинать:

li = RandomChoice[{1, 1, 1, .05, .1} -> operations, 20] (Composition @@ li)[data] // Image

(1, 1, 1, .05, .1 — это частоты, с которыми p1, p2, r1, Reverse, Transpose выбираются в li. Меняйте их как хотите! Количество операций — 20 — разумеется, тоже.)

При каждом выполнении этого фрагмента вы получите очередное безобразие (сохраняется из контекстного меню):

shattered 8

Стоит добавить и неструктурные изменения — затемнение/осветление и прочее.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

:) :D :( :E: ;) :yes: :no: :donno: more »

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.