Oberon space

General Category => Общий раздел => Тема начата: Губанов Сергей Юрьевич от Февраль 04, 2013, 01:29:07 pm

Название: Работа с растровыми изображениями
Отправлено: Губанов Сергей Юрьевич от Февраль 04, 2013, 01:29:07 pm
Увлёкся задачкой удаления шумов с фотографии, написал программку... экспериментирую. Получается не хуже чем в фотошопе. Алгоритмы бывают медленные, надо ждать ответа несколько минут. Когда много экспериментируешь, чуть изменяешь параметры, снова запускаешь, то ждать так много как бы не очень хочется. Понятно, что можно распараллелить на несколько ядер, но это даст ускорение всего в четыре раза (у меня 4 ядра). Да и не факт, что в 4, так как основной затык в памяти.

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

Если я разобью большой двумерный массив на много маленьких двумерных массивчиков (например 256 * 256), то каждый из них в кэш процессора будет убираться целиком и работа теоретически пойдёт "со скоростью света".

Латентность кэша:
L1 1 ns
L2 3 ns
L3 3.8 ns

Латентность хорошей памяти 1866 МГц где-то от 40 ns (у моей хуже, моя 1600 МГц).

Вот думаю, оно правда на одном ядре сразу же раз в десять-пятнадцать быстрее будет?  :-\ :-\ :-\ Стоит ли связываться...
Название: Re: Работа с растровыми изображениями
Отправлено: valexey_u от Февраль 04, 2013, 02:43:09 pm
Немного не в тему, но из вот этой (http://addconf.ru/event.sdf/ru/add_3/authors/AlexBourt/641) лекции/доклада, я вынес что в случае работы с графикой следует избавляться от ветвлений (ибо любой if существенно тормозит работу - ошибки предсказания и так далее появляются).

Ну и вообще лекция весьма познавательная была (пожалел что не успел к началу лекции тогда).
Название: Re: Работа с растровыми изображениями
Отправлено: igor от Февраль 04, 2013, 02:58:09 pm
Если я разобью большой двумерный массив на много маленьких двумерных массивчиков (например 256 * 256), то каждый из них в кэш процессора будет убираться целиком и работа теоретически пойдёт "со скоростью света".
А не возникнут ли при этом сложности с обработкой изображения на стыках этих массивчиков?
Название: Re: Работа с растровыми изображениями
Отправлено: Губанов Сергей Юрьевич от Февраль 04, 2013, 03:25:41 pm
А не возникнут ли при этом сложности с обработкой изображения на стыках этих массивчиков?
Сложности возникнут, поэтому и думаю стоит ли овчинка выделки...

Для борьбы с граничными сложностями можно, например, область 200 * 200 с исходного изображения взять с запасом в 25 пикселей по периметру, получим квадратик 250 * 250. Можно будет использовать алгоритмы, которые на 25 пикселей заглядывают "за границу". После обработки собрать изображение обратно беря из каждого квадратика 250 * 250  область 200 * 200 из середины. Особого перерасхода в вычислениях тут не будет ведь бегая по квадратику 250*250 вычисления-то будем делать только для центральных 200*200 пикселей, а в боковые только заглядывать.
Название: Re: Работа с растровыми изображениями
Отправлено: Губанов Сергей Юрьевич от Февраль 04, 2013, 09:12:23 pm
Ларчик открывался просто. Погонял свою программу на маленьких картинках. Зависимость времени работы алгоритма от количества пикселей картинки оказалась линейная начиная от размеров картинки 100*100 пикселей. Картинка размером 50*50 пикселей обрабатывалась совсем чуток быстрее чем должна бы если продолжить линейную зависимость в область малых размеров изображения. Короче, разбивка большой картинки на много маленьких выгоды в производительности не даёт.
Название: Re: Работа с растровыми изображениями
Отправлено: valexey_u от Февраль 04, 2013, 09:32:48 pm
Ларчик открывался просто. Погонял свою программу на маленьких картинках. Зависимость времени работы алгоритма от количества пикселей картинки оказалась линейная начиная от размеров картинки 100*100 пикселей. Картинка размером 50*50 пикселей обрабатывалась совсем чуток быстрее чем должна бы если продолжить линейную зависимость в область малых размеров изображения. Короче, разбивка большой картинки на много маленьких выгоды в производительности не даёт.
Уточнение - на твоем алгоритме (и даже реализации алгоритма).
Название: Re: Работа с растровыми изображениями
Отправлено: Губанов Сергей Юрьевич от Февраль 05, 2013, 01:40:32 pm
На моём алгоритме затыка по мамяти точно нет. Разбил на три потока (по каналам: красный, зелёный, синий), ускорилось почти в три раза.
Название: Re: Работа с растровыми изображениями
Отправлено: valexey_u от Февраль 05, 2013, 01:43:42 pm
На моём алгоритме затыка по мамяти точно нет. Разбил на три потока (по каналам: красный, зелёный, синий), ускорилось почти в три раза.
Возможно поэтому при переносе в кэш и не было ускорения на порядок?
Название: Re: Работа с растровыми изображениями
Отправлено: Губанов Сергей Юрьевич от Февраль 05, 2013, 01:49:26 pm
Возможно поэтому при переносе в кэш и не было ускорения на порядок?
Конечно по этому. Но я этого тогда не знал. Я думал память работает более медленно.
Название: Re: Работа с растровыми изображениями
Отправлено: Губанов Сергей Юрьевич от Февраль 20, 2013, 11:29:21 am
Век живи - век учись. Я чуть со стула не упал, гляньте оказывается что можно делать:

ImageDeconvolve Restore a blurred image
http://reference.wolfram.com/mathematica/ref/ImageDeconvolve.html

Спросил у коллеги-программиста в прошлом физика (он закончил Физфак кафедру Информационных технологий), да говорит, им на лекциях это читали. У оператора "расфокусировки" существует (примерно) обратный оператор. Применив его к расфокусированному изображению можно (примерно) получить исходное.


Название: Re: Работа с растровыми изображениями
Отправлено: valexey_u от Февраль 20, 2013, 11:36:51 am
Век живи - век учись. Я чуть со стула не упал, гляньте оказывается что можно делать:

ImageDeconvolve Restore a blurred image
http://reference.wolfram.com/mathematica/ref/ImageDeconvolve.html

Спросил у коллеги-программиста в прошлом физика (он закончил Физфак кафедру Информационных технологий), да говорит, им на лекциях это читали. У оператора "расфокусировки" существует (примерно) обратный оператор. Применив его к расфокусированному изображению можно (примерно) получить исходное.
Вот это ж ни фига себе! Ну, то есть я подозревал что такое возможно, но впервые это вижу живьем.

А это именно расфокусировку (то есть оптическую), или же какой-то из блюров "отменяет" (блюры они же разные бывают)?
Название: Re: Работа с растровыми изображениями
Отправлено: Губанов Сергей Юрьевич от Февраль 20, 2013, 12:31:12 pm
Типа да, моделирует расфокусировку оптическую в линзах.

Ещё моделируют расфокусировку на слабых облаках (это нужно когда из космоса фотографируют наземный объект скрытый облаками).

Конечно если абы каким блюром картинку загадишь, то назад уже не вернёшь.
Название: Re: Работа с растровыми изображениями
Отправлено: igor от Февраль 20, 2013, 04:26:33 pm
У оператора "расфокусировки" существует (примерно) обратный оператор. Применив его к расфокусированному изображению можно (примерно) получить исходное.
Интересно. Выходит, что расфокусированое изображение содержит почти столько же информации, сколько сфокусированное. Довольно неожиданно. (Тогда, в принципе, некоторые старые фотки можно повосстанавливать  :) )
Название: Re: Работа с растровыми изображениями
Отправлено: vlad от Февраль 20, 2013, 04:49:12 pm
Интересно. Выходит, что расфокусированое изображение содержит почти столько же информации, сколько сфокусированное. Довольно неожиданно.

