Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 22. 11. 2022 13:01

Karmanova cesta
Příspěvky: 46
Reputace:   
 

Pomoc se vzorcem na zjíštění orientace hrany (v obrazu)

Dobrý den. Matematika mi na škole nikdy moc nešla ale co jsem si dodnes zapamatoval je pythagorova věta. Začal jsem se zajímat o tzv. Sobel edge detection, filtr na detekci hran v obraze. Původně jsem hledal na netu a našel jsem studii, která provedla analýzu za použití Sobelovy detekce hran [1]. Jak funguje detekce sobelových hran jsem zjistil ze článku na project Rhea[2]. Nicméně pro pochopení tématiky pro mě bylo nakonec stěžejní matematické vyhádření - pythagorova věta a výpočet úhlu théta [3]. Pochopil jsem tedy to, že ten filtr používá dvě matice, které se aplikují každý zvlášť na vygenerování nového obrazu - matice.
https://www.projectrhea.org/rhea/images … ernels.png
Jedna matice má jeden sloupec s nulami druhá matice je otočená o 90° a má řadu s nulami. Díky této orientaci vztah těch dvou výsledných matic je takový, že je z něj možné vypočítat úhel hrany. Což mi přijde hodně zajimavé.
https://homepages.inf.ed.ac.uk/rbf/HIPR2/eqns/eqnsob3.gif
Nakonec jsem tedy hledal jak programátorsky vypočítat ten úhel, protože to mi ještě zbývá k pochopení. A protože umím pracovat s Delphi (starší verze z roku 2002) byl by mi nejbližší kód v tomto jazyce nebo případně v Céčku, ale tam si myslím, že to může být jinak. Na další stránce[4] jsem přišel na to, že v Céčku je nějaký problém - autor odpověti tam píše (přeloženo) "Dále si všimni, že atan s jedním argumentem může vždy vrátit hodnoty pouze v prvním a čtvrtém kvadrantu (protože například tan 45 == tan 225 při použití stupňů).

Pokud opravdu chcete úhel v jednom ze čtyř kvadrantů (měli byste se skutečně zeptat sami sebe, zda na tom záleží pro vaši aplikaci), pak se podívejte na atan2." A protože odkaz není funkční, zadal jsem do vyhledávače a našel odkaz na wikipedii[5], kde se píše:

"It was originally intended to return a correct and unambiguous value for the angle θ in converting from Cartesian coordinates (x, y) to polar coordinates (r, θ)."
česky:
"Původně bylo zamýšleno vrátit správnou a jednoznačnou hodnotu pro úhel θ při převodu z kartézských souřadnic (x, y) na polární souřadnice (r, θ)."
A pak se píší vzorce, jestliže platí..
https://wikimedia.org/api/rest_v1/media/math/render/svg/4b7d5a358984daf9513bd73ca49874b36b2cb905
a
https://wikimedia.org/api/rest_v1/media/math/render/svg/5ba7e5dc4e6dbb0685726b0049cd9044672b710a
pak
https://wikimedia.org/api/rest_v1/media/math/render/svg/2f27adec1ac1792288cba78a125b22893a59507a
a
https://wikimedia.org/api/rest_v1/media/math/render/svg/f77fa05199ba9750412c6d3068f3cffbe52ccfed
Podmínka:
Jestliže x > 0 je požadovaná míra úhlu θ = atan2 ⁡ ( y , x ) = arctan ⁡ ( y / x ) .
Avšak, když x < 0, úhel arctan ⁡ ( y / x ) je deametricky opačný požadovaný úhel a ±π (půlka otáčky) se musí připočíst abychom umístili bod do správného kvadrantu.[1]

Teď je tedy otázka jak to vše převést do programovacího jazyka, abych zjistil úhel (bodu na hraně či lépe řečeno úhel hrany na niž se nachází detekovaný bod). První věc. Mám tedy jako vstupy y a x uvést ty součty po násobení kernelem? Tj. jak bylo vysvětleno v čánku (projekt Rhea) na obrázku zde
https://www.projectrhea.org/rhea/images … ion_ex.png

Rád bych stvořil nějaký algoritmus v Delphi, ale s maticema teprve začínám, s knihovnou Graphics (GDI+) jsem ještě nepracoval, ale teoreticky vše až po tu pythagorovu větu chápu. Otázka je tedy jak s výpočtem toho úhlu. Jen dodávám že matematika mi fakt nejde, ale tyto vzorce ještě byly v rozmezí mého chápání.

