Автор Тема: Работа с растровыми изображениями  (Прочитано 17944 раз)

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Работа с растровыми изображениями
« : Февраль 04, 2013, 01:29:07 pm »
Увлёкся задачкой удаления шумов с фотографии, написал программку... экспериментирую. Получается не хуже чем в фотошопе. Алгоритмы бывают медленные, надо ждать ответа несколько минут. Когда много экспериментируешь, чуть изменяешь параметры, снова запускаешь, то ждать так много как бы не очень хочется. Понятно, что можно распараллелить на несколько ядер, но это даст ускорение всего в четыре раза (у меня 4 ядра). Да и не факт, что в 4, так как основной затык в памяти.

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

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

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

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

Вот думаю, оно правда на одном ядре сразу же раз в десять-пятнадцать быстрее будет?  :-\ :-\ :-\ Стоит ли связываться...

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Работа с растровыми изображениями
« Ответ #1 : Февраль 04, 2013, 02:43:09 pm »
Немного не в тему, но из вот этой лекции/доклада, я вынес что в случае работы с графикой следует избавляться от ветвлений (ибо любой if существенно тормозит работу - ошибки предсказания и так далее появляются).

Ну и вообще лекция весьма познавательная была (пожалел что не успел к началу лекции тогда).
Y = λf.(λx.f (x x)) (λx.f (x x))

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: Работа с растровыми изображениями
« Ответ #2 : Февраль 04, 2013, 02:58:09 pm »
Если я разобью большой двумерный массив на много маленьких двумерных массивчиков (например 256 * 256), то каждый из них в кэш процессора будет убираться целиком и работа теоретически пойдёт "со скоростью света".
А не возникнут ли при этом сложности с обработкой изображения на стыках этих массивчиков?

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Работа с растровыми изображениями
« Ответ #3 : Февраль 04, 2013, 03:25:41 pm »
А не возникнут ли при этом сложности с обработкой изображения на стыках этих массивчиков?
Сложности возникнут, поэтому и думаю стоит ли овчинка выделки...

Для борьбы с граничными сложностями можно, например, область 200 * 200 с исходного изображения взять с запасом в 25 пикселей по периметру, получим квадратик 250 * 250. Можно будет использовать алгоритмы, которые на 25 пикселей заглядывают "за границу". После обработки собрать изображение обратно беря из каждого квадратика 250 * 250  область 200 * 200 из середины. Особого перерасхода в вычислениях тут не будет ведь бегая по квадратику 250*250 вычисления-то будем делать только для центральных 200*200 пикселей, а в боковые только заглядывать.

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Работа с растровыми изображениями
« Ответ #4 : Февраль 04, 2013, 09:12:23 pm »
Ларчик открывался просто. Погонял свою программу на маленьких картинках. Зависимость времени работы алгоритма от количества пикселей картинки оказалась линейная начиная от размеров картинки 100*100 пикселей. Картинка размером 50*50 пикселей обрабатывалась совсем чуток быстрее чем должна бы если продолжить линейную зависимость в область малых размеров изображения. Короче, разбивка большой картинки на много маленьких выгоды в производительности не даёт.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Работа с растровыми изображениями
« Ответ #5 : Февраль 04, 2013, 09:32:48 pm »
Ларчик открывался просто. Погонял свою программу на маленьких картинках. Зависимость времени работы алгоритма от количества пикселей картинки оказалась линейная начиная от размеров картинки 100*100 пикселей. Картинка размером 50*50 пикселей обрабатывалась совсем чуток быстрее чем должна бы если продолжить линейную зависимость в область малых размеров изображения. Короче, разбивка большой картинки на много маленьких выгоды в производительности не даёт.
Уточнение - на твоем алгоритме (и даже реализации алгоритма).
Y = λf.(λx.f (x x)) (λx.f (x x))

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Работа с растровыми изображениями
« Ответ #6 : Февраль 05, 2013, 01:40:32 pm »
На моём алгоритме затыка по мамяти точно нет. Разбил на три потока (по каналам: красный, зелёный, синий), ускорилось почти в три раза.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Работа с растровыми изображениями
« Ответ #7 : Февраль 05, 2013, 01:43:42 pm »
На моём алгоритме затыка по мамяти точно нет. Разбил на три потока (по каналам: красный, зелёный, синий), ускорилось почти в три раза.
Возможно поэтому при переносе в кэш и не было ускорения на порядок?
Y = λf.(λx.f (x x)) (λx.f (x x))

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Работа с растровыми изображениями
« Ответ #8 : Февраль 05, 2013, 01:49:26 pm »
Возможно поэтому при переносе в кэш и не было ускорения на порядок?
Конечно по этому. Но я этого тогда не знал. Я думал память работает более медленно.

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Работа с растровыми изображениями
« Ответ #9 : Февраль 20, 2013, 11:29:21 am »
Век живи - век учись. Я чуть со стула не упал, гляньте оказывается что можно делать:

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

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



valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Работа с растровыми изображениями
« Ответ #10 : Февраль 20, 2013, 11:36:51 am »
Век живи - век учись. Я чуть со стула не упал, гляньте оказывается что можно делать:

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

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

А это именно расфокусировку (то есть оптическую), или же какой-то из блюров "отменяет" (блюры они же разные бывают)?
Y = λf.(λx.f (x x)) (λx.f (x x))

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Работа с растровыми изображениями
« Ответ #11 : Февраль 20, 2013, 12:31:12 pm »
Типа да, моделирует расфокусировку оптическую в линзах.

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

Конечно если абы каким блюром картинку загадишь, то назад уже не вернёшь.

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: Работа с растровыми изображениями
« Ответ #12 : Февраль 20, 2013, 04:26:33 pm »
У оператора "расфокусировки" существует (примерно) обратный оператор. Применив его к расфокусированному изображению можно (примерно) получить исходное.
Интересно. Выходит, что расфокусированое изображение содержит почти столько же информации, сколько сфокусированное. Довольно неожиданно. (Тогда, в принципе, некоторые старые фотки можно повосстанавливать  :) )

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Работа с растровыми изображениями
« Ответ #13 : Февраль 20, 2013, 04:49:12 pm »
Интересно. Выходит, что расфокусированое изображение содержит почти столько же информации, сколько сфокусированное. Довольно неожиданно.

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

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: Работа с растровыми изображениями
« Ответ #14 : Февраль 20, 2013, 05:34:28 pm »
А я помню как в одном научно-популярном фильме астроном (женщина) рассказывала, что они улучшали снимки участков звёздного неба. Правда там речь шла не о расфокусировке, а о влиянии атмосферы. Она даже привела пример: "Как если бы вы смотрели на камушки на дне пруда через рябь на поверхности воды". Они делают много фотографий одного и того же участка неба, на которых ни фига не разобрать, затем обрабатывают их на компьютере, и получают снимок довольно сносного качества.