Угу. А я всегда плевался, когда в каком-нибудь шпионском фильме "улучшали картинку" простым нажатием кнопки :)
Название: Re: Работа с растровыми изображениями
Отправлено: igor от Февраль 20, 2013, 05:34:28 pm
А я помню как в одном научно-популярном фильме астроном (женщина) рассказывала, что они улучшали снимки участков звёздного неба. Правда там речь шла не о расфокусировке, а о влиянии атмосферы. Она даже привела пример: "Как если бы вы смотрели на камушки на дне пруда через рябь на поверхности воды". Они делают много фотографий одного и того же участка неба, на которых ни фига не разобрать, затем обрабатывают их на компьютере, и получают снимок довольно сносного качества.
Название: Re: Работа с растровыми изображениями
Отправлено: vlad от Февраль 20, 2013, 05:39:53 pm
Они делают много фотографий одного и того же участка неба, на которых ни фига не разобрать, затем обрабатывают их на компьютере, и получают снимок довольно сносного качества.

Не, такой подход вполне укладывается в общие рассуждения. А вот восстановление по одной картинке - нет. Т.е., не получается представить, что одно размытое изображение может нести такое же количество информации (почти) как и сфокусированное.
Название: Re: Работа с растровыми изображениями
Отправлено: valexey_u от Февраль 20, 2013, 06:00:18 pm
Интересно. Выходит, что расфокусированое изображение содержит почти столько же информации, сколько сфокусированное. Довольно неожиданно.