Zdroje a odkazy:
[1] https://www.iasj.net/iasj/download/5dfe5135a3db1034
[2] Článek vysvětluje Soberovu detekci hran - projekt Rhea https://www.projectrhea.org/rhea/index. … _Detection
[3] https://homepages.inf.ed.ac.uk/rbf/HIPR2/sobel.htm
[4] https://stackoverflow.com/questions/740 … rientation
[5] https://en.wikipedia.org/wiki/Atan2

Offline

 

#2 22. 11. 2022 16:32

Aleš13
Příspěvky: 224
Reputace:   
 

Re: Pomoc se vzorcem na zjíštění orientace hrany (v obrazu)

Nevím jestli dobře chápu co potřebuješ, ale pro jistotu posílám jeden humpolácky napsaný, leč funkční atan2 v Delphi.

//----------------------------------------------------------------------------
function atan2 (x,y : extended) : extended;
// Oriented angle of vector [x,y].                                           
// Range: <0, 2 pi)                                                           
//----------------------------------------------------------------------------
begin
  if (x>0) and (y=0) then result:=0
  else if (x>0) and (y>0) then result:=arctan(y/x)
  else if (x=0) and (y>0) then result:=pi/2
  else if (x<0) and (y>0) then result:=arctan(abs(x)/y)+pi/2
  else if (x<0) and (y=0) then result:=pi
  else if (x<0) and (y<0) then result:=arctan(y/x)+pi
  else if (x=0) and (y<0) then result:=3/2*pi
  else if (x>0) and (y<0) then result:=arctan(x/abs(y))+3/2*pi
  else result:=0; // x=0, y=0
  end;

Offline

 

#3 22. 11. 2022 18:01 — Editoval Karmanova cesta (22. 11. 2022 18:10)

Karmanova cesta
Příspěvky: 46
Reputace:   
 

Re: Pomoc se vzorcem na zjíštění orientace hrany (v obrazu)

↑ Aleš13:
Otázku jsem dal tučně: Mám tedy jako vstupy y a x uvést ty součty po násobení kernelem?
Co jsou vstupy x a co je y? Protože souřadnice si myslím, že to téměř jistě nejsou. V případě toho výpočtu Sober edge detection tam jde nejspíš o ty součty po násobení kernelem? A Delphi tu funkci ArcTan2 obsahuje. Spíš jde o to jak ji použít. Jak provést ten výpočet úhlu v praxi. Vše ostatní kolem matic pokud jsem pochopil teorii toho filtru chápu.

Za ten poslaný kód díky, aspoň vím co ta funkce dělá.

Offline

 

#4 22. 11. 2022 18:13

Aleš13
Příspěvky: 224
Reputace:   
 

Re: Pomoc se vzorcem na zjíštění orientace hrany (v obrazu)

Aha, tak to se omlouvám, s tím asi moc neporadím.

Offline

 

#5 22. 11. 2022 21:36

check_drummer
Příspěvky: 3704
Reputace:   89 
 

Re: Pomoc se vzorcem na zjíštění orientace hrany (v obrazu)

↑ Karmanova cesta:
Ahoj sice jsem to celé nečet, ale podle mě tou maticí musíš pronásobit body v okolí zkoumaného bodu a pak ta výsledná čísla sečíst - tím dostaneš jedno číslo Gx - a podobně pro Gy.


Ve 21. století i vzdělaní lidé učili své děti, že látka je tvořená z atomů.

Offline

 

#6 23. 11. 2022 13:16

Karmanova cesta
Příspěvky: 46
Reputace:   
 

Re: Pomoc se vzorcem na zjíštění orientace hrany (v obrazu)

↑ check_drummer:
Toto už vím. To bylo v jednom tom odkaze od Rhea. Dále jsem přišel na to, že pokud chci spočítat výslednou intenzitu tak vezmu ty dva výsledky a použiju je ve vzorci té pythagorovi věty. A pak jsem se ptal na ten algoritmus pro výpočet úhlu théta. Znamená to tedy, že podobně do toho vzorce 
https://homepages.inf.ed.ac.uk/rbf/HIPR2/eqns/eqnsob3.gif
se dosadí ty součty (Gx místo x a Gy místo y)? A když použiju funkci atan2 místo tan2 výsledek bude ten úhel orientace ve stupních?

