'프로그래밍/영상처리'에 해당되는 글 5건

  1. 2016.07.22 ubuntu octave 설치
  2. 2016.05.11 허프 변환 - 원(2/2)
  3. 2016.05.03 허프 변환 - 원(1/2)
  4. 2016.04.28 허프 변환 - 직선
  5. 2016.04.13 모달리티(Modality) 2

기존에 matlab만 사용하다가 

ubuntu로 넘어오면서 octave라는 프로그램을 알게 되었다.

소프트웨어 센터에서 QtOctave를 설치했는데 그래프만 그리면 화면을 닫을 수가 없다. 

그래서 사용을 못하다가 더 이상 미루면 안될 것 같아 작정하고 검색을 시작했다.

몇 번의 시행착오 끝에, 비교적 쉽게, 정상적으로 동작하는 옥타브를 설치했다.


일반적으로 

sudo apt install octave

하면 된다고 하는데 .... 안된다.


우선 octave에 사용된 라이브러리를 먼저 설치해 주어야 한다.

sudo apt install build-dep octave
이 상태에서 설치하면, qt4가 없어서 GUI를 설치 못한다는 경고가 보인다.
시냅틱 팩키지 매니저에 가서
libqt4-opengl-dev 를 설치한다.


다음, 아래 주소로 가서 최신 소스를 다운받는다.
이 글 작성 시에는 octave-4.0.3.tar.gz.


원하는 곳에다 소스를 풀고 컴파일하고 설치한다.
./configure
sudo make -j4
sudo make install
잘 동작한다.

ps1. 이 글은 우분투 14.04 에서의 상황인데 노트북의 16.04에서 해보니 잘 안된다.
      그래서 찾아보니 그냥 sudo apt install octave 만으로도 똑 같이 설치된다. ㅠㅠ.


ps2. 에디터에 문제가 있어서 검색을 하다보니 아래 방법도 나쁘지 않은 것 같다.

sudo add-apt-repository ppa:octave/stable

sudo apt update

sudo apt upgrade


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

허프 변환 - 원(2/2)  (0) 2016.05.11
허프 변환 - 원(1/2)  (0) 2016.05.03
허프 변환 - 직선  (0) 2016.04.28
모달리티(Modality)  (2) 2016.04.13
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 게 르 니 카

허프 변환을 이용한 원의 검출에 대해서 정리한다.


작업 순서는 다음과 같은데 설명은 기본 이론 요약 후 결과 이미지를 보며 설명한다.


1) 이론 이해.

2) 이미지 로딩.

3) 이진화.

4) 엣지 검출.

5) HT 공간 변환.

6) accumulator local maxima 찾기.

7) ( x, y )좌표에 원 표시.

8) 문제점.


1) 이론 이해.

일단 원을 수식으로 표현하면 다음과 같다.

원의 중심은 ( a, b ), 반지름은 r 인 원.


( x, y ) 평면을 ( a, b, r ) 공간으로 변환시키기 위해서 원의 식을 다른 방법으로 표현한다.

θ는 0 ≤ θ ≤ 2π .


( x, y ) 평면 상의 후보 픽셀을 ( a, b, r ) 공간으로 변환하는 작업을 아래와 같이 수행한다.


for r from r_min to r_max

for x from x_min to x_max

           for y form y_min to y_max

accumulator( a, b, r ) += 1

end

end

end


( a, b, r ) 공간의 값들 중에 지역 최대 값을 찾아 다시 ( x, y )평면으로 변환하면 원을 구할 수 있다.  


2) 이미지 로딩

일단 중간 크기 동전을 찾도록 반지름을 45으로 고정해서 계산한다. 이 후에 반지름 고정 없이

모든 원을 찾을 수 있도록 업그레이드 시킨다.

filename = 'coins3.jpg';

image = imread( filename );

3) 이진화 검출

컬러 이미지를 grayscale로 변환하고 Otsu's 방법을 이용해서 threshold 값을 찾고 이진화 후 'open' 모폴로지 연산을 적용하여 작은 조각들을 제거한다.

gray_image = rgb2gray( image );

level = graythresh( uint8(gray_image) );

binary_image = im2bw( uint8(gray_image), level );

binary_image = bwmorph( binary_image, 'open' );

4) 엣지 검출

sobel 필터를 사용해서 엣지 검출.

edge_image = edge( binary_image, 'sobel' );

5) HT 공간 변환.

윗 수식에 맞게 공간 변환 작업 수행.

수식 그대로 적용하면 싸인 함수 때문에 마이너스 인덱스를 갖을 수 있어서 에러가 발생한다.

최대 반지름 만큼 수평 이동시켜 인덱스를 구하고 나중에 값에서 최대 반지름 값을 빼준다.

accumulator = zeros( height+2*r_idx, width+2*r_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 ) = accumulator(                                                                                                b_idx+r_idx, a_idx+r_idx )+1;

end

end

end

end


6) accumulator local maxima 찾기.

아래 이미지의 가운데 상 하 원의 중심점 찾기.

