2016. 6. 11. 01:04 문학

전화번호

핸드폰을 정리하다 보니 메모장에 언제 썼는지도 모르는 시가 하나 들어 있다.

내용을 보니 어떤 사건이 소재가 되었는지 짐작이 된다. 

아마도 친구들과 술을 마시고 집에 돌아오면서 썼을 것이다.



전화번호


버스 창 밖으로

이번 겨울 처음인 것 처럼

눈은 내리고

알 수 없는 번호로 메시지가 와서

나를 보고 싶다 하는데


알 수 없는 번호가 너무 궁금해 

내 가슴이 답답해 오네


첫사랑 그녀가 생각나기도 하고

그녀와의 사랑이 자꾸 떠올라

좁은 좌석에 몸을 이리저리 뒤척이는데


서툰 몸짓만 기억이 날 뿐

아! 이젠 그녀의 이름도

얼굴도 떠오르지 않아.


눈은 녹고 있는데

버스는 집 앞에 도착해


나는 내려 멀어져 가는

버스를 보고만 있네.


2016.1.20.

'문학' 카테고리의 다른 글

달을 보며 2  (0) 2016.12.09
여백  (0) 2016.12.09
시골 새벽  (0) 2016.04.05
을지로 입구  (0) 2016.02.24
비오는 탄천가에 앉아서  (0) 2015.09.07
Posted by 게 르 니 카

시빌 워( Civil War, 2016  )

마블이 영화를 참 잘 만드는 것 같다. 감칠맛이랄까. 적당히 섞어서는 진지하기도 하고 재미있기도 하고 액션, 의상도 참 멋지고. 이러니 어른들도 이런 황당한 만화에 빠져들 수 밖에. 

한편으로는 이제는 제조업이 아니라 컨텐츠의 시대라는 걸 절절하게 느끼게 한다.


엑스맨 퍼스트 클래스 ( 2011 )

이 영화 이전에 보았던 엑스맨 영화의 모든 상황이 한 번에 정리가 된다.

매그니토와 프로페서 X의 친한 듯하면서 증오하는 관계, 

어쩌다 프로페서 X는 휠체어를 타게 되었나. 등등. 

스케일도 크고 재미있다. 

그런데 시빌워도 그렇고, 이 영화도 그렇고, 문제의 발단이 다 초인 관리에 관한 갈등이다.

실제로 이런 부류의 생명체가 존재한다면 인류가 제어할 수 있을까?

인류보다 더 지적이거나 강력한 힘을 가진 외계인이 나타난다면 그들을 외계인 등록법으로

제어한다고? 아마도 신에게 그러듯 그저 기도하며 구원해달라고 매달리고 있어야 할 것 같은데.


 디버그 ( Debug, 2015 )

또 낚인듯하다. 하는일이 프로그래머다 보니 'DEBUG'라는 단어가 낯설지 않아 보게 되었는데,

사실 '버려진 우주선에 해커들이....  ' 선전 문구 몇 줄만으로는 먼가 그럴싸해보이지 않나?

기본 모티브는 2001년 오딧세이와 비슷하다. 자기 스스로 방어하는 컴퓨터가 우주선을 

수리하러 오는 사람들마다 죽여서는 그 사람의 정신을 학습데이타로 사용해가며 강해진다.

연출력의 부재인지, 연기력 문제인지는 모르겠지만 전체적으로 허술하다.

압권은 먼저 당한 동료들의 도움으로 인공지능을 물리친다니..... 

'영화' 카테고리의 다른 글

주토피아, 스켈리톤 키  (0) 2016.07.02
곡성, 아이덴티티, 이벤트 호라이즌  (0) 2016.06.26
버드맨  (0) 2016.05.08
스타워즈7, 와호장룡2, 차이나타운  (0) 2016.05.06
게임 체인저, 데드풀  (0) 2016.05.05
Posted by 게 르 니 카

허프 변환을 이용한 원의 검출 중에 반지름을 고정시키지 않은 방법에 대해서 정리한다.


기본 이론은 앞에서 정리했고 보완된 작업 위주로 정리한다. 


1) 반지름 범위 반영.

2) 스무딩.

3) 로컬 극대값 계산.

4) 근접 원들 합치기.

5) 결과.

6) 문제점.


1) 반지름 범위 반영

찾고자 하는 원의 크기를 범위로 지정할 수 있는데, 범위가 넓어질 수록 메모리와 계산량이 증가한다. 또한 반지름의 크기를 어느 정도 세밀하게 찾을 것인가를 지정할 수 있는데 이 역시 세밀하게 할 수록 부하가 심해질 것이다. 일단 예제는 반지름이 30~60 픽셀 원을 찾도록 하고 간격은 5 픽셀 정도로 했다. accumulator 공간이 반지름 변수의 추가로 3차원이 되었다.

rmin_idx = 30;

rmax_idx = 60;

r_step = 5;

accumulator = zeros( height+2*rmax_idx, width+2*rmax_idx, rmax_idx );


for r_idx=rmin_idx : r_step : rmax_idx

    for y_idx=1 : height

        for x_idx=1 : width

            if( edge_image(y_idx,x_idx) > 0 )

                for degValue=5 : 5 : 360

                    a_idx = round( x_idx-r_idx*cos(pi*degValue/180) );

                    b_idx = round( y_idx-r_idx*sin(pi*degValue/180) );

                    accumulator( b_idx+r_idx, a_idx+r_idx, r_idx ) = accumulator( b_idx+r_idx,                                                                                            a_idx+r_idx, r_idx )+1;

                end

            end

        end

    end

