Oberon space
General Category => Общий раздел => Тема начата: Губанов Сергей Юрьевич от Февраль 04, 2013, 01:29:07 pm
-
Увлёкся задачкой удаления шумов с фотографии, написал программку... экспериментирую. Получается не хуже чем в фотошопе. Алгоритмы бывают медленные, надо ждать ответа несколько минут. Когда много экспериментируешь, чуть изменяешь параметры, снова запускаешь, то ждать так много как бы не очень хочется. Понятно, что можно распараллелить на несколько ядер, но это даст ускорение всего в четыре раза (у меня 4 ядра). Да и не факт, что в 4, так как основной затык в памяти.
Программа скачет по большущему двумерному массиву вещественных чисел, который в кэш процессора, конечно же, целиком не помещается. То есть куча времени тратится на загрузку данных из памяти в процессор.
Если я разобью большой двумерный массив на много маленьких двумерных массивчиков (например 256 * 256), то каждый из них в кэш процессора будет убираться целиком и работа теоретически пойдёт "со скоростью света".
Латентность кэша:
L1 1 ns
L2 3 ns
L3 3.8 ns
Латентность хорошей памяти 1866 МГц где-то от 40 ns (у моей хуже, моя 1600 МГц).
Вот думаю, оно правда на одном ядре сразу же раз в десять-пятнадцать быстрее будет? :-\ :-\ :-\ Стоит ли связываться...
-
Немного не в тему, но из вот этой (http://addconf.ru/event.sdf/ru/add_3/authors/AlexBourt/641) лекции/доклада, я вынес что в случае работы с графикой следует избавляться от ветвлений (ибо любой if существенно тормозит работу - ошибки предсказания и так далее появляются).
Ну и вообще лекция весьма познавательная была (пожалел что не успел к началу лекции тогда).
-
Если я разобью большой двумерный массив на много маленьких двумерных массивчиков (например 256 * 256), то каждый из них в кэш процессора будет убираться целиком и работа теоретически пойдёт "со скоростью света".
А не возникнут ли при этом сложности с обработкой изображения на стыках этих массивчиков?
-
А не возникнут ли при этом сложности с обработкой изображения на стыках этих массивчиков?
Сложности возникнут, поэтому и думаю стоит ли овчинка выделки...
Для борьбы с граничными сложностями можно, например, область 200 * 200 с исходного изображения взять с запасом в 25 пикселей по периметру, получим квадратик 250 * 250. Можно будет использовать алгоритмы, которые на 25 пикселей заглядывают "за границу". После обработки собрать изображение обратно беря из каждого квадратика 250 * 250 область 200 * 200 из середины. Особого перерасхода в вычислениях тут не будет ведь бегая по квадратику 250*250 вычисления-то будем делать только для центральных 200*200 пикселей, а в боковые только заглядывать.
-
Ларчик открывался просто. Погонял свою программу на маленьких картинках. Зависимость времени работы алгоритма от количества пикселей картинки оказалась линейная начиная от размеров картинки 100*100 пикселей. Картинка размером 50*50 пикселей обрабатывалась совсем чуток быстрее чем должна бы если продолжить линейную зависимость в область малых размеров изображения. Короче, разбивка большой картинки на много маленьких выгоды в производительности не даёт.
-
Ларчик открывался просто. Погонял свою программу на маленьких картинках. Зависимость времени работы алгоритма от количества пикселей картинки оказалась линейная начиная от размеров картинки 100*100 пикселей. Картинка размером 50*50 пикселей обрабатывалась совсем чуток быстрее чем должна бы если продолжить линейную зависимость в область малых размеров изображения. Короче, разбивка большой картинки на много маленьких выгоды в производительности не даёт.
Уточнение - на твоем алгоритме (и даже реализации алгоритма).
-
На моём алгоритме затыка по мамяти точно нет. Разбил на три потока (по каналам: красный, зелёный, синий), ускорилось почти в три раза.
-
На моём алгоритме затыка по мамяти точно нет. Разбил на три потока (по каналам: красный, зелёный, синий), ускорилось почти в три раза.
Возможно поэтому при переносе в кэш и не было ускорения на порядок?
-
Возможно поэтому при переносе в кэш и не было ускорения на порядок?
Конечно по этому. Но я этого тогда не знал. Я думал память работает более медленно.
-
Век живи - век учись. Я чуть со стула не упал, гляньте оказывается что можно делать:
ImageDeconvolve Restore a blurred image
http://reference.wolfram.com/mathematica/ref/ImageDeconvolve.html
Спросил у коллеги-программиста в прошлом физика (он закончил Физфак кафедру Информационных технологий), да говорит, им на лекциях это читали. У оператора "расфокусировки" существует (примерно) обратный оператор. Применив его к расфокусированному изображению можно (примерно) получить исходное.
-
Век живи - век учись. Я чуть со стула не упал, гляньте оказывается что можно делать:
ImageDeconvolve Restore a blurred image
http://reference.wolfram.com/mathematica/ref/ImageDeconvolve.html
Спросил у коллеги-программиста в прошлом физика (он закончил Физфак кафедру Информационных технологий), да говорит, им на лекциях это читали. У оператора "расфокусировки" существует (примерно) обратный оператор. Применив его к расфокусированному изображению можно (примерно) получить исходное.
Вот это ж ни фига себе! Ну, то есть я подозревал что такое возможно, но впервые это вижу живьем.
А это именно расфокусировку (то есть оптическую), или же какой-то из блюров "отменяет" (блюры они же разные бывают)?
-
Типа да, моделирует расфокусировку оптическую в линзах.
Ещё моделируют расфокусировку на слабых облаках (это нужно когда из космоса фотографируют наземный объект скрытый облаками).
Конечно если абы каким блюром картинку загадишь, то назад уже не вернёшь.
-
У оператора "расфокусировки" существует (примерно) обратный оператор. Применив его к расфокусированному изображению можно (примерно) получить исходное.
Интересно. Выходит, что расфокусированое изображение содержит почти столько же информации, сколько сфокусированное. Довольно неожиданно. (Тогда, в принципе, некоторые старые фотки можно повосстанавливать :) )
-
Интересно. Выходит, что расфокусированое изображение содержит почти столько же информации, сколько сфокусированное. Довольно неожиданно.
Угу. А я всегда плевался, когда в каком-нибудь шпионском фильме "улучшали картинку" простым нажатием кнопки :)
-
А я помню как в одном научно-популярном фильме астроном (женщина) рассказывала, что они улучшали снимки участков звёздного неба. Правда там речь шла не о расфокусировке, а о влиянии атмосферы. Она даже привела пример: "Как если бы вы смотрели на камушки на дне пруда через рябь на поверхности воды". Они делают много фотографий одного и того же участка неба, на которых ни фига не разобрать, затем обрабатывают их на компьютере, и получают снимок довольно сносного качества.
-
Они делают много фотографий одного и того же участка неба, на которых ни фига не разобрать, затем обрабатывают их на компьютере, и получают снимок довольно сносного качества.
Не, такой подход вполне укладывается в общие рассуждения. А вот восстановление по одной картинке - нет. Т.е., не получается представить, что одно размытое изображение может нести такое же количество информации (почти) как и сфокусированное.
-
Интересно. Выходит, что расфокусированое изображение содержит почти столько же информации, сколько сфокусированное. Довольно неожиданно.
Угу. А я всегда плевался, когда в каком-нибудь шпионском фильме "улучшали картинку" простым нажатием кнопки :)
На самом деле любые улучшизмы картинок не увеличивают информацию в картинке, в лучшем случае - не уменьшают её. Эти "улучшения" - всего лишь приводят информацию в форму более удобоваримую для обработки обученной нейросеткой, что у нас в мозгу.
Пока со всеми этими нашими фотоплетизмограммами игрался, убедился что качество обработки информации мозгом сильно (очень сильно!) зависит от её (информации) формы. Чуть меняешь масштаб графика относительно того масштаба к которому уже привык, и все, пульса на фотоплетизмограмме уже не видишь. Или там тип отрисовки поменяешь, или даже банально цвет. Зато если уж информация в нужной форме, то "глаз" (на самом деле мозг) распознает пульс на фотоплетизмограмме много лучше чем любые алгоритмы. (но случаются конечно факапы - мозг иногда распознает пульс там, где его абсолютно точно нет :-) )
Интересно, возможно ли обучить наш мозг работать с расфокусированным изображением (и при этом не работать со сфокусированным)?
-
Попробовал. Сфотографировал объект несфокусированно. Загнал испорченную фотку в Mathematica 9. И ни чего путного пока не вышло. Наверное всё обман :) :) :)
-
Попробовал. Сфотографировал объект несфокусированно. Загнал испорченную фотку в 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)
-
Интересно. Выходит, что расфокусированое изображение содержит почти столько же информации, сколько сфокусированное. Довольно неожиданно.
Угу. А я всегда плевался, когда в каком-нибудь шпионском фильме "улучшали картинку" простым нажатием кнопки :)
Ненене. Депикселизация -- это совсем другое же. Там уже чистая чушь...
-
Не. Я могу ошибаться, но по-моему это зависит от параметров ядра свёртки (convolution). Если размер и/или коэффиценты ядра другие, то обратный эффект не получится. Поэтому нужно знать какими коэффициентами ядра было проделана фильтрация. Только тогда получишь исходное изображение.
Это мне понятно. Мне пока непонятно откуда взять оператор обратный оператору дефокусировки конкретно моего фотоаппарата.
-
Восстановление расфокусированных и смазанных изображений (http://habrahabr.ru/post/136853/)
-
Угу. А я всегда плевался, когда в каком-нибудь шпионском фильме "улучшали картинку" простым нажатием кнопки :)
(http://www.lolwtfcomics.com/upload/uploads/1317571091.jpg)
-
Век живи - век учись. Я чуть со стула не упал, гляньте оказывается что можно делать:
ImageDeconvolve Restore a blurred image
http://reference.wolfram.com/mathematica/ref/ImageDeconvolve.html
Спросил у коллеги-программиста в прошлом физика (он закончил Физфак кафедру Информационных технологий), да говорит, им на лекциях это читали. У оператора "расфокусировки" существует (примерно) обратный оператор. Применив его к расфокусированному изображению можно (примерно) получить исходное.
Кстати, для того же фотошопа вроде бы есть же плагины которые этим делом занимаются - искать по слову deconvolution.
-
Собственно вот пример работы в фотошопе: http://www.youtube.com/watch?v=ZT8SgJVHAO8
-
Ну и наконец я добрался до хабра. Оказывается там была серия из двух очень хороших статей.
Первая с теорией: http://habrahabr.ru/post/136853/
И вторая с практикой и реализацией всех этих алгоритмов на С++ в виде готового GUI-приложения (исходники доступны): http://habrahabr.ru/post/147828/
-
Ну и эта технология в фотошопе: http://habrahabr.ru/post/130198/
-
Ну и эта технология в фотошопе: http://habrahabr.ru/post/130198/
Видео в нормальном качестве (где действительно ВИДНО что фотошоп делает): http://tv.adobe.com/watch/max-2011-sneak-peeks/max-2011-sneak-peek-image-deblurring/
-
Поигрался с приложением.
Сфоткал йфоном текст квитанции (там где мелкий шрифт) от ростелекома с очень близкой дистанции (сфокусироваться на такое расстояние йфон просто физически не может). Получилась вот такая фотка:
(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)
Желающие могут воспроизвести эксперимент :-)
-
Свежая статья по blind deconvolution: http://habrahabr.ru/post/175717/
-
В новейшем Фотошопе добавлены обсуждённые здесь фичи.
Кстати, его кажись уже сломали
http://www.lavteam.net/soft/
-
По наводке с 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
-
По наводке с 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
Какие трудоемкости у данных реализаций алгоритмов?
-
Какие трудоемкости у данных реализаций алгоритмов?
Посмотрел несколько примеров. Пожалуй там больше трудоёмкостей связано с тем чтобы открыть/сохранить/нарисовать картинку в окошке/написать обработчики для кнопок. И там вроде все алгоритмы дурацкие - только и делают, что портят исходную фотографию.
-
Какие трудоемкости у данных реализаций алгоритмов?
Посмотрел несколько примеров. Пожалуй там больше трудоёмкостей связано с тем чтобы открыть/сохранить/нарисовать картинку в окошке/написать обработчики для кнопок. И там вроде все алгоритмы дурацкие - только и делают, что портят исходную фотографию.
Не, я спрашивал про алгоритмическую сложность в терминах О-большого.
-
Алгоритмическая сложность там самая сложная + отягощённая сборщико-мусорными аллокациями памяти.
-
Не помню, кидал я про математическую морфологию, или нет:
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)
-
Возможно, на Фортране код был бы проще, так как работает с матрицами, а не напрямую с моделью памяти.
-
Возможно, на Фортране код был бы проще, так как работает с матрицами, а не напрямую с моделью памяти.
Ну, фортран для ЧМ вообще няшечка.
-
Возможно, на Фортране код был бы проще, так как работает с матрицами, а не напрямую с моделью памяти.
Ну, фортран для ЧМ вообще няшечка.
только в том случае если существующие реализации алгоритмов удовлетворяют вас по всем параметрам (ширпотреб), но интересные задачи, как правило, не решаются удовлетворительно стандартными реализациями.
-
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.
-
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 на нее что-то активно фырчал. :-)
-
Физика усиления резкости цифровой фотографии
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)