본문 바로가기

科學思索(과학사색)

Wear volume analyzer 제작기 (1) AFM topography 데이터 matlab에서 읽어들이기



VC++로 프로그램을 짤까 하다가, 괜히 그래픽 처리하는 것 땜에 노력은 노력대로 잡아먹고 피곤할까봐 matlab을 이용해보기로 했는데,




(이게 재앙의 시작일줄 누가 알았겠나....ㅠㅠ)




우선 AFM의 topography 파일은 다음과 같은 형태이다.




"Pixels2048" 


"Lines  512" 


1.0328E+1,1.0174E+1,1.1255E+1,1.4805E+1,1.8821E+1,2.3145E+1,2.6851E+1,3.0403E+1,3.3490E+1,3.6271E+1,3.8897E+1,4.1212E+1,4.3220E+1,4.4919E...........




이렇게 맨 첫 줄에 픽셀 개수, 다음줄에 라인 개수, 그리고 나서는 바로 데이터의 나열이다. 한 라인당 2048개의 픽셀이 가로로 펼쳐져 있고 세로로는 512개의 라인이 있는 셈인데,


(물론 픽셀과 라인의 개수는 AFM에서 측정할 때의  옵션에 따라 달라진다)




정작 데이터는 라인구분 없이 전부 쉼표로만 연결되어 있다. 그러니까, 2048 * 512개의 데이터가 그냥 1차원적으로 계속 나열되고 있다는 뜻이다.






일단 데이터를 읽어오기 위해서 이러한 방법을 사용했다.




 file = fopen('파일이름','r');


dummy = fgetl(file); 


pixels = sscanf(dummy, '"Pixels%d');


dummy = fgetl(file);


lines = sscanf(dummy, '"Lines %d');


[zdata,count] = fscanf(file, ['%f' ',']);






fopen으로 파일을 열고, 임시변수(dummy)에 첫줄을 읽어들인 뒤에 sscanf로 Pixels뒤의 숫자를 따오고 마찬가지로 Lines 뒤의 숫자를 따와서 픽셀과 라인 개수를 구했다.




콤마로 연결된 데이터를 한방에 읽어들이기 위해서 fscanf에서 사각 괄호 안에 ',' 기호를 넣어서 문제를 해결.




이렇게 읽어들이면 zdata는 1차원 행렬이 되므로, mesh 함수를 통해 그래프를 그릴 수 없게 되므로




뭔가 좀더 쉬운 방법이 있을 거라고 생각은 들지만, 나는 matlab을 혼자서 마구잡이로 배우는 중인 관계로 아래와 같은 뻘짓을 통해 행렬을 변환했다.




Zforplot = zeros(lines, pixels);


for n=1:lines


    begin = 1+((n-1)*pixels);


    endding = pixels+((n-1)*pixels);


    Zforplot(n,:) = zdata(begin:endding, 1);


end



이렇게 해서 2차원 행렬로 변환 한 뒤에




xline = [1:1:pixels];


yline = [1:1:lines];


[X, Y] = meshgrid(xline, yline);


mesh(X,Y,Zforplot);


fclose(file);




이렇게 mesh 함수로 그래프를 그려서 마무리!





다음 목표로는, 특정 위치에 대해 마스킹을 하고, 기준면 (reference plane)을 잡아서 마모 체적을 구하거나 혹은 전후 이미지의 맵핑을 통해서 발생한 마모의 양을


정확히 측정하고자 하는 것이다.