СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

| сохранено

H Как я фотографию восстанавливал в черновиках Из песочницы

Привет, хотел сегодня рассказать о том, как я написал алгоритм восстанавления изображения. Началось с того что читая статьи про восстанавление изображений я сильно завидовать тем кто понимал всё это и считал что мне никогда не написать что то на столько крутое, но я сильно ошибался! Скажу тебе по секрету — математику я знаю очень плохо, грубо говоря из неё я знаю только название цифр… Это конечно очень нужная для программирования область знания, но я не прекращаю убеждаться в том что и без неё можно добиться многого.

image

Я уже достаточно много времени работаю в сфере веб-разработки, поэтому решил не тратить время и писать на том языке, в котором чувствую себя комфортно — JavaScript. Да, да, не удивляйся. Язык написания не важен, главное получить необходимый результат.

Для начала я начал написание основного алгоритма, он у меня выглядела в виде небольшого объекта с памятью и функциями для работы с данными. А способ его работы больше похож на ассоциативную память, чем на какую то сложную математическую формулу.

image

В массиве data хранятся данные для обработки, я решил, что самый удобный способ хранить их будет как объект в котором ключ элемента — это результат, а содержимое — это массив, с данными приводящий нас к этому самому ответу.

{
	"#8c1d25": [1412941, 0, 1413141, 0, 1433141, 0, 1433141, 1412941, 0, 0, 1423141, 1423141, 1433241, 0, 0, 1412941, 0, 1402840, 1433141, 1402941]
}

С функциями я думаю и без объяснения понятно, так что просто расскажу о самых важных функциях:

  • update - После добавления новго объекта нам обязательно нужно будет эго обновить, ведь один и тот же результат может быть получен исходя из разных вариантах полученных данных, поэтому если у меня уже имеется такой объект я просто суммирую данные в нём с новыми, после чего делю на 2 и поучаю среднее значение (наиболее вероятное сочетание данных).

  • compare - Я подаю сюда название объекта, с которым хочу проверить и массив с данными, функция после обработки выдаёт процентное соотношение полученных данных с данными в нейроне.

Шаг 1


А теперь самое время рассказать о том, как же я восстанавливаю изображения. И так для начала я загружаю испорченную фотографию, в которой чёрный пиксель считается пустым. Если есть необходимость, то считать испорченным можно любой цвет и даже прозрачность.

Шаг 2


Алгоритм перебирает все, не пустые пиксели и запоминает, какие цвета находятся вокруг этого цвета в радиусе 2 пикселя. Каждый цвет сохраняется как огромное число, но по сути я просто объединяю подряд RGB (например красный цвет будет: 255.0.0 | 25500). Если цвет уже встречался, то я не перезаписываю его, а получаю средний цвет между новыми и старыми данными, каждого соседнего пикселя. Для уточнения хочу сказать, что сеть можно обучать и по другим фоткам, можно загрузить в неё несколько похожих изображений и тогда она восстановит испорченную фотку до идеального состояния.

Вид записи
image
{
	"#ff9300": [255695, 255880, 2551230, 2551110, 2551700, 2551350, 2551110, 2552050]
}


Шаг 3


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

Brain.search.neuron([255582, 2528910, 2451260, 25511120, 2301300, 2551350, 2551110, 2552050])
// {
//   neuron: "#ff9300"
//   compare: 60
// }

Шаг 4


Если совпадение больше 20%, то цвет можно считать пригодным и мы его вставляем, если же меньше, то я просто пытаюсь сгенерировать новый цвет, взяв средний цвет между всеми вокруг и записав эго в памяти.

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



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


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

www.google.lv/search?q=landscape&biw=1366&bih=678&espv=2&tbs=isz:ex,iszw:400,iszh:400&tbm=isch&source=lnt

Вот некоторые полученные результаты:

image
image
image
image
image

комментарии (6)

+3
Randl ,  

А если вместо шума кусок вырезать?

+2
gasizdat ,  
Извиняюсь, а вы точно уверены, что разобрались что такое нейросеть, как она работает и как ее использовать?
+2
fireSparrow ,  
Это даже близко не нейросеть
+1
+2 –1
lizarge ,  
Зачем это здесь? Лучше распубликуйте «статью»
0
+1 –1
drafterleo ,  
Это ж матричный фильтр, вроде. Но если автор сам додумался, то ему, конечно, респект — как бы он это ни называл :).
+1
alexover ,  
От импульсного шума и шума типа соль и перец легко спасает медианная или низкочастотная фильтрация.