Offline

 

#7 23. 11. 2022 18:31 — Editoval check_drummer (23. 11. 2022 18:32)

check_drummer
Příspěvky: 3704
Reputace:   89 
 

Re: Pomoc se vzorcem na zjíštění orientace hrany (v obrazu)

↑ Karmanova cesta:
Chceš zjistit jenom ten úhel [mathjax]\theta[/mathjax] nebo i něco dalšího? Pokud jen úhel, tak podle mě to r počítat nemusíš.
To r by mohlo mít význam intenzity hrany, jak moc je ten přechod ostrý.


Ve 21. století i vzdělaní lidé učili své děti, že látka je tvořená z atomů.

Offline

 

#8 23. 11. 2022 18:34

check_drummer
Příspěvky: 3704
Reputace:   89 
 

Re: Pomoc se vzorcem na zjíštění orientace hrany (v obrazu)

↑ Karmanova cesta:
Jestli ve stupních nebo v radiánech, to záleží jak je to implementováno v tom jazyce. Dosaď si tam něco co má úhel třeba 90 stupňů a uvidíš, co ti vyjde za číslo.


Ve 21. století i vzdělaní lidé učili své děti, že látka je tvořená z atomů.

Offline

 

#9 23. 11. 2022 23:30

MichalAld
Moderátor
Příspěvky: 4328
Reputace:   114 
 

Re: Pomoc se vzorcem na zjíštění orientace hrany (v obrazu)

↑ Karmanova cesta:

Představ si to nejdřív naopak - máš nějakou tu šipku mířící z počátku, má shodou okolností délku přesně odmocnina ze dvou a úhel s osou x 45°. Potom bude x=1 a y=1.

Pokud bude úhel 45+90=135°, bude x=-1, y=1

Analogicky pro 45+90+90=225° bude x=-1, y=-1

a pro 45+90+90+90=315° bude x=1, y=-1

Problém není s funkcí atan, ani s jazykem c, ale už s tím zlomkem. Když vypočítáš to y/x, tak dostaneš v tomhle případě budď plus 1 nebo minus 1. Takže z původních 4 možností máš jen dvě, a funkce atan z toho prostě nemůže dokázat vyrobit zase ty 4 možnosti.

Takže pokud to z nějakého důvodu potřebuješ počítat pomocí toho atan, tak si musíš nejdřív zjistit, která z těch 4 možností to je (podle toho, jestli je x kladné či záporné a y kladné či záporné), potom spočítat atan toho zlomku (nebo třeba absolutní hodnoty toho zlomku, tedy z kladného čísla) a potom upravit ten úhel, podle toho, která z variant nastala.

Ale každý běžně používaný jazyk funkci atan2 má, která tenhle proces udělá za tebe.

Pak ještě může nastat varianta x=0, y=0, kterou by sis měl ošetřit sám. Výsledek takové kombinace je neurčitý, v praxi jej zpravidla položíme rovný nule. Lidsky řečeno, když tam žádná hrana není, tak je jedno, pod jakým je úhlem.

Offline

 

#10 23. 11. 2022 23:40

MichalAld
Moderátor
Příspěvky: 4328
Reputace:   114 
 

Re: Pomoc se vzorcem na zjíštění orientace hrany (v obrazu)

Matice se implementují nejjednodušeji pomocí dvourozměrných polí. To samé obrázky.

Takže v céčku by aplikace jednoho hranového filtru vypadala třeba takto

Code:

for(i = 0; i < NumColumns - FilterSize; i++)
{
   for(j = 0; j <  NumRows - FilterSize; j++)
   {
       double Output = 0;
       for(m = 0; m < FilterSize; m++)
       {
           for(n = 0; n < FilterSize; n++)
             {
                 Output += Image[i + m][j + n] * Filter[m][n];
              }
       }

        FilteredImage[i][j] = Output;
   }
}

Pro Sobelův hranový filtr potřebuješ (což už jsi sám zmínil) ty matice filtrů 2, takže bys měl dva výstupy (třeba Out_X a Out_Y) a z nich pak počítal tu velikost a úhel.

Jinak on se ten úhel většinou nepočítá, při zpracování obrazu to není nějak moc užitečná informace.