end

z축의 관점에서 보면 6군데에서 값이 크게 보인다. 

보이는 각도를 변경시키면 더 명확하게 확인할 수 있다. 반지름이 30, 45, 60정도에 주로 분포한다. 

각 반지름에서의 누적된 분포를 보면 다음과 같다. 







2) 스무딩

로컬 최대값을 찾기 위해서 스무딩처리를 한 후 임계값 이하는 0으로 처리한다. 

thresholdValue = 5.0;

for fig=0 : (rmax_idx-rmin_idx)/r_step

    figure(fig+1);

    

    smoothAccum(:,:,rmin_idx+fig*r_step) = imfilter( accumulator(:,:,rmin_idx+fig*r_step),                                                                       fspecial('disk',5), 'replicate' );

    

    for row=1:yd

        for col=1:xd

            if( smoothAccum(row,col,rmin_idx+fig*r_step) < thresholdValue )

      smoothAccum(row,col,rmin_idx+fig*r_step) = 0.0;

            end

        end

    end


    mesh( smoothAccum(:,:,rmin_idx+fig*r_step) );

    view(-15,70);

    title( strcat( 'radius : ', num2str(rmin_idx+fig*r_step) ), 'color', 'black' );

end


3) 로컬 극대값 계산

로컬 극대값을 찾는 함수를 사용해 극대값 위치를 찾는데 편평한( 모든 값이 일정한 ) 평면의  경우 모든 점을 로컬 극대값으로 계산하기 때문에 편평하지 않은 이미지에 대해서만 계산하도록 한다.

posCnt = 0;

posIdx = zeros(10,3); % ( x, y, radius )

for fig=0 : (rmax_idx-rmin_idx)/r_step

    posImg = imregionalmax( smoothAccum(:,:,rmin_idx+fig*r_step) );

    if( max(max(posImg)) == min(min(posImg)) )

        disp( 'no data' );        

    else

        for y=1 : yd

            for x=1 : xd

                if( posImg(y,x) > 0 )

                    posCnt = posCnt+1;

                    posIdx(posCnt,1) = x-(rmin_idx+fig*r_step);

                    posIdx(posCnt,2) = y-(rmin_idx+fig*r_step);

                    posIdx(posCnt,3) = rmin_idx+fig*r_step;

                end

            end

        end

    end    

end


4) 근접 원들 합치기.

같은 원을 다른 원으로 찾은 것 들을 하나로 합치는데 중심간의 거리가 최소 반지름보다 작은 것들은 하나라고 간주한다.( 중심이나 반지름이 약간 다른 원을 합치면서 정확한 원을 약간 벗어나게 찾을 수 있다. 이 부분은 개선의 여지가 있다. )

[ posCnt col ] = size( posIdx );  

cirIdx = posIdx;

cirIdx(:,4) = zeros();

cirCnt = 0;


for outer=1 : posCnt

if( cirIdx(outer,4) == 0 )

cirCnt = cirCnt+1;

cirIdx(outer,4) = cirCnt;

for inner=outer+1:posCnt

eucDist = sqrt( (cirIdx(outer,1)-cirIdx(inner,1))^2+(cirIdx(outer,2)-cirIdx(inner,2))^2 );

if( eucDist < rmin_idx )

cirIdx(inner,4) = cirIdx(outer,4);

end       

end

end

end


mergedMax = max( cirIdx(:,4) );

mergeIdx = 1;


mergeCnt = zeros( mergedMax, 1 );

xtotal = zeros( mergedMax, 1 );

ytotal = zeros( mergedMax, 1 );

rtotal = zeros( mergedMax, 1 );


for idx=1 : posCnt

xtotal( cirIdx(idx,4) ) = xtotal( cirIdx(idx,4) ) + cirIdx(idx,1);

ytotal( cirIdx(idx,4) ) = ytotal( cirIdx(idx,4) ) + cirIdx(idx,2);

rtotal( cirIdx(idx,4) ) = rtotal( cirIdx(idx,4) ) + cirIdx(idx,3);

mergeCnt( cirIdx(idx,4) ) = mergeCnt( cirIdx(idx,4) )+1;

end

for circle=1 : mergedMax

circleIndex(circle,1) = xtotal(circle)/mergeCnt(circle);

circleIndex(circle,2) = ytotal(circle)/mergeCnt(circle);

circleIndex(circle,3) = rtotal(circle)/mergeCnt(circle);

end



5) 결과



6) 문제점

① 이진화의 정밀도에 따라서 이후 작업에 영향 

    - 노이즈의 비율에 따라 끼치는 영향의 정량적인 분석 필요.

② 원주의 가려지는 비율과 노이즈 또는 threshold 값 결정에 주는 영향 정도 파악.

③ accumulator 공간에서 local maxima를 찾기위한 threshold 값을 결정하는 방법 고민.


'프로그래밍 > 영상처리' 카테고리의 다른 글

ubuntu octave 설치  (0) 2016.07.22
허프 변환 - 원(1/2)  (0) 2016.05.03
허프 변환 - 직선  (0) 2016.04.28
모달리티(Modality)  (2) 2016.04.13
Posted by 게 르 니 카

블로그 이미지
게 르 니 카

공지사항

Yesterday
Today
Total

달력

 « |  » 2025.2
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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함