portaldacalheta.pt
  • Основен
  • Инженерно Управление
  • Мобилен Дизайн
  • Разпределени Екипи
  • Пъргав
Технология

Въведение в обработката на изображения на Python в компютърна фотография



Изчислителната фотография е свързана с подобряване на фотографския процес с изчисления. Въпреки че обикновено сме склонни да мислим, че това се отнася само за последваща обработка на крайния резултат (подобно на редактирането на снимки), възможностите са много по-богати, тъй като изчисленията могат да бъдат активирани на всяка стъпка от фотографския процес - започвайки с осветяването на сцената, продължавайки с обектива и в крайна сметка дори при показване на заснетото изображение.

Това е важно, защото позволява много повече и по различни начини, отколкото това, което може да се постигне с нормална камера. Важно е също така, тъй като най-разпространеният тип камери в днешно време - мобилната камера - не е особено мощен в сравнение с по-големия си брат (DSLR), но успява да свърши добра работа, като използва изчислителната мощ, която има на устройството .



Ще разгледаме два примера, при които изчисленията могат да подобрят фотографията - по-точно ще видим как простото правене на повече снимки и използването на малко Python, за да ги комбинира, може да създаде добри резултати в две ситуации, в които хардуерът на мобилната камера не наистина блясък - слаба светлина и висок динамичен обхват.



Фотография при слаба светлина

Да приемем, че искаме да направим снимка на сцена при ниска осветеност, но камерата има малка бленда (обектив) и ограничено време на експозиция. Това е типична ситуация за камерите за мобилни телефони, които при дадена сцена на слаба светлина могат да създадат изображение като това (направено с камера на iPhone 6):



Изображение на няколко играчки в среда с ниска осветеност

Ако се опитаме да подобрим контраста, резултатът е следният, което също е доста лошо:



Същото изображение като по-горе, много по-ярко, но с разсейващ визуален шум

трябва ли да науча node js

Какво става? Откъде идва целият този шум?



Отговорът е, че шумът идва от сензора - устройството, което се опитва да определи кога светлината го удря и колко интензивна е тази светлина. При слаба светлина обаче трябва да увеличи чувствителността си много, за да регистрира каквото и да било, а тази висока чувствителност означава, че също така започва да открива фалшиви положителни резултати - фотони, които просто не са там. (Като странична бележка този проблем не засяга само устройствата, но и нас, хората: Следващият път, когато сте в тъмна стая, отделете малко време, за да забележите шума, присъстващ във вашето зрително поле.)

В устройството за изображения винаги ще има известно количество шум; ако обаче сигналът (полезна информация) има висока интензивност, шумът ще бъде незначителен (високо съотношение сигнал / шум). Когато сигналът е нисък - например при слаба светлина - шумът ще се откроява (слаб сигнал към шум).



И все пак можем да преодолеем проблема с шума, дори с всички ограничения на камерата, за да получим по-добри снимки от горния.

За да направим това, трябва да вземем предвид какво се случва с времето: Сигналът ще остане същият (същата сцена и предполагаме, че е статичен), докато шумът ще бъде напълно случаен. Това означава, че ако направим много кадри от сцената, те ще имат различни версии на шума, но една и съща полезна информация.



Така че, ако осредним много изображения, направени с течение на времето, шумът ще се премахне, докато сигналът няма да бъде засегнат.

Следващата илюстрация показва опростен пример: Имаме сигнал (триъгълник), засегнат от шум, и се опитваме да възстановим сигнала, като осредняваме множество случаи на един и същ сигнал, засегнати от различен шум.



Демонстрация на триъгълника с четири панела, разпръснато изображение, представляващо триъгълника с добавен шум, нещо като назъбен триъгълник, представляващ средно 50 случая и средно 1000 случая, което изглежда почти идентично с оригиналния триъгълник.

Виждаме, че въпреки че шумът е достатъчно силен, за да изкриви напълно сигнала във всеки един случай, усредняването постепенно намалява шума и възстановяваме оригиналния сигнал.