Угу. А я всегда плевался, когда в каком-нибудь шпионском фильме "улучшали картинку" простым нажатием кнопки :)
На самом деле любые улучшизмы картинок не увеличивают информацию в картинке, в лучшем случае - не уменьшают её. Эти "улучшения" - всего лишь приводят информацию в форму более удобоваримую для обработки обученной нейросеткой, что у нас в мозгу.

Пока со всеми этими нашими фотоплетизмограммами игрался, убедился что качество обработки информации мозгом сильно (очень сильно!) зависит от её (информации) формы. Чуть меняешь масштаб графика относительно того масштаба к которому уже привык, и все, пульса на фотоплетизмограмме уже не видишь. Или там тип отрисовки поменяешь, или даже банально цвет. Зато если уж информация в нужной форме, то "глаз" (на самом деле мозг) распознает пульс на фотоплетизмограмме много лучше чем любые алгоритмы. (но случаются конечно факапы - мозг иногда распознает пульс там, где его абсолютно точно нет :-) )

Интересно, возможно ли обучить наш мозг работать с расфокусированным изображением (и при этом не работать со сфокусированным)?
Название: Re: Работа с растровыми изображениями
Отправлено: Губанов Сергей Юрьевич от Февраль 20, 2013, 06:58:58 pm
Попробовал. Сфотографировал объект несфокусированно. Загнал испорченную фотку в Mathematica 9. И ни чего путного пока не вышло. Наверное всё обман :) :) :)
Название: Re: Работа с растровыми изображениями
Отправлено: Romiras от Февраль 20, 2013, 09:22:32 pm
Попробовал. Сфотографировал объект несфокусированно. Загнал испорченную фотку в Mathematica 9. И ни чего путного пока не вышло. Наверное всё обман :) :) :)
Не. Я могу ошибаться, но по-моему это зависит от параметров ядра свёртки (convolution). Если размер и/или коэффиценты ядра другие, то обратный эффект не получится. Поэтому нужно знать какими коэффициентами ядра было проделана фильтрация. Только тогда получишь исходное изображение.