thresholdValue = 5;

smoothAccum = imfilter( accumulator, fspecial('disk',5), 'replicate' );

[ height2 width2 depth2 ] = size( smoothAccum );


for y=1 : height2

for x=1 : width2

if( smoothAccum(y,x) < thresholdValue )

smoothAccum(y,x) = 0;

end

end

end

posImg = imregionalmax( smoothAccum );

posIdx = zeros(5,2);

posCnt = 0;


for y=1 : height2

for x=1 : width2

if( posImg(y,x) > 0 )

posCnt = posCnt+1;

posIdx(posCnt,1) = x-r_idx;

posIdx(posCnt,2) = y-r_idx;

end

end

end


7) (x,y)좌표에 원 표시.

원 표시.

NOP = 120;

THETA = linspace(0,2*pi,NOP);

RHO = ones(1,NOP)*r_idx;

[ origX, origY ] = pol2cart( THETA, RHO );


for circ=1 : posCnt

X = origX+posIdx(circ,1);

Y = origY+posIdx(circ,2);

plot(X,Y,'g', 'LineWidth', 2);

end


8) 문제점

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

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

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

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



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

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

허프 변환은 이미지 속에서 주요 특징 요소 들을 - 직선, 원, 타원, 등등 - 찾는 방법이다.

1959년 Paul Hough가 'bubble chamber' 사진의 기계적 분석을 위해 고안했으며,

1962년 "Method and Means for Recognizing Complex Patterns" 이란 타이틀로 미국 특허를 

획득했다. 더 자세한 이력이나 설명은 위키에 자세히 나와 있다.


우선 기본 원리부터 이해하자.


직선을 수학적으로 표현하는 방법에는 여러 가지가 있다.


( x, y ) 평면에서 기울기 m, 절편 n인 직선은

y = m*x + n.


( x1, y1 ), ( x2, y2 ) 두 점을 지나는 직선은

y - y1 = ( ( y2-y1 ) / ( x2-x1 ) ) *( x - x1 ).


x 절편이 a, y 절편이 b인 직선은 아래와 같다.

아래 그림을 보자.

 


빨간 직선을 절편이 아닌 각도와 거리로 표현하려면 어떻게 해야할까?

빨간 직선의 x 축과 만나는 점을 x1, y 축과 만나는 점을 y1이라 하면  

( x, y ) 평면 상의 한 점 ( x2, y2 )를 위 직선의 방정식에 대입하면

r = x2cosθ +y2sinθ 이 되어 θ 값에 따라 r의 값이 변하는 곡선이 된다.


x 축은 θ가 0이고 -x 축은 180도가 되어 θ가 0 <= θ < pi/2 이 구간이면 ( x2, y2 ) 점을 지나는 

( x, y ) 평면상의 모든 직선을 표현할 수 있다. 


아래 그림을 보면

첫 화면은 (2,2)점을 지나는 기울기가 다른 직선들을 표시한 것이다. 초록색 직선의 경우 θ는 30도 정도 될 것이다.( 원점을 지나며 초록색 직선과 수직인 직선의 x축과의 각도 ), 빨간색 직선은 60도.


두번째 화면은 각 직선들의 ( θ, r ) 평면상의 위치를 표현한 것으로 r = 2cosθ +2sinθ 인 직선에서 각도가 30도로 고정되면 r의 길이도 결정되어 한 점이 된다.


세번째는 각도를 0도 부터 180도까지 1도씩 증가시킨 것으로 sine 곡선이 된다.


( x, y ) 평면 상의 5개 점을(왼쪽 그림) ( θ, r ) 평면에 표현하면(오른쪽 그림) 0도에서 180도로 변함에 따라 r의 값이 변하여 삼각함수 곡선이 5개가 그려진다. 5개의 점이 일직선 상에 있다면 ( θ, r ) 평면의 5개 곡선은 한 점에서 만나게 된다. 위 예의 경우 만나는 지점의 위치는 ( 45, 2.828 ) 이다.  r = xcosθ +ysinθ  직선에 θ=45, r=2.828을 대입하면 2.828 = xcos(45)+ysin(45) 는  y = -x + 4 의 직선을 얻을 수 있다.

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

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

DICOM이나 PACS에 관련된 자료를 보다 보면 모달리티란  말이 자주 보인다.

평소 '영상 획득 장비' 정도로 생각하고 넘어갔는데 오늘 Qt 책을 보다 모달(Modal) 창 얘기가 나와서

이 기회에 확실하게 개념을 정립하고 싶어졌다.


이 그림은 PACS 시스템 중에서도 영상 획득 관점에서 바라보는 그림이긴 하지만 하고 싶은 말은 저 상단의 장비에 붙어있는 단어를 보자는 것이다. MRI든 초음파든 여러 장비니까 Modalities 복수일 것이고 DICOM Modality Worklist 라는 단어도 보이고 Acquisition gateways 라는 말도 보인다.


우선 Modality 에 관한 일반적인 뜻을 찾아보았다.