Нека да видим как този принцип се прилага за изображения: Първо, трябва да направим множество снимки на обекта с максималната експозиция, която позволява камерата. За най-добри резултати използвайте приложение, което позволява ръчно заснемане. Важно е снимките да се правят от едно и също място, така че (импровизиран) статив ще ви помогне.

Повече снимки обикновено означават по-добро качество, но точният брой зависи от ситуацията: колко светлина има, колко чувствителна е камерата и т.н. Един добър обхват може да бъде между 10 и 100.

След като получим тези изображения (в суров формат, ако е възможно), можем да ги четем и обработваме в Python.

За тези, които не са запознати с обработката на изображения в Python, трябва да споменем, че изображението е представено като 2D масив от байтови стойности (0-255) - тоест за монохромно изображение или изображение в сиво. Цветно изображение може да се разглежда като набор от три такива изображения, по едно за всеки цветен канал (R, G, B), или ефективно 3D масив, индексиран от вертикална позиция, хоризонтална позиция и цветен канал (0, 1, 2) .

Ще използваме две библиотеки: NumPy ( http://www.numpy.org/ ) и OpenCV ( https://opencv.org/ ). Първият ни позволява да извършваме изчисления върху масиви много ефективно (с изненадващо кратък код), докато OpenCV се справя с четене / запис на файловете с изображения в този случай, но е много по-способен, предоставяйки много усъвършенствани графични процедури - някои от които ще използвайте по-късно в статията.

import os import numpy as np import cv2 folder = 'source_folder' # We get all the image files from the source folder files = list([os.path.join(folder, f) for f in os.listdir(folder)]) # We compute the average by adding up the images # Start from an explicitly set as floating point, in order to force the # conversion of the 8-bit values from the images, which would otherwise overflow average = cv2.imread(files[0]).astype(np.float) for file in files[1:]: image = cv2.imread(file) # NumPy adds two images element wise, so pixel by pixel / channel by channel average += image # Divide by count (again each pixel/channel is divided) average /= len(files) # Normalize the image, to spread the pixel intensities across 0..255 # This will brighten the image without losing information output = cv2.normalize(average, None, 0, 255, cv2.NORM_MINMAX) # Save the output cv2.imwrite('output.png', output)

Резултатът (с приложен автоматичен контраст) показва, че шумът е изчезнал, много голямо подобрение спрямо оригиналното изображение.

Оригиналната снимка на играчки, този път както по-ярка, така и много по-ясна, с много малко забележим шум

Въпреки това все още забелязваме някои странни артефакти, като зеленикавата рамка и решетъчния модел. Този път това не е случаен шум, а фиксиран шум. Какво стана?

Близък план на горния ляв ъгъл на горното изображение

Близък план на горния ляв ъгъл, показващ зелената рамка и шарката на мрежата

Отново можем да го обвиним върху сензора. В този случай виждаме, че различните части на сензора реагират по различен начин на светлината, което води до видим модел. Някои елементи от тези модели са правилни и най-вероятно са свързани със сензорната подложка (метал / силиций) и с това как тя отразява / абсорбира входящите фотони. Други елементи, като белия пиксел, са просто дефектни сензорни пиксели, които могат да бъдат прекалено чувствителни или свръхчувствителни към светлината.

aws сертифициран проект за изпит за архитект за решения

За щастие има начин да се отървете и от този тип шум. Нарича се изваждане на тъмна рамка .

За целта ни е необходимо изображение на самия шум на шарката и това може да се получи, ако снимаме тъмнина. Да, точно така - просто покрийте отвора на камерата и направете много снимки (да речем 100) с максимално време на експонация и ISO стойност и ги обработете, както е описано по-горе.

Когато осредняваме по много черни рамки (които всъщност не са черни поради случайния шум), ще завършим с фиксирания шум на шаблона. Можем да предположим, че този фиксиран шум ще остане постоянен, така че тази стъпка е необходима само веднъж: Полученото изображение може да се използва повторно за всички бъдещи снимки при слаба светлина.

Ето как изглежда горната дясна част на шума на шаблона (регулиран контраст) за iPhone 6:

Шумът на шаблона за частта от кадъра, показана на предишното изображение

Отново забелязваме решетъчната текстура и дори онова, което изглежда като залепен бял пиксел.

След като получим стойността на този шум от тъмна рамка (в променливата average_noise), можем просто да го извадим от нашия изстрел до момента, преди да се нормализира:

average -= average_noise output = cv2.normalize(average, None, 0, 255, cv2.NORM_MINMAX) cv2.imwrite('output.png', output)

Ето и последната ни снимка:

Още едно изображение на снимката, този път без абсолютно никакви доказателства, че е направено при слаба светлина

хакване на номера на кредитна карта на paypal

Висок динамичен обхват

Друго ограничение, което има малка (мобилна) камера, е нейният малък динамичен обхват, което означава, че обхватът на интензитета на светлината, при който тя може да заснема детайли, е доста малък.

С други думи, камерата е в състояние да заснеме само тесен диапазон на интензитета на светлината от сцена; интензитетите под тази лента изглеждат като чисто черни, докато интензитетите над нея изглеждат като чисто бели и всички детайли се губят от тези региони.

Има обаче трик, който камерата (или фотографът) може да използва - и това е регулиране на времето на експозиция (времето, когато сензорът е изложен на светлината), за да контролира ефективно общото количество светлина, което достига до сензора, ефективно преместване на обхвата нагоре или надолу, за да улови най-подходящия обхват за дадена сцена.

Но това е компромис. Много подробности не успяват да попаднат в последната снимка. На двете изображения по-долу виждаме една и съща сцена, заснета с различно време на експозиция: много кратка експозиция (1/1000 сек), средна експозиция (1/50 сек) и дълга експозиция (1/4 сек).

Три версии на едно и също изображение на цветя, едната толкова тъмна, че по-голямата част от снимката е черна, една нормално изглеждаща, макар и с малко жалко осветление, а трета със светлинно извита светлина толкова високо, че

Както можете да видите, нито едно от трите изображения не е в състояние да улови всички налични детайли: нажежаемата жичка на лампата се вижда само при първия изстрел, а някои от детайлите на цветята се виждат или в средата, или при последния изстрел, но не и двете.

Добрата новина е, че можем да направим нещо по въпроса и отново включва изграждането на множество снимки с малко код на Python.

Подходът, който ще предприемем, се основава на работата на Paul Debevec et al., Който описва метода в своя доклад тук . Методът работи по следния начин:

Първо, той изисква множество снимки на една и съща сцена (неподвижна), но с различно време на експозиция. Отново, както в предишния случай, имаме нужда от статив или поддръжка, за да сме сигурни, че камерата изобщо не се движи. Също така се нуждаем от приложение за ръчно снимане (ако използвате телефон), за да можем да контролираме времето на експозиция и да предотвратим автоматичните корекции на камерата. Броят на необходимите снимки зависи от диапазона на интензитета, наличен в изображението (от три нагоре), а времената на експозиция трябва да бъдат разпределени в този диапазон, така че детайлите, които се интересуваме от запазване, да се показват ясно в поне един кадър.

След това се използва алгоритъм за възстановяване на кривата на реакция на камерата въз основа на цвета на едни и същи пиксели през различните времена на експозиция. Това основно ни позволява да установим карта между реалната яркост на дадена точка, времето на експозиция и стойността, която съответният пиксел ще има в заснетото изображение. Ще използваме внедряването на метода на Debevec от библиотеката OpenCV.

# Read all the files with OpenCV files = ['1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg'] images = list([cv2.imread(f) for f in files]) # Compute the exposure times in seconds exposures = np.float32([1. / t for t in [1000, 500, 100, 50, 10]]) # Compute the response curve calibration = cv2.createCalibrateDebevec() response = calibration.process(images, exposures)

Кривата на отговора изглежда по следния начин:

Графика, показваща кривата на отговора като експозиция на пиксела (дневник) над стойността на пиксела

На вертикалната ос имаме кумулативен ефект от яркостта на сцената на дадена точка и времето на експозиция, докато на хоризонталната ос имаме стойността (0 до 255 на канал), която ще има съответният пиксел.

Тази крива ни позволява да извършим обратната операция (която е следващата стъпка в процеса) - с оглед на стойността на пикселите и времето на експозиция, можем да изчислим реалната яркост на всяка точка в сцената. Тази стойност на яркостта се нарича облъчване и тя измерва количеството светлинна енергия, което пада върху единица площ от сензора. За разлика от данните за изображението, той се представя с помощта на числа с плаваща запетая, защото отразява много по-широк диапазон от стойности (следователно, висок динамичен диапазон). След като получим изображението на облъчване (HDR изображението), можем просто да го запазим:

# Compute the HDR image merge = cv2.createMergeDebevec() hdr = merge.process(images, exposures, response) # Save it to disk cv2.imwrite('hdr_image.hdr', hdr)

За тези от нас, които имат късмета да имат HDR дисплей (който става все по-често срещан), може да е възможно да визуализирате това изображение директно в цялата му слава. За съжаление, HDR стандартите са все още в зародиш, така че процесът да се направи това може да е малко по-различен за различните дисплеи.

За останалата част от нас добрата новина е, че все още можем да се възползваме от тези данни, въпреки че нормалният дисплей изисква изображението да има канали с байтова стойност (0-255). Въпреки че трябва да се откажем от част от богатството на картата на облъчване, поне ние имаме контрол върху това как да го направим.

Този процес се нарича тон-картографиране и включва преобразуване на картата с облъчване с плаваща запетая (с висок диапазон от стойности) в стандартно байтово изображение. Има техники за това, така че много от допълнителните детайли да бъдат запазени. Само за да ви дам пример как това може да работи, представете си, че преди да изстискаме диапазона с плаваща запетая в байтови стойности, ние подобряваме (изостряме) ръбовете, които присъстват в HDR изображението. Подобряването на тези ръбове ще помогне за запазването им (и по подразбиране на детайлите, които те предоставят) също в изображението с нисък динамичен обхват.

s vs c corp llc

OpenCV предоставя набор от тези оператори за картографиране на тонове, като Drago, Durand, Mantiuk или Reinhardt. Ето пример за това как може да се използва един от тези оператори (Дюран) и за резултата, който той произвежда.

durand = cv2.createTonemapDurand(gamma=2.5) ldr = durand.process(hdr) # Tonemap operators create floating point images with values in the 0..1 range # This is why we multiply the image with 255 before saving cv2.imwrite('durand_image.png', ldr * 255)

Резултатът от горното изчисление се показва като изображение

Използвайки Python, можете също да създадете свои собствени оператори, ако имате нужда от повече контрол върху процеса. Например, това е резултатът, получен с персонализиран оператор, който премахва интензитетите, представени в много малко пиксели, преди да свие диапазона на стойността до 8 бита (последвано от стъпка за автоматично контрастиране):

Изображението, което е резултат от следването на горния процес

И ето кода за горния оператор:

def countTonemap(hdr, min_fraction=0.0005): counts, ranges = np.histogram(hdr, 256) min_count = min_fraction * hdr.size delta_range = ranges[1] - ranges[0] image = hdr.copy() for i in range(len(counts)): if counts[i] = ranges[i + 1]] -= delta_range ranges -= delta_range return cv2.normalize(image, None, 0, 1, cv2.NORM_MINMAX)