GIMP: 8.2. Матрица конволюции (http://docs.gimp.org/ru/plug-in-convmatrix.html)

New Efficient Approach to Blind Deconvolution of Images Discovered. March 2000 (http://math.nist.gov/mcsd/highlights/blinddeconvolution.html)
Название: Re: Работа с растровыми изображениями
Отправлено: Geniepro от Февраль 21, 2013, 06:09:23 am
Интересно. Выходит, что расфокусированое изображение содержит почти столько же информации, сколько сфокусированное. Довольно неожиданно.

Угу. А я всегда плевался, когда в каком-нибудь шпионском фильме "улучшали картинку" простым нажатием кнопки :)

Ненене. Депикселизация -- это совсем другое же. Там уже чистая чушь...
Название: Re: Работа с растровыми изображениями
Отправлено: Губанов Сергей Юрьевич от Февраль 21, 2013, 08:55:14 am
Не. Я могу ошибаться, но по-моему это зависит от параметров ядра свёртки (convolution). Если размер и/или коэффиценты ядра другие, то обратный эффект не получится. Поэтому нужно знать какими коэффициентами ядра было проделана фильтрация. Только тогда получишь исходное изображение.
Это мне понятно. Мне пока непонятно откуда взять оператор обратный оператору дефокусировки конкретно моего фотоаппарата.
Название: Re: Работа с растровыми изображениями
Отправлено: ilovb от Февраль 21, 2013, 09:50:54 am
Восстановление расфокусированных и смазанных изображений (http://habrahabr.ru/post/136853/)
Название: Re: Работа с растровыми изображениями
Отправлено: vlad от Февраль 21, 2013, 03:30:15 pm
Угу. А я всегда плевался, когда в каком-нибудь шпионском фильме "улучшали картинку" простым нажатием кнопки :)
(http://www.lolwtfcomics.com/upload/uploads/1317571091.jpg)
Название: Re: Работа с растровыми изображениями
Отправлено: valexey_u от Март 13, 2013, 04:11:58 pm
Век живи - век учись. Я чуть со стула не упал, гляньте оказывается что можно делать:

ImageDeconvolve Restore a blurred image
http://reference.wolfram.com/mathematica/ref/ImageDeconvolve.html

Спросил у коллеги-программиста в прошлом физика (он закончил Физфак кафедру Информационных технологий), да говорит, им на лекциях это читали. У оператора "расфокусировки" существует (примерно) обратный оператор. Применив его к расфокусированному изображению можно (примерно) получить исходное.

Кстати, для того же фотошопа вроде бы есть же плагины которые этим делом занимаются - искать по слову deconvolution.
Название: Re: Работа с растровыми изображениями
Отправлено: valexey_u от Март 13, 2013, 04:20:47 pm
Собственно вот пример работы в фотошопе: http://www.youtube.com/watch?v=ZT8SgJVHAO8
Название: Re: Работа с растровыми изображениями
Отправлено: valexey_u от Март 13, 2013, 05:13:13 pm
Ну и наконец я добрался до хабра. Оказывается там была серия из двух очень хороших статей.
Первая с теорией: http://habrahabr.ru/post/136853/
И вторая с практикой и реализацией всех этих алгоритмов на С++ в виде готового GUI-приложения (исходники доступны): http://habrahabr.ru/post/147828/
Название: Re: Работа с растровыми изображениями
Отправлено: valexey_u от Март 13, 2013, 05:15:58 pm
Ну и эта технология в фотошопе: http://habrahabr.ru/post/130198/
Название: Re: Работа с растровыми изображениями
Отправлено: valexey_u от Март 13, 2013, 06:12:38 pm
Ну и эта технология в фотошопе: http://habrahabr.ru/post/130198/
Видео в нормальном качестве (где действительно ВИДНО что фотошоп делает): http://tv.adobe.com/watch/max-2011-sneak-peeks/max-2011-sneak-peek-image-deblurring/
Название: Re: Работа с растровыми изображениями
Отправлено: valexey_u от Март 13, 2013, 11:31:38 pm
Поигрался с приложением.

Сфоткал йфоном текст квитанции (там где мелкий шрифт) от ростелекома с очень близкой дистанции (сфокусироваться на такое расстояние йфон просто физически не может). Получилась вот такая фотка:

(http://cdn.imghack.se/images/3c96a71df357b6d98b7b1a4425e5ae84.png) (http://cdn.imghack.se/images/3c96a71df357b6d98b7b1a4425e5ae84.png)

Поигрался с настройками программулины, получил вот такое:

(http://cdn.imghack.se/images/5cd1046fd401cf50ead173ad1aa4dffb.png) (http://cdn.imghack.se/images/5cd1046fd401cf50ead173ad1aa4dffb.png)

Желающие могут воспроизвести эксперимент :-)
Название: Re: Работа с растровыми изображениями
Отправлено: valexey_u от Апрель 06, 2013, 08:23:55 pm
Свежая статья по blind deconvolution: http://habrahabr.ru/post/175717/
Название: Re: Работа с растровыми изображениями
Отправлено: Губанов Сергей Юрьевич от Июль 10, 2013, 11:40:50 am
В новейшем Фотошопе добавлены обсуждённые здесь фичи.

Кстати, его кажись уже сломали
http://www.lavteam.net/soft/
Название: Re: Работа с растровыми изображениями
Отправлено: Губанов Сергей Юрьевич от Июль 21, 2013, 05:00:15 pm
По наводке с RSDN-а, подборка алгоритмов обработки изображений (на C#):

http://softwarebydefault.com/2013/06/09/image-blur-filters/

C# How to: Image Transform Rotate | Software by Default
C# How to: Image Transform Shear | Software by Default
C# How to: Compass Edge Detection | Software by Default
C# How to: Oil Painting and Cartoon Filter | Software by Default
C# How to: Stained Glass Image Filter | Software by Default
C# How to: Calculating Gaussian Kernels | Software by Default
C# How to: Image Cartoon Effect | Software by Default
C# How to: Boolean Edge Detection | Software by Default
C# How to: Morphological Edge Detection | Software by Default
C# How to: Image Erosion and Dilation | Software by Default
C# How to: Image Colour Average | Software by Default
C# How to: Image Unsharp Mask | Software by Default
C# How to: Image Median Filter | Software by Default
C# How to: Difference Of Gaussians | Software by Default
C# How to: Image Edge Detection | Software by Default
C# How to: Image Convolution | Software by Default
C# How to: Generate a Web Service from WSDL | Software by Default
C# How to: Decoding/Converting Base64 strings to Bitmap images | Software by Default
C# How to: Bitmap Colour Substitution implementing thresholds | Software by Default
C# How to: Swapping Bitmap ARGB Colour Channels | Software by Default
C# How to: Image filtering by directly manipulating Pixel ARGB values | Software by Default
C# How to: Image ASCII Art | Software by Default
C# How to: Weighted Difference of Gaussians | Software by Default
C# How to: Image Boundary Extraction | Software by Default
Название: Re: Работа с растровыми изображениями
Отправлено: valexey_u от Июль 21, 2013, 05:44:39 pm
По наводке с RSDN-а, подборка алгоритмов обработки изображений (на C#):

http://softwarebydefault.com/2013/06/09/image-blur-filters/

C# How to: Image Transform Rotate | Software by Default
C# How to: Image Transform Shear | Software by Default
C# How to: Compass Edge Detection | Software by Default
C# How to: Oil Painting and Cartoon Filter | Software by Default
C# How to: Stained Glass Image Filter | Software by Default
C# How to: Calculating Gaussian Kernels | Software by Default
C# How to: Image Cartoon Effect | Software by Default
C# How to: Boolean Edge Detection | Software by Default
C# How to: Morphological Edge Detection | Software by Default
C# How to: Image Erosion and Dilation | Software by Default
C# How to: Image Colour Average | Software by Default
C# How to: Image Unsharp Mask | Software by Default
C# How to: Image Median Filter | Software by Default
C# How to: Difference Of Gaussians | Software by Default
C# How to: Image Edge Detection | Software by Default
C# How to: Image Convolution | Software by Default
C# How to: Generate a Web Service from WSDL | Software by Default
C# How to: Decoding/Converting Base64 strings to Bitmap images | Software by Default
C# How to: Bitmap Colour Substitution implementing thresholds | Software by Default
C# How to: Swapping Bitmap ARGB Colour Channels | Software by Default
C# How to: Image filtering by directly manipulating Pixel ARGB values | Software by Default
C# How to: Image ASCII Art | Software by Default
C# How to: Weighted Difference of Gaussians | Software by Default
C# How to: Image Boundary Extraction | Software by Default
Какие трудоемкости у данных реализаций алгоритмов?
Название: Re: Работа с растровыми изображениями
Отправлено: Губанов Сергей Юрьевич от Июль 22, 2013, 11:40:26 am
Какие трудоемкости у данных реализаций алгоритмов?
Посмотрел несколько примеров. Пожалуй там больше трудоёмкостей связано с тем чтобы открыть/сохранить/нарисовать картинку в окошке/написать обработчики для кнопок. И там вроде все алгоритмы дурацкие - только и делают, что портят исходную фотографию.
Название: Re: Работа с растровыми изображениями
Отправлено: valexey_u от Июль 22, 2013, 02:17:11 pm
Какие трудоемкости у данных реализаций алгоритмов?
Посмотрел несколько примеров. Пожалуй там больше трудоёмкостей связано с тем чтобы открыть/сохранить/нарисовать картинку в окошке/написать обработчики для кнопок. И там вроде все алгоритмы дурацкие - только и делают, что портят исходную фотографию.
Не, я спрашивал про алгоритмическую сложность в терминах О-большого.
Название: Re: Работа с растровыми изображениями
Отправлено: Губанов Сергей Юрьевич от Июль 23, 2013, 08:48:42 am
Алгоритмическая сложность там самая сложная + отягощённая сборщико-мусорными аллокациями памяти.
Название: Re: Работа с растровыми изображениями
Отправлено: valexey_u от Июль 23, 2013, 10:52:38 am
Не помню, кидал я про математическую морфологию, или нет:
http://habrahabr.ru/post/113626/
Ну и вики (http://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D0%BC%D0%BE%D1%80%D1%84%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F)
Название: Re: Работа с растровыми изображениями
Отправлено: Romiras от Июль 23, 2013, 10:56:35 am
Возможно, на Фортране код был бы проще, так как работает с матрицами, а не напрямую с моделью памяти.
Название: Re: Работа с растровыми изображениями
Отправлено: valexey_u от Июль 23, 2013, 11:19:52 am
Возможно, на Фортране код был бы проще, так как работает с матрицами, а не напрямую с моделью памяти.
Ну, фортран для ЧМ вообще няшечка.
Название: Re: Работа с растровыми изображениями
Отправлено: DddIzer от Июль 25, 2013, 08:28:46 am
Возможно, на Фортране код был бы проще, так как работает с матрицами, а не напрямую с моделью памяти.
Ну, фортран для ЧМ вообще няшечка.
только в том случае если существующие реализации алгоритмов  удовлетворяют вас по всем параметрам (ширпотреб), но интересные задачи, как правило, не решаются удовлетворительно стандартными реализациями.
Название: Re: Работа с растровыми изображениями
Отправлено: Romiras от Июль 25, 2013, 09:38:21 pm
The Julia language (http://julialang.org/)
Цитировать
In contrast with both Matlab and JavaScript, Julia has a more comprehensive approach to eliminating overhead that allows it to consistently optimize all kinds of code for arbitrary user-defined data types, not just certain special cases.
Название: Re: Работа с растровыми изображениями
Отправлено: valexey_u от Июль 25, 2013, 10:25:32 pm
The Julia language (http://julialang.org/)
Цитировать
In contrast with both Matlab and JavaScript, Julia has a more comprehensive approach to eliminating overhead that allows it to consistently optimize all kinds of code for arbitrary user-defined data types, not just certain special cases.
Ой, помню сколько-то копий на оберонкоре об эту Джулию тогда сломали. Info21 на нее что-то активно фырчал. :-)
Название: Re: Работа с растровыми изображениями
Отправлено: Губанов Сергей Юрьевич от Июнь 06, 2014, 07:07:53 pm
Физика усиления резкости цифровой фотографии
http://dxdy.ru/topic85170.html

Оригинальное изображение (100% кроп без обработки):
(http://s1.hostingkartinok.com/uploads/images/2014/06/6d59a96a8dab7aa30d66dd1219f8b93d.jpg)

Результат обработки:
(http://s1.hostingkartinok.com/uploads/images/2014/06/3fede4b6f7677ca2ec8ab4c0de53b453.jpg)