mo·dal·ity [moʊ|dӕləti] 명사 복수형 modalities
1. [C] (격식) 양식, 양상
   They are researching a different modality of treatment for the disease.
   그들은 그 질병에 대한 다른 치료 양식을 연구하고 있다.
2. [U] (언어) 법성(법조동사(modals)로 표현되는 의미)
3. [C] (생물) (인체의 감각적) 양상
   the visual and auditory modalities
   시각 및 청각적 양상


한글이라도 어려운 단어가 보인다.

양식, 양상, 양태.


다시 국어사전을 찾아보았다.


양식(樣式) 1. 일정한 모양이나 형식.
양상(樣相) 1. 사물이나 현상의 모양이나 상태.
양태(樣態) 1. 사물이 존재하는 모양이나 형편. ‘모습’, ‘상태’.


모양, 모습, 형식, 현상, 상태 비슷한 말이긴 한데 왜 장비에 저런 단어를 붙였을까?

아직도 명쾌하지 않아 더 찾아보았다.

양태를 찾다 보니 물고기도 나오고 작문에 관한 것들도 보이고 하다가 제일 비슷한 걸 찾았다.


철학 분야에서 실체와 양태에 관련한 글들이 많이 검색되었는데 '노동자의 책' 이란 사이트에서 본 다음 글이 제일 간략하면서 핵심을 설명하는 것 같다.


[양태] (〔樣態, 라 modus〕)

일반적으로 사물의 존재 방식을 의미하는 말이지만 데카르트 및 스피노자에 의해서 특수한 의미가 주어지게 되었고, 특히 스피노자의 철학에 있어서 중요한 개념이다. 스피노자는 유한한 사물을, 무한한 실체 즉 신(神)이 변화해 가는 잠시 동안의 형태로 고찰하면서 그것을 양태라고 부른다. 다시 말하면 물이 실질(實質)을 바꾸지 않고, 그릇 모양대로 형태를 변화시키는 것과 같은 것이다. "양태는 실체의 변화하는 모습이다."라는 그의 정의는 이러한 의미라 할 수 있겠다. 따라서 양태는 실체 속에 있고, 실체 없이는 생각할 수 없는 것이다. 그런데 실체의 본질은 속성이기 때문에 양태는 실체의 속성이 변화하는 모습이다. 양태는 실체의 비본질적인 상태이고 그 점에서 우연성과 다름이 없지만, 그것을 실체가 변화하는 형태라는 관점에서 파악한 것이다.


이 내용을 보고 DICOM 표준에 관여한 사람들의 인문학적 수준에 놀라지 않을 수 없었다.

위 설명을 그대로 DICOM 안에서 '실체와 양태(Modality)'라는 개념에 비유하자면 아마도 이렇지 않을까?


실체는 사람의 몸이 될 것이고 모든 다양한 장비 또는 장비에서 만들어져 나온 영상 데이타는 사람 몸의 여러 정보들이 제각각의 방식으로 표현되어진 모양, 상태 일테니 이것은 '양태'라 부르자.


절로 무릎을 치며  감탄할 정도로 너무나 정확한 표현이 아닐 수 없다.

( 아직까지는 제 개인적인 추측입니다. )


위에 나온 두 단어를 OTPedia 에서 찾아보았다.


Acquisition Modality

In the context of medical imaging, a modality is device or system that generates images of the internals of the human body. Examples of specific modalities include computed tomography (CT) scanners and nuclear medicine (NM) cameras.  In addition to images, some modalities can also create other evidence objects such as Grayscale Softcopy Presentation States for the consistent viewing of images or Evidence Documents containing measurements.

Modalities are typically not included as part of the PACS, mainly because they are already exist, independently of a PACS. An exception to this is Computerized and Digital Radiography (CR/DR). The reason to include CR/DR modalities as part of PACS, is that their benefits are really only realized when using a PACS system to archive, view and communicate the images.



Modality Worklist
DICOM Modality Worklist (MWL) makes patient demographic information from a Radiology Information System (RIS) available at a modality, eliminating dual data entry and providing data integrity.

The Modality Worklist Service is structured like the Query/Retrieve SOP class; it defines a combination of an information model with a DICOM command or service. The DICOM command is C_FIND; and the defined SOP Class is Modality Worklist Information Model - FIND.

The advantage of the Modality Worklist service is that retyping patient demographic and scheduling information is eliminated at the modality. Demographic information such as patient name, birth date, sex, etc. is copied from the retrieved worklist. In addition to the time saved, there is a much bigger advantage - data integrity.

Modality Worklist is often used in two different manners by a device. Some devices retrieve the information in real-time, and some update the list by polling the IS on regular intervals.



   


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

ubuntu octave 설치  (0) 2016.07.22
허프 변환 - 원(2/2)  (0) 2016.05.11
허프 변환 - 원(1/2)  (0) 2016.05.03
허프 변환 - 직선  (0) 2016.04.28
Posted by 게 르 니 카
이전버튼 1 이전버튼

블로그 이미지
게 르 니 카

공지사항

Yesterday
Today
Total

달력

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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함