Заключение

Видяхме как с малко Python и няколко поддържащи библиотеки можем да разширим границите на физическата камера, за да подобрим крайния резултат. И двата примера, които обсъдихме, използват множество нискокачествени снимки, за да създадат нещо по-добро, но има много други подходи за различни проблеми и ограничения.

Въпреки че много телефони с камера имат магазини или вградени приложения, които адресират тези конкретни примери, очевидно не е никак трудно да ги програмирате на ръка и да се насладите на по-високото ниво на контрол и разбиране, които могат да бъдат получени.

Ако се интересувате от изчисления на изображения на мобилно устройство, разгледайте Урок за OpenCV: Откриване на обекти в реално време с помощта на MSER в iOS от колегите ApeeScapeer и елита Разработчик на OpenCV Altaibayar Tseveenbayar.

Разбиране на основите

Как работи сензорът в камерата?

Сензорът преобразува входящата светлина в електрически сигнали, които след това се усилват и цифровизират. Повърхността му е разделена на пиксели, които допълнително са разделени на канали. Следователно сензорът произвежда три числа, съответстващи на интензитета на червената, зелената и синята светлина за всяка точка в сцената.

Какво е значението на обработката на изображения?

Обработката на изображения се отнася до всички изчислителни стъпки, предприети след заснемане на необработено изображение от сензора, за да се подобри или модифицира.

