Our Palmistry principal lines detection software is implemented by 4 steps below. Our main challenge was to read the principal lines on a palm regardless of the view direction and illumination:
- Warping a tilted palm image
- Detecting principal lines on a palm
- Classifying the lines
- Measuring the length of each line
The codes are written based on Python 3.7.6. These are the requirements for running the codes:
- torch
- torchvision
- scikit-image
- opencv-python
- pillow-heif
- mediapipe
In order to install the requirements, run pip install -r ./code/requirements.txt
.
- Before running the codes, a palm image for input(.heic or .jpg) should be prepared in the
./code/inputs
directory. We provided four sample inputs. - Run
read_palm.py
by the command below. After running the code, result files will be saved in the./code/results
directory.
> python ./code/read_palm.py --input [filename].[jpg, heic]
Update: 22.12.03 21:57
-
Assumption
- line이 image의 테두리까지 가는 경우가 없음 (이 경우 scikit의 skeletonize가 종종 안됨. skeletonize 되더라도 grouping 알고리즘 조금 수정 필요)
- 선들이 교차하는 점은 최대 하나 (test case에 따랐음. 약간의 추가 구현으로 처리 가능하기는 함)
-
line grouping
- return value : list of lines, each lines are also a list of pixels
example : [ [[1, 2], [2, 3]], [[10, 11], [11, 11]] ]
- explanation of implementation
- 전체 픽셀에 대해 둘레 8픽셀 중 0이 아닌 값을 count
- count 결과물은 0: 선 위에 없음, 1: 선의 끝, 2: 선의 중간, 3: 선의 교차점으로 구분됨
- 선의 끝인 pixel에서 시작해서 주변 8픽셀을 탐색, count가 0이 아니고 방문하지 않은 pixel을 따라감
- 가다보면 count가 1이나 3인 pixel에 도달
- 1인 pixel이면 line을 하나 찾은 것이므로 저장하고 역방향 탐색이 되지 않도록 for문에서 제외. 3인 pixel은 line을 따로 저장해놨다가 추후 조치
- 3으로 끝난 line들끼리 이을 수 있나 확인: 시작점, 끝점 차이 확인해서 방향이 반대인 모든 조합들을 이어서 line에 저장
- 저장한 line들을 return
- skeletonize가 붙어있지 않던 선을 붙이는 경우 있음 (1 case, 선 하나가 약간 길게 나오게 됨) -> 추가 test 필요
- 끊어진 라인 처리가 애매함 : 현재는 무시하고 진행한 상태, grouping된 선들 gradient 계산하면 할 수야 있기는 한데 잘못하면 이상한 선들끼리 이어질 수 있음. 이런 케이스를 숨기는게 좋아보이긴 함...