[Matlab R2013b] binary mask naar polygon

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Kid Jansen
  • Registratie: Oktober 2005
  • Niet online
Ik had woensdagavond een topic aangemaakt op het Mathworks forum. Ik wil namelijk het overlappende deel van twee polygonen berekenen en had een functie gevonden die dat kon doen, maar toen bleek dat ik geen licentie had voor de toolbox waar die functie in zat. Dus ik heb daar toen gevraagd of het ook anders kon.

Inmiddels heb ik met behulp van de functie poly2mask een binary mask weten te maken van de overlap, nou heb ik alleen geen idee hoe ik daar vandaan weer terug ga naar een polygon (liefst als x en y coördinaten van alle vertices). Misschien gebruik ik de verkeerde zoektermen, maar kon geen oplossing vinden.

Als dat niet mogelijk is zou ik op z'n minst de som van alle waardes in de binary mask van de overlap nodig hebben om iets te hebben aan wat ik tot nu toe heb, maar ik heb ook niet kunnen vinden hoe ik dat nou doe.

Hebben jullie enig idee hoe ik dit kan doen?

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Ik gebruik zelf nauwelijks matlab, maar ik zou gokken dat er een functie is die mask2poly heet.

De som van alle waarden binnen een masker kun je bepalen met de sum() functie.

Acties:
  • 0 Henk 'm!

  • Kid Jansen
  • Registratie: Oktober 2005
  • Niet online
mask2poly zit er standaard niet in. Kwam wel aantal mensen tegen die hem zelf hadden gemaakt, maar volgens de comments zaten daar dan foutjes in. Maar in één van die comments zag ik een andere functie staan: bwboundaries.

Had nu de volgende code achter m'n bestaande code geplakt:

code:
1
2
b = bwboundaries(overlap);
b{1,1}


Dit geeft een 1361x2 double die de rand van de vorm in het binary mask geeft. Enige punt nu is dat ik niet goed weet hoe ik daar nu in matlab mee verder ga. Maar het werkt wel. Heb de data namelijk even gekopieerd naar textbestandje en toen in Excel gegooid.

Vervolgens heb ik daar alle waardes gedeeld door 1000 om de eerste vier regels van de onderstaande code terug te draaien:

code:
1
2
3
4
5
6
7
8
9
S = 1000*P;
T = 1000*Q;
J = 1000*L;
K = 1000*M;
b1 = poly2mask(S,T,900,800);
b2 = poly2mask(J,K,900,800);
overlap = b1 & b2;
overlap = flipud(overlap);
imshow(overlap)


Toen ik vervolgens een scatter plot in Excel maakt zag ik dat de vorm wel klopte, hij was alleen gedraaid. Blijkbaar zijn in die 1361x2 double de X en Y verwisseld en de Y is ook verkeerd om.

Ik heb dat toen teruggedraaid door voor elke Y de waarde die ik uit Matlab kreeg van 0,9 af te trekken (de 900 in de poly2mask functies gedeeld door de 1000 waar ik alle waardes mee had vermenigvuldigd).

Dat werkte, zoals je kan zien door het resultaat (de bovenste) te vergelijken met de plot van de binary mask (middelste) en de initiële plot van de gamuts voor er iets berekend was (onderste):
Afbeeldingslocatie: http://tweakers.net/ext/f/5fATDyfUUIrGdPOmha8kAO4s/full.png
Afbeeldingslocatie: http://tweakers.net/ext/f/2deJkwDhHL1g7x40dtOTC7MA/full.png
Afbeeldingslocatie: http://tweakers.net/ext/f/8RodQhJDR7JfSwfWrGeKbArG/full.png

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Het assenstelsel van matlab en excel is inderdaad anders. x/y zijn verwisseld en y is andersom. Matlab werkt namelijk vanuit het punt linksboven (=0,0) en in de volgorde (rij,kolom).

Acties:
  • 0 Henk 'm!

  • Kid Jansen
  • Registratie: Oktober 2005
  • Niet online
even de volgende code er nog achter gegooid:

code:
1
2
3
4
F = xlsread('pointercoverage.xlsx','Sheet1','E1:E1361');
G = xlsread('pointercoverage.xlsx','Sheet1','F1:F1361');
C = polyarea(F,G)
C/B

Kom op een waarde uit van 0.858

Dus de dekking van Pointer's Gamut door de Adobe RGB kleurruimte is 85.8% in het CIE 1931 xy chromaciticiteits diagram. Op basis van het onderste plaatje lijkt me dat een aannemelijke waarde.

Nou is dus alleen nog de vraag hoe ik dat laatste stuk allemaal binnen Matlab houd, want zo wordt het wel heel omslachtig.

Acties:
  • 0 Henk 'm!

  • Kid Jansen
  • Registratie: Oktober 2005
  • Niet online
Helemaal opgelost nu. Niet de mooiste code, maar het werkt en daar doe ik het voor 8)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
X = xlsread('pointerdata.xlsx','specloc','B2:B323');
Y = xlsread('pointerdata.xlsx','specloc','C2:C323');
P = xlsread('pointerdata.xlsx','calculations','DF9:DF44');
Q = xlsread('pointerdata.xlsx','calculations','DG9:DG44');
L = xlsread('pointerdata.xlsx','calculations','DF47:DF50');
M = xlsread('pointerdata.xlsx','calculations','DG47:DG50');
format long
A = polyarea(X,Y);
B = polyarea(P,Q);
S = 10000*P;
T = 10000*Q;
J = 10000*L;
K = 10000*M;
b1 = poly2mask(S,T,9000,8000);
b2 = poly2mask(J,K,9000,8000);
overlap = b1 & b2;
overlap = flipud(overlap);
b = bwboundaries(overlap);
coverage = b{1,1};
coverageX = coverage(1:end,2);
coverageY = coverage(1:end,1);
coverageX = coverageX / 10000;
coverageY = (9000 - coverageY) / 10000;
plot(X,Y,coverageX,coverageY)
axis equal
axis ([0 0.8 0 0.9])
set(gca,'XTick',0:.1:.8)
C = polyarea(coverageX,coverageY);
A
B
C
B/A
C/B
Pagina: 1