Как работи обработката на изображения?

Обработката на изображения се извършва в софтуер чрез прилагане на числови операции върху данните на изображението. Най-често срещаните техники за обработка на изображения имат солидна математическа основа.

дискорд бот c++

Какво е Python, NumPy и OpenCV?

Python е език за програмиране, подходящ за научни изчисления. NumPy е библиотека на Python, която опростява извършването на числови операции върху масиви. OpenCV е специализирана библиотека, фокусирана върху обработката на изображения и компютърното зрение.

Защо снимките с много слабо осветление са шумни?

При слаба светлина и с ограничена експозиция има много малко количество светлинна енергия, която пада върху сензора. Сензорът се опитва да компенсира чрез усилване на сигнала, но в крайна сметка усилва и собствения си електрически шум.

Какво е HDR фотография?

Фотографията с висок динамичен обхват (HDR) се отнася до по-точно улавяне на физическата интензивност на светлината в сцена. Конвенционалната цифрова фотография използва само малък брой нива на интензивност (обикновено 256).

Какво е картографиране на тонове?

Картографирането на тонове е техниката, която преобразува HDR изображение в конвенционално изображение, запазвайки повечето детайли, така че изображението да може да се показва на дисплей, който не е HDR.

Не се опитвайте да промените света, по-добре проектирайте играчка

