Читаоци попут вас помажу у подршци МУО. Када обавите куповину користећи везе на нашем сајту, можда ћемо зарадити провизију за партнере. Опширније.

Можда бисте желели да дигитализујете документ да бисте уштедели физички простор или да направите резервну копију за чување. У сваком случају, писање програма који може да конвертује фотографије ваших папирних датотека у стандардни формат је задатак у којем се Питхон одлично сналази.

Користећи комбинацију одговарајућих библиотека, можете направити малу апликацију за дигитализацију докумената. Ваш програм ће узети слику физичког документа као улаз, применити неколико техника обраде слике на њега и избацити скенирану верзију улаза.

Припрема вашег окружења

Да бисте пратили овај чланак, требало би да будете упознати са основе Пајтона. Такође морате имати разумевање за како радити са НумПи Питхон библиотеком.

Отворите било који Питхон ИДЕ и креирајте две Питхон датотеке. Именујте један маин.пи, а други трансформ.пи. Затим покрените следећу команду на терминалу да бисте инсталирали потребне библиотеке.

instagram viewer
пип инсталл ОпенЦВ-Питхон имутилс сцикит-имаге НумПи

Користићете ОпенЦВ-Питхон да преузмете унос слике и извршите неку обраду слике. Имутилс за промену величине улазних и излазних слика. сцикит-имаге да примените праг на слику. НумПи ће вам помоћи да радите са низовима.

Сачекајте да се инсталација заврши и да ИДЕ ажурира скелете пројекта. Након што је ажурирање скелета завршено, спремни сте за почетак кодирања. Комплетан изворни код је доступан у а ГитХуб спремиште.

Увоз инсталираних библиотека

Отворите датотеку маин.пи и увезите библиотеке које сте инсталирали у окружењу. Ово ће вам омогућити да позовете и користите њихове функције тамо где је то потребно.

увоз цв2
увоз имутилс
из скимаге.филтери увоз тхресхолд_лоцал
из преобразити увоз перспецтиве_трансформ

Занемарите грешку која се појавила на перспецтиве_трансформ. Нестаће када завршите са радом на датотеци трансформ.пи.

Узимање и промена величине уноса

Направите јасну слику документа који желите да скенирате. Уверите се да су четири угла документа и његов садржај видљиви. Копирајте слику у исту фасциклу у којој чувате програмске датотеке.

Проследите путању улазне слике у ОпенЦВ. Направите копију оригиналне слике јер ће вам требати током трансформације перспективе. Поделите висину оригиналне слике на висину на коју желите да јој промените величину. Ово ће задржати однос страница. На крају, изнесите слику промењене величине.

# Пролазак путање слике
оригинал_имг = цв2.имреад('сампле.јпг')
цопи = оригинал_имг.цопи()

# Промењена висина у стотинама
однос = оригинал_имг.схапе[0] / 500.0
имг_ресизе = имутилс.ресизе (оригинал_имг, висина=500)

# Приказ излаза
цв2.имсхов('Промењена величина слике', имг_ресизе)

# Чека се да корисник притисне било који тастер
цв2.ваитКеи(0)

Излаз горњег кода је следећи:

Сада сте променили величину оригиналне слике на 500 пиксела.

Претварање слике промењене величине у нијансе сиве

Претворите РГБ слику промењене величине у нијансе сиве. Већина библиотека за обраду слика ради само са сликама у сивим тоновима јер их је лакше обрадити.

граи_имаге = цв2.цвтЦолор (имг_ресизе, цв2.ЦОЛОР_БГР2ГРЕИ)
цв2.имсхов('Сива слика', сива_слика)
цв2.ваитКеи(0)

Обратите пажњу на разлику између оригиналне и засивљене слике.

Табела у боји је постала црно-бела.

Примена детектора ивица

Примените Гаусов филтер замућења на сиву слику да бисте уклонили шум. Затим позовите ОпенЦВ функцију да откријете ивице присутне на слици.

блурред_имаге = цв2.ГауссианБлур (сива_слика, (5, 5), 0)
едгед_имг = цв2.Цанни (блурред_имаге, 75, 200)
цв2.имсхов('Ивице слике', едгед_имг)
цв2.ваитКеи(0)

Ивице су видљиве на излазу.

Ивице са којима ћете радити су ивице документа.

Проналажење највеће контуре

Откријте контуре присутне на слици са ивицама. Сортирајте их у опадајућем редоследу задржавајући само пет највећих контура. Приближите највећу контуру са четири стране петљом кроз сортиране контуре.

цнтс, _ = цв2.финдЦонтоурс (едгед_имг, цв2.РЕТР_ЛИСТ, цв2.ЦХАИН_АППРОКС_СИМПЛЕ)
цнтс = сортирано (цнтс, кеи=цв2.цонтоурАреа, реверсе=Истина)[:5]

за ц ин цнтс:
пери = цв2.арцЛенгтх (ц, Истина)
аппрок = цв2.аппрокПолиДП(ц, 0.02 * пери, Истина)

ако лен (приближно) == 4:
доц = прибл
пауза

Контура са четири стране ће вероватно садржати документ.

Заокруживање четири угла контуре документа

Заокружите углове откривене контуре документа. Ово ће вам помоћи да утврдите да ли је ваш програм успео да открије документ на слици.

п = []

за д ин док:
тупле_поинт = тупле (д[0])
цв2.цирцле (имг_ресизе, тупле_поинт, 3, (0, 0, 255), 4)
п.аппенд (точка_торке)

цв2.имсхов('Заокружене углове', имг_ресизе)
цв2.ваитКеи(0)