Offline

 

#11 23. 11. 2022 23:47

MichalAld
Moderátor
Příspěvky: 4328
Reputace:   114 
 

Re: Pomoc se vzorcem na zjíštění orientace hrany (v obrazu)

Jestli je výsledek funkce atan ve stupních nebo radiánech ... v běžných programovacích jazycích je v radiánech. Protože tak je funkce matematicky definovaná a tak se to také nejjednodušeji počítá. Funkce co mají výstup ve stupních, pokud takové existují, tak se zpravidla jmenují nějak jinak, trochu.

Ale většinou ani neexistují a musíš si to na stupně přepočítat sám, vynásobením konstantou 360/2[mathjax]\pi[/mathjax]

Ale jak říkám, ten úhel hrany se moc nepoužívá, protože ta hrana v obraze je málokdy rovná čára, většinou je to nějaká křivka, a v každém pixelu má úhel jiný. Navíc je ten úhel určený jen ze 2 okolních pixelů, takže je to zatížené dost velkou chybou (šumem).

Když už máš nějakou rovnou hranu a chceš zjistit její úhel, tak je lepší vzít pár bodů té hrany, proložit je přímkou (třeba metodou nejmenších čtverců) a spočítat úhel téhleté přímky.

Ale jestli jsi teprve u pythagorovy věty, tak to máš k alespoň nějakému porozumění image-processingu ještě dost dlouhou cestu, asi...

Offline

 

#12 23. 11. 2022 23:56

MichalAld
Moderátor
Příspěvky: 4328
Reputace:   114 
 

Re: Pomoc se vzorcem na zjíštění orientace hrany (v obrazu)

check_drummer napsal(a):

↑ Karmanova cesta:
Chceš zjistit jenom ten úhel [mathjax]\theta[/mathjax] nebo i něco dalšího? Pokud jen úhel, tak podle mě to r počítat nemusíš.
To r by mohlo mít význam intenzity hrany, jak moc je ten přechod ostrý.

Ano, r má význam "intenzity hrany", což znamená, jak je velký rozdíl mezi tou tmavou a světlou částí snímku.

Ale to může mít dvojí důvod ... jeden z nich je ten, že hrana není ostrá, že to není přechod z černé na bílou v jednom bodě, ale že je rozmazaná a intenzita se mění postupně.

No a druhý důvod je, že jde sice o rychlou, ale malou jasovou změnu. Tedy né z černé na bílou, ale z šedé na o něco světleji šedou.

Nelze nějak jednoduše rozlišit, která z těchto dvou variant to je, rozmazaná hrana dá i rozmazaný výstup, zatímco jasově nevýrazná hrana dá ostrý, byť slabý výstup.

Pokud člověk ví, jaké hrany chce ve snímku hledat, může tomu přizpůsobit ten filtr - tedy udělat tu matici větší. Tahle 3x3 detekuje nejlépe hrany široké 1 pixel, tedy ...černá-černá-černá-šedá-bílá-bílá-bílá...

Na plynulejší hrany bude lépe fungovat větší filtr.

Offline

 

#13 24. 11. 2022 12:00

Karmanova cesta
Příspěvky: 46
Reputace:   
 

Re: Pomoc se vzorcem na zjíštění orientace hrany (v obrazu)

Díky moc všem za reakce, hlavně MichalovyAid. Tak pro mě ta detekce má smysl, protože to mám ke specifickému účelu, kdy by se mi to mohlo hodit. Jedná se o mapy parcel, které chci převést na polygon (skupinu bodů). Myslím že by mi to i hodně mohlo pomoci při zjištění orientace a směru, protože ty body budu muset uspořádat. Takže vědět jestli bod leží na začátku nebo na konci je pomocné v tom abych věděl jakým směrem a kam se pohybuji po čáře. A hlavně pokud znám úhel, mohu ho porovnat s ostatními body a mohu ho tedy potom zprůměrovat, abych vypočítal skutečný směr (nebo vlastně úhel) čáry. Myslím, že jsi mi pomohl si to ujasnit dost hodně. -1 a 1 vlastně znamená vrchol toho pí, respektive pokud by to probíhalo v čase, tak by vznikla sinusovka a -1 a 1 by tedy byli tuším amplitudy (jestli si to ale nepletu s magnitudou - prostě vrchol, maximum nebo minimum).

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson