sortowanie obrazków

image sorting experiments • эксперименты с сортировкой изображений

Robię dziś eksperymenty z sortowaniem obrazków. Używałem do tego tego programu w Pythonie, który skleciłem na szybko.

Oczywiście można by posortować wszystkie piksele, od jasnych do ciemnych, ale to byłoby - pomyślałem - mało ciekawe. Lepiej sortować jakieś większe kawałki, które miałyby swoją treść.

Na przykład można posortować wiersze. Na przykład w kolejności leksykograficznej (alfabetycznej). Dla fotografii i innych obrazków, na których dużo się dzieje, wynik jest mało ciekawy - bo przy sortowaniu leksykograficznym lewe piksele są bardzo ważne, a na zdjęciu są one często przypadkowe. Przykładowo, jeśli wziąć klasyczne zdjęcie Leny:

Today I'm doing experiments with image sorting. I used this Python program for this, which I quickly put together.

Of course, you could sort all pixels from light to dark, but that would be - I thought - not very interesting. It's better to sort some larger chunks that would have their own content.

For example, you can sort rows. For instance, in lexicographic (alphabetical) order. For photographs and other images where a lot is happening, the result is not very interesting - because with lexicographic sorting, the leftmost pixels are very important, and in photos they are often random. For example, if you take the classic Lena photo:

Сегодня я делаю эксперименты с сортировкой изображений. Для этого я использовал эту программу на Python, которую быстро собрал.

Конечно, можно было бы отсортировать все пиксели от светлых к темным, но это было бы - подумал я - не очень интересно. Лучше сортировать какие-то большие куски, которые имели бы свое содержание.

Например, можно сортировать строки. Например, в лексикографическом (алфавитном) порядке. Для фотографий и других изображений, где много происходит, результат не очень интересный - потому что при лексикографической сортировке левые пиксели очень важны, а на фото они часто случайны. Например, если взять классическое фото Лены:

Lena original
img/lena-rgb.jpg

i posortować leksykograficznie, to wychodzi to:

and sort it lexicographically, this comes out:

и отсортировать лексикографически, получается это:

Lena lexicographically sorted
img/lena-rgb_lexicographic.jpg

Jak mówiłem: ponieważ decydują lewe piksele, to kilka pikseli dalej mamy już szum. Można mocno oddszumić obrazek źródłowo, żeby w tych lewych, decydujących pikselach mieć mniej losowości:

As I said: since the left pixels decide, a few pixels further we already have noise. You can heavily denoise the source image to have less randomness in those left, deciding pixels:

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

Lena denoised
img/lena-rgb-denoised.jpg

ale efekt jest niewiele ciekawszy:

but the effect is not much more interesting:

но эффект не намного интереснее:

Lena denoised lexicographic
img/lena-rgb-denoised_lexicographic.jpg

Można obrazek źródłowy zmienić w dwutonową czerń i biel:

You can change the source image to two-tone black and white:

Можно изменить исходное изображение на двухтоновое черно-белое:

Lena binary
img/lena-1-denoised.png

i wtedy coś, trochę zaczyna się robić ciekawiej:

and then something starts to get a bit more interesting:

и тогда что-то начинает становиться немного интереснее:

Lena binary lexicographic
img/lena-1-denoised_lexicographic.png

Albo zmniejszyć liczbę kolorów do dwunastu:

Or reduce the number of colors to twelve:

Или уменьшить количество цветов до двенадцати:

Lena 12 colors
img/lena-12.png

i wtedy efekt jest taki:

and then the effect is like this:

и тогда эффект такой:

Lena 12 colors lexicographic
img/lena-12_lexicographic.png

Można też spróbować innych sortowań. Na przykład można wziąć którykolwiek wiersz, następnie dać wiersz najbardziej do niego podobny, potem kolejny podobny i tak dalej. Wychodzi coś takiego:

You can also try other sortings. For example, you can take any row, then give the row most similar to it, then the next similar one and so on. Something like this comes out:

Можно также попробовать другие сортировки. Например, можно взять любую строку, затем дать строку наиболее похожую на неё, потом следующую похожую и так далее. Получается что-то такое:

Lena nearest neighbor
img/lena-rgb_nearest_neighbor.jpg

Nadal nie bardzo ciekawe. No to można sortować coś innego niż wiersze. Można podzielić obrazek na kwadraty a potem próbować losowo mieszać te kwadraty tak, żeby podobne kwadraty były blisko, a niepodobne daleko - a podobieństwo mierzyć podobieństwem średniej i przeciętnego odchylenia pikseli w danym kwadracie (tak, wiem, można by to robić symulowanym wyżarzaniem, żeby nie wpaść w lokalne optimum, ale jakoś mi się nie chciało). Wtedy wynik wychodzi taki, dla różnych wielkości kwadratowych kafelków:

Still not very interesting. So you can sort something other than rows. You can divide the image into squares and then try to randomly mix these squares so that similar squares are close and dissimilar ones far - and measure similarity by the similarity of the mean and average deviation of pixels in a given square (yes, I know, this could be done with simulated annealing to avoid falling into local optimum, but I somehow didn't feel like it). Then the result comes out like this, for different sizes of square tiles:

Всё ещё не очень интересно. Ну тогда можно сортировать что-то другое, кроме строк. Можно разделить изображение на квадраты, а затем попытаться случайно перемешать эти квадраты так, чтобы похожие квадраты были близко, а непохожие далеко - а сходство измерять сходством среднего и среднего отклонения пикселей в данном квадрате (да, я знаю, это можно было бы делать симулированным отжигом, чтобы не попасть в локальный оптимум, но мне как-то не хотелось). Тогда результат получается такой, для разных размеров квадратных плиток:

Lena squares size 100
img/lena-rgb-scaled_squares_size100.jpg
Lena squares size 50
img/lena-rgb-scaled_squares_size50.jpg

Można by wymyślić ciekawsze miary podobieństwa dwu kwadratowych kawałków obrazu, ale jeszcze nie próbowałem.

Można też sortować inne obrazki. Na przykład można wziąć okładkę płyty zespołu "Fanatic":

You could come up with more interesting measures of similarity between two square pieces of image, but I haven't tried yet.

You can also sort other images. For example, you can take the album cover of the band "Fanatic":

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

Можно также сортировать другие изображения. Например, можно взять обложку альбома группы "Fanatic":

Fanatic album cover
img/fanatic-rgb.jpg

I posortować leksykograficznie, po najbliższych sąsiadach... e, nic ciekawego, nie będę wam pokazywał. Ale posortowanie kwadracikami już jest całkiem fajne:

And sort lexicographically, by nearest neighbors... eh, nothing interesting, I won't show you. But sorting with squares is quite nice:

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

Fanatic squares size 95
img/fanatic-rgb_squares_size95.jpg
Fanatic squares size 40
img/fanatic-rgb_squares_size40.jpg

Można też sortować taką grafikę, która nie jest zdjęciem tylko rysunkiem rysowanym jednolitymi płaszczyznami i kreskami, z mniejszym szumem. Na przykład można wziąć takiego Reksia:

You can also sort graphics that are not photographs but drawings made with uniform planes and lines, with less noise. For example, you can take such a Reksio:

Можно также сортировать такую графику, которая не является фотографией, а рисунком, нарисованным однородными плоскостями и линиями, с меньшим шумом. Например, можно взять такого Рексио:

Reksio original
img/reksio-3.png

I posortować go leksykograficznie:

And sort it lexicographically:

И отсортировать его лексикографически:

Reksio lexicographic
img/reksio-3_lexicographic.png

Albo szukaniem kolejno najpodobniejszego wiersza:

Or by searching for the most similar row in sequence:

Или поиском последовательно наиболее похожей строки:

Reksio nearest neighbor
img/reksio-3_nearest_neighbor.png

Albo szukając takiego ułożenia wierszy, które zminimalizuje sumę różnic sąsiednich wierszy:

Or by looking for such an arrangement of rows that minimizes the sum of differences between adjacent rows:

Или ища такое расположение строк, которое минимизирует сумму различий соседних строк:

Reksio annealing
img/reksio-3_annealing.png

Albo kwadracikami:

Or with squares:

Или квадратиками:

Reksio squares size 40
img/reksio-3_squares_size40.png
Reksio squares size 20
img/reksio-3_squares_size20.png

Fajne efekty są kiedy się posortuje flagi różnych państw. Oczywiście nie takie flagi, co składają się z kilku poziomych barwnych pasów, ale na przykład flagę Czech:

Nice effects occur when you sort flags of different countries. Of course, not those flags that consist of several horizontal colored stripes, but for example the Czech flag:

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

Czech flag
img/flaga_czech.png

która posortowana leksykograficznie wygląda tak:

which sorted lexicographically looks like this:

который отсортированный лексикографически выглядит так:

Czech flag lexicographic
img/flaga_czech_lexicographic.png

A metodą szukania najpodobniejszego wiersza tak:

And by the method of searching for the most similar row like this:

А методом поиска наиболее похожей строки так:

Czech flag nearest neighbor
img/flaga_czech_nearest_neighbor.png

... a nie, to akurat nic ciekawego.

Ciekawie też wychodzi flaga UK:

... oh no, that's actually nothing interesting.

The UK flag also comes out interestingly:

... а нет, это как раз ничего интересного.

Интересно также получается флаг Великобритании:

UK flag
img/flaga_uk-3.png

Leksykograficznie mamy tak:

Lexicographically we have this:

Лексикографически у нас так:

UK flag lexicographic
img/flaga_uk-3_lexicographic.png

A jeśli jako klucz sortowania zamiast wartości pikseli weźmiemy różnice między pikselem a jego sąsiadem z lewej i to posortujemy alfabetycznie, to wychodzi tak:

And if as a sorting key instead of pixel values we take the differences between a pixel and its left neighbor and sort this alphabetically, it comes out like this:

А если в качестве ключа сортировки вместо значений пикселей возьмём различия между пикселем и его левым соседом и отсортируем это алфавитно, то получается так:

UK flag differences
img/flaga_uk-3_differences.png

Można też wziąć flagę USA:

You can also take the USA flag:

Можно также взять флаг США:

USA flag
img/flaga_usa-3.png

i posortować leksykograficznie:

and sort lexicographically:

и отсортировать лексикографически:

USA flag lexicographic
img/flaga_usa-3_lexicographic.png

Albo szukaniem najbliższego następnika:

Or by searching for the nearest successor:

Или поиском ближайшего преемника:

USA flag nearest neighbor
img/flaga_usa-3_nearest_neighbor.png

Albo szukaniem ułożenia które minimalizuje sumę różnic sąsiadujących wierszy, co po 554533 iteracjach daje:

Or by searching for an arrangement that minimizes the sum of differences between adjacent rows, which after 554533 iterations gives:

Или поиском расположения, которое минимизирует сумму различий соседних строк, что после 554533 итераций даёт:

USA flag annealing
img/flaga_usa-3_annealing-iter_0554533.png

Można nawet jako klucz sortowania użyć poziomego położenia środka masy danego wiersza:

You can even use the horizontal position of the center of mass of a given row as a sorting key:

Можно даже в качестве ключа сортировки использовать горизонтальное положение центра масс данной строки:

USA flag center of mass
img/flaga_usa-3_center_of_mass.png

Flaga Japonii:

Japan's flag:

Флаг Японии:

Japan flag
img/flaga_japonii-2.png

po posortowaniu wygląda tak, jak można się spodziewać:

after sorting looks as you might expect:

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

Japan flag lexicographic
img/flaga_japonii-2_lexicographic.png

Flaga Chin Wschodnich wygląda tak:

The flag of Eastern China looks like this:

Флаг Восточного Китая выглядит так:

Eastern China flag
img/flaga_chrl-2.png

i sortuje sie leksykograficznie do:

and sorts lexicographically to:

и сортируется лексикографически в:

Eastern China flag lexicographic
img/flaga_chrl-2_lexicographic.png

A flaga Chin Zachodnich:

And the flag of Western China:

А флаг Западного Китая:

Western China flag
img/flaga_chin-3.png

po posortowaniu leksykograficznym to:

after lexicographic sorting is:

после лексикографической сортировки это:

Western China flag lexicographic
img/flaga_chin-3_lexicographic.png

Koniecznie trzeba posortować flagę Brazylii:

You absolutely must sort the flag of Brazil:

Обязательно нужно отсортировать флаг Бразилии:

Brazil flag
img/flaga_brazylii-4.png

bo przecież sami na niej napisali że "ordem é progresso" (uwaga, z tym akcentem nad "e" to subtelny żart). Posortowana leksykograficznie wygląda tak:

because after all they themselves wrote on it that "ordem é progresso" (note, that accent over "e" is a subtle joke). Sorted lexicographically it looks like this:

потому что ведь они сами написали на нём, что "ordem é progresso" (внимание, этот акцент над "e" - тонкая шутка). Отсортированный лексикографически выглядит так:

Brazil flag lexicographic
img/flaga_brazylii-4_lexicographic.png

Na niej dzieje się tak dużo, że aż spróbowałem posortować kwadracikami, i nie pożałowałem:

So much is happening on it that I even tried sorting with squares, and I didn't regret it:

На нём происходит так много, что я даже попробовал отсортировать квадратиками, и не пожалел:

Brazil flag squares size 200
img/flaga_brazylii-rgb_squares_size200.png
Brazil flag squares size 100
img/flaga_brazylii-rgb_squares_size100.png
Brazil flag squares size 50
img/flaga_brazylii-rgb_squares_size50.png

I tak dalej można się bawić. Flaga Albanii:

And so on you can play. Albania's flag:

И так далее можно играть. Флаг Албании:

Albania flag
img/flaga_albanii-2.png
Albania flag lexicographic
img/flaga_albanii-2_lexicographic.png
Albania flag squares size 50
img/flaga_albanii-rgb_squares_size50.png
Albania flag squares size 100
img/flaga_albanii-rgb_squares_size100.png

Arabii Saudyjskiej:

Saudi Arabia:

Саудовской Аравии:

Saudi Arabia flag
img/flaga_arabii_saudyjskiej-2.png
Saudi Arabia flag lexicographic
img/flaga_arabii_saudyjskiej-2_lexicographic.png
Saudi Arabia flag squares size 100
img/flaga_arabii_saudyjskiej-rgb_squares_size100.png

Białorusi:

Belarus:

Беларуси:

Belarus flag
img/flaga_bialorusi-3.png
Belarus flag lexicographic
img/flaga_bialorusi-3_lexicographic.png

Oraz, last but not least, nasze godło:

And, last but not least, our coat of arms:

И, последнее, но не менее важное, наш герб:

Polish coat of arms
img/godlo_polski-4.png
Polish coat of arms lexicographic
img/godlo_polski-4_lexicographic.png
Polish coat of arms squares size 200
img/godlo_polski-rgb_squares_size200.png