Примените кружење на РГБ слици промењене величине.

Након што сте открили документ, сада морате да издвојите документ из слике.

Коришћење Варп перспективе да бисте добили жељену слику

Варп перспектива је техника компјутерског вида за трансформацију слике ради исправљања изобличења. Он трансформише слику у другу раван омогућавајући вам да видите слику из другог угла.

варпед_имаге = перспецтиве_трансформ (цопи, доц.ресхапе(4, 2) * однос)
варпед_имаге = цв2.цвтЦолор (варпед_имаге, цв2.ЦОЛОР_БГР2ГРЕИ)
цв2.имсхов("Изобличена слика", имутилс.ресизе (искривљена_слика, висина=650))
цв2.ваитКеи(0)

Да бисте добили искривљену слику, потребно је креирајте једноставан модул који ће извршити трансформацију перспективе.

Трансформациони модул

Модул ће одредити тачке углова документа. Такође ће трансформисати слику документа у другу раван и променити угао камере у снимак изнад главе.

Отворите датотеку трансформ.пи коју сте раније креирали. Увезите ОпенЦВ и НумПи библиотеке.

увоз нумпи као нп
увоз цв2

Овај модул ће садржати две функције. Креирајте функцију која ће поредати координате тачака угла документа. Прва координата ће бити она у горњем левом углу, друга ће бити она у горњем десном углу, трећа ће бити у доњем десном углу, а четврта координата ће бити она у доњем левом углу угао.

дефордер_поинтс(поена):
# иницијализирање листе координата које треба наручити
рецт = нп.нуле((4, 2), дтипе = "флоат32")

с = поена.збир (оса = 1)

# горња лева тачка ће имати најмањи збир
рец[0] = птс[нп.аргмин (с)]

# доња десна тачка ће имати највећи збир
рец[2] = птс[нп.аргмак (с)]

израчунавање разлике између тачака,
горња десна тачка ће имати најмању разлику,
док ће доњи леви имати највећу разлику
дифф = нп.дифф (птс, ос = 1)
рец[1] = птс[нп.аргмин (дифф)]
рец[3] = птс[нп.аргмак (дифф)]

# враћа наручене координате
повратак рецт

Направите другу функцију која ће израчунати координате угла нове слике и добити снимак изнад главе. Затим ће израчунати матрицу трансформације перспективе и вратити искривљену слику.

дефперспецтиве_трансформ(слика, поена):
# отпакујте наручене координате појединачно
рецт = ред_поени (поени)
(тл, тр, бр, бл) = рецт

израчунајте ширину нове слике, која ће бити
максимално растојање између доњег десног и Доњи леви
к-координате или горњи десни и горње леве к-координате
ширинаА = нп.скрт(((бр[0] - бл[0]) ** 2) + ((бр[1] - бл[1]) ** 2))
ширинаБ = нп.скрт(((тр[0] - тл[0]) ** 2) + ((тр[1] - тл[1]) ** 2))
макВидтх = мак (инт (ширина А), инт (ширина Б))

израчунајте висину нове слике, која ће бити
максимално растојање између горњег левог и доње леве и-координате
висинаА = нп.скрт(((тр[0] - бр[0]) ** 2) + ((тр[1] - бр[1]) ** 2))
висинаБ = нп.скрт(((тл[0] - бл[0]) ** 2) + ((тл[1] - бл[1]) ** 2))
макХеигхт = мак (инт (висинаА), инт (висинаБ))

конструисати скуп одредишних тачака да бисте добили снимак изнад главе
дст = нп.арраи([
[0, 0],
[макВидтх - 1, 0],
[макВидтх - 1, макХеигхт - 1],
[0, макХеигхт - 1]], дтипе = "флоат32")

# израчунати матрицу трансформације перспективе
трансформ_матрик = цв2.гетПерспецтивеТрансформ (рецт, дст)

# Примени матрицу трансформације
варпед = цв2.варпПерспецтиве (имаге, трансформ_матрик, (макВидтх, макХеигхт))

# врати искривљену слику
повратак искривљена

Сада сте креирали модул трансформације. Грешка у увозу перспецтиве_трансформ ће сада нестати.

Приметите да приказана слика има снимак изнад главе.

Примена Адаптиве Тхресхолд-а и чување скенираног излаза

У датотеци маин.пи примените Гаусов праг на искривљену слику. Ово ће искривљеној слици дати скенирани изглед. Сачувајте излаз скениране слике у фасциклу која садржи програмске датотеке.

Т = тхресхолд_лоцал (искривљена_слика, 11, оффсет=10, метход="гаусов")
искривљен = (искривљена_слика > Т).астипе("уинт8") * 255
цв2.имврите('./'+'сцан'+'.пнг', искривљен)

Чување скенираног у ПНГ формату одржава квалитет документа.

Приказ излаза

Изнесите слику скенираног документа:

цв2.имсхов(„Коначна скенирана слика“, имутилс.ресизе (искривљено, висина=650))
цв2.ваитКеи(0)
цв2.дестроиАллВиндовс()

Следећа слика приказује излаз програма, снимак изнад главе скенираног документа.

Како напредовати у компјутерском виду

Креирање скенера докумената покрива неке кључне области компјутерског вида, што је широко и сложено поље. Да бисте напредовали у компјутерском виду, требало би да радите на занимљивим али изазовним пројектима.

Такође би требало да прочитате више о томе како можете да користите компјутерски вид са тренутним технологијама. Ово ће вас информисати и дати вам нове идеје за пројекте на којима ћете радити.