Ui Design

Не се опитвайте да промените света, по-добре проектирайте играчка
Защо има толкова много питони? Сравнение на внедряването на Python

Защо има толкова много питони? Сравнение на внедряването на Python

Технология

Популярни Публикации
Плащане напред: Разбиране на изкупувания с ливъридж
Плащане напред: Разбиране на изкупувания с ливъридж
Индустриален анализ и Porter’s Five Force: По-задълбочен поглед върху силата на купувача
Индустриален анализ и Porter’s Five Force: По-задълбочен поглед върху силата на купувача
Разширена реалност vs. Виртуална реалност vs. Смесена реалност: Уводно ръководство
Разширена реалност vs. Виртуална реалност vs. Смесена реалност: Уводно ръководство
Ще отвори ли Spotify не-IPO пътя за технологичните компании?
Ще отвори ли Spotify не-IPO пътя за технологичните компании?
Прогнозиране на харесвания: Вътре в алгоритмите на прост механизъм за препоръки
Прогнозиране на харесвания: Вътре в алгоритмите на прост механизъм за препоръки
 
Ефективни стартови платки: какви са те и как да ги изградим
Ефективни стартови платки: какви са те и как да ги изградим
Ръководител на клиентския опит
Ръководител на клиентския опит
Игла в купа сено: чудесен урок за мащабен текстов алгоритъм за търсене
Игла в купа сено: чудесен урок за мащабен текстов алгоритъм за търсене
Структурата на данните Trie: Пренебрегван скъпоценен камък
Структурата на данните Trie: Пренебрегван скъпоценен камък
Краят на уеб формите
Краят на уеб формите
Популярни Публикации
  • ако вървят те са vc
  • как да пиша добри модулни тестове
  • бутилка (уеб рамка)
  • javascript изчакайте асинхронното повикване да завърши
  • как да получите номера на кредитни карти на хората онлайн
Категории
  • Инженерно Управление
  • Мобилен Дизайн
  • Разпределени Екипи
  • Пъргав
  • © 2022 | Всички Права Запазени

    portaldacalheta.pt