Coding/Python Matlab

Matlab - bmp_to_data()

smores 2022. 11. 12. 13:43

직접 작성해서 유용하게 잘 써먹는 함수 중 하나입니다.

 

가끔 그림으로 된 그래프를 수치 데이터로 변환하고 싶을때 사용합니다. 사용법은

 

1. 우선 rgb 3 color layer 24비트 (또는 alpha 포함한 4 layer 32비트) 이미지로 그래프를 준비하고

2. 그림에 원색이 섞여있거나 하면 가급적 원색이 없는 상태로 (예를 들어 24비트 그레이) 만들고

3. 윈도우 그림판에 그림을 올린 후 그림에 없는 색상을 기준으로 데이터 범위를 둘러싸는 외곽선과 원하는 데이터 포인트를 원하는 색상으로 두께 1 pixel 짜리 선과 점으로 표시해둡니다. 이 함수는 색상을 기준으로 좌표 범위와 데이터 포인트를 찾습니다. 

4. 함수의 인자는 help 로 보면 설명이 나옵니다. 

 

 

 

예를 들어 이런 그림이라는 가정하에

그림판에 불러와서 범위 외곽선은 파랑(0,0,255), 데이터 포인트는 빨강(255,0,0) 으로 찍어서 bmp 로 저장해 둡니다.

확대해서 본 빨강 데이터 포인트

 

이 그림이 들어있는 폴더에서 함수를 다음과 같이 실행하면 X, Y 에는 좌표계의 데이터포인트가 나오고, PX,PY 는 해당 포인트의 이미지 내의 픽셀 유닛의 위치, WinPts 는 데이터 범위 윈도우 (파랑 실선 사각형) 좌하, 우상단의 이미지 내의 픽셀 좌표를 반환합니다.

 

>> [X,Y,PX,PY,WinPts] = bmp_to_data('testdata.bmp', [0,0,255], [0,0,19,30], [255,0,0], 11);
>> plot(X,Y,'o-')

 

만일 데이터가 연속적인 선 또는 엄청 많은 데이터 포인트라 손으로 찍기 곤란하면 적당한 꼼수로 알아서 색상을 맞춰주면 됩니다. 예를 들어 이런 그림이 있는 경우

 

저의 경우 일단 윈도우 그림판에서 16컬러 비트맵으로 저장한 다음 (이 경우 사용 색상갯수가 16개로 줄어들면서 진한  파랑, 빨강은 원색 파랑, 빨강으로 바뀌고 옆의 희미한 색상은 적당히 회색으로 바뀌는군요), 다시 24비트 비트맵으로 도로 덮어서 저장합니다. 이때 바뀐 이미지에서 빨강과 파랑 색상을 스포이드로 찍어서 확인해 보면 (255,0,0), (0,0,255) 가 되어 있음을 확인할 수 있었습니다.

이 상태에서 경계만 노랑(255,255,0) 선으로 그려주고

준비된 함수로 파랑 데이터선과 빨강 데이터 선을 얻을 수 있습니다. (위의 그림들은 300% 확대해서 보여주고 있습니다. 실제 이미지에서 노랑선은 1 픽셀짜리 가늘은 선입니다)

 

>> [Xb,Yb,PXb,PYb,WinPts] = bmp_to_data('p1-2.bmp', [255,255,0], [-4,0,4,1], [0,0,255], 11);
>> [Xr,Yr,PXr,PYr,WinPts] = bmp_to_data('p1-2.bmp', [255,255,0], [-4,0,4,1], [255,0,0], 11);
>> plot(Xb,Yb, Xr,Yr)

여기서 데이터 선들이 1픽셀 가늘은 선이 아니기게 스탭으로 오르는 부분들은 깔끔하게 연결이 안되고 오르락 내리락 하는 식의 모습도 보입니다. 이런 경우는 또 다른 꼼수로 처리할 수 있는데 이 글에선 거기까진 설명하지 않고 마무리 합니다.

 

색상으로 좌표 범위와 데이터 포인트들을 찾는다는 개념만 이해하면 그림마다 적당한 꼼수는 얼마던지 생각해 낼 수 있을 것이라 생각합니다. 😅

 

 

bmp_to_data.m
0.00MB