λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ€– Computer Vision

컴퓨터 λΉ„μ „ μ˜μƒμ²˜λ¦¬ - μ—°κ²°μš”μ†Œ (ν™”μ†Œμ˜ λͺ¨μ–‘κ³Ό μ—°κ²°μ„±, λ²”λžŒμ±„μ›€) Python μ‹€μŠ΅ μ½”λ“œ

ν™”μ†Œμ²˜λ¦¬λž€?

ν™”μ†Œμ²˜λ¦¬λŠ” μž…λ ₯ μ˜μƒμ˜ ν™”μ†Œκ°’μ΄ μˆ˜ν•™μ μΈ ν•¨μˆ˜λ₯Ό κ±°μ³μ„œ μƒˆλ‘œμš΄ κ°’μœΌλ‘œ λ³€κ²½λœ 후에 좜λ ₯ μ˜μƒμ˜ λ™μΌν•œ μœ„μΉ˜μ— μ €μž₯ν•˜λŠ” 것을 λ§ν•œλ‹€. 

 

ν™”μ†Œμ˜ λͺ¨μ–‘κ³Ό μ—°κ²°μ„±

ν™”μ†Œμ˜ λͺ¨μ–‘ 

μ˜ˆμƒλ˜λŠ” ν™”μ†Œμ˜ λͺ¨μ–‘

 

 

ν™”μ†Œμ˜ μ—°κ²°

 

 

4-μ—°κ²°μ„±κ³Ό 8-μ—°κ²°μ„±

 

λ©”λͺ¨λ¦¬λ₯Ό 적게 μ‚¬μš©ν•˜λŠ” λ²”λžŒ 채움 μ½”λ“œ

bλ₯Ό l둜 λ³΅μ‚¬ν•œλ‹€. μ΄λ•Œ 0은 0, 1은 -1둜 볡사 //-1은 아직 번호λ₯Ό μ•ˆ λΆ™μ˜€μŒμ„ ν‘œμ‹œν•¨
l의 경계. 즉 j = 0, j = M-1, i = 0, i = N-1인 ν™”μ†Œλ₯Ό 0으둜 μ„€μ • //μ˜μƒ λ°”κΉ₯으둜 λ‚˜κ°€λŠ” κ±Έ λ°©μ§€ν•˜κΈ° μœ„ν•¨ 
label = 1;
for(j = 1 to M-2)
	for(i = 1 to N-2) {
		if(l(j, i) = -1) {
			efficient_floodfill4(l, j, i, label);
			label++;
		}
	}

//λ©”λͺ¨λ¦¬λ₯Ό 적게 μ‚¬μš©ν•˜λŠ” 효율적인 4-μ—°κ²°μ„± λ²”λžŒ 채움 ν•¨μˆ˜
function efficient_floodfill4(l, j, i, label) {
	Q = NULL;	//빈 큐 생성
	push(Q(j, i));
	while(Q != NULL) {
		(y, x) = pop(Q);	//Qμ—μ„œ μ›μ†Œ ν•˜λ‚˜ κΊΌλ‚΄κΈ° 
		if(l(y, x) = -1) {
			left = right = x;
			while(l(y, left-1) = -1) 	//아직 미처리 μƒνƒœμΈ 열을 μ°ΎλŠ”λ‹€. 인접 μ™Όμͺ½ 쀑 labeling이 λ˜μ§€ μ•Šμ€ 경우
				left--;
			while(l(y, right+1) = -1)	//인접 였λ₯Έμͺ½ 쀑 labeling이 λ˜μ§€ μ•Šμ€ 경우 
				right++;
			for(c = left to right) {
				l(y, c) = label;
                		//인접 μœ„μͺ½ 쀑 labeling이 λ˜μ§€ μ•Šμ€ 경우
				if(l(y-1, c) = -1 and (c = left or l(y-1, c-1) != -1)) 	
					push(Q, (y-1, c));
                		//인접 μ•„λž˜μͺ½ 쀑 labeling이 λ˜μ§€ μ•Šμ€ 경우
				if(l(y+1, c) = -1 and (c = left or l(y+1, c-1) != -1))
					push(Q, (y+1, c)); 
			} 
		}
	}
}

 

728x90