24.08.27(화)
저번에 대동맥 sinus부근에 붙어있는 coronary(작은 branch)를 제거한 이유
1. 단면적의 area, length 정확도 향상을 위해
2. 중앙선을 계산할 때, auto detection 모듈이 이 coronary로 빠지는 경우에 대비하기 위함.
지난 포스팅) coronary 제거
https://jayindustry.tistory.com/118
[TAVI] Coronary제거_2
24.08.22(목)내일(금)은 예비군..! 오늘도 Coronary를 제거하였는데 이전 과정에 이어서 더 많은 환자에 대해 적용해보았다.추가적인 알고리즘을 적용하여 최대한 예외케이스가 없도록 하였다.
jayindustry.tistory.com
판막시술을 위한 대동맥 단면적을 구하기 위해서는 저 중앙선 centerline을 잘 그려내어야한다.
그려낸 중심선을 따라 내접구를 굴려가며 단면적 정보를 추출할 수 있고,
가장 중요한 것은 대동맥을 1자로 straightening을 할 수 있기 때문이다.
하지만 coronary때문에 auto detection 예외 케이스들이 발생하여 사진처럼 분지로 빠지는 경우가 다수 있다.

뿐만 아니라, 단면적을 구했을 때 coronary가 있는 slice는 area나 length가 더 크게 측정될 수 밖에 없다.
그렇기 때문에 저번까지 coronary를 제거하였으나, 또 몇 가지 예외케이스들이 발생하였다.
그리하여 확실하게 auto detecting을 하기 위해 심장쪽으로 빠지는 저 연장부위를 뾰족하게 더 많이 늘리는 작업을 하였다.
결과)
결과적으로 20개의 대동맥을 test하였을 때 중심선이 모두 자동으로 잘 잡혔다.

어차피 중요하게 측정할 부위는 저 노랑 네모박스 범위의 단면적이기 때문에, 충분히 늘려도 상관은 없다.
방법 요약)
coronary 제거 + label mask를 심장방향으로 뾰족하게 연장.
방법 설명) abel mask를 심장방향으로 뾰족하게 연장.
coronary제거는 저번 포스팅참고..
1. slice파일들을 불러오며 array형태로 바꾼 후, mask가 2부위 이상인 index부터 시작하여 총 5장을 가져온다.

from skimage.measure import label, regionprops
# NumPy 배열로 변환
slices = np.array(slices)
# 각 슬라이스를 검사, 마스크가 두 부분 이상 있는 슬라이스 찾기
def find_slices_with_two_masks(slices):
for i, slice_ in enumerate(slices):
labeled_slice = label(slice_)
regions = regionprops(labeled_slice)
if len(regions) >= 2:
return i
return -1
skimage 라이브러리의 label을 매우 유용하게 사용하고 있다.
array에서 mask 영역들을 매우 잘 찾아준다.
2. 위에서 가져온 5장의 slice에서 y축기준으로 위에있는 mask를 타겟으로 한다.
우리 데이터에서는 해당 범위에서 위쪽의 mask가 sinus부위이다.

3. 타겟 mask의 중심점을 무게중심으로 찍는다.
두 mask의 컴포넌트 속성값들을 구한다. (변수 regions)
그 속성값에서 두 mask 각각의 무게중심 좌표들을 가져오고,
둘 중, y값이 더 작은 것이 가장 위에 위치한 mask의 무게중심좌표가 된다.
컴퓨터비전 및 이미지처리에서는 (0,0)좌표가 이미지의 왼쪽 상단에 위치하기 때문에, 위에있는 mask의 y값이 더 작다.
x는 오른쪽으로 갈수록 증가, y는 아래로 갈수록 증가한다.
labeled_slice = label(mask) # 마스크를 레이블링하여 연결된 컴포넌트로 분할
regions = regionprops(labeled_slice) # 각 연결된 컴포넌트의 속성을 계산
# 슬라이스에서 가장 위에 있는 마스크 선택
top_region = None
min_y_centroid = float('inf')
for region in regions:
centroid = region.centroid # 마스크의 중심점 (y, x 좌표)
# y 좌표가 가장 작은(이미지에서 가장 위에 있는) 마스크 선택
if centroid[0] < min_y_centroid:
min_y_centroid = centroid[0]
top_region = region
4. 타겟 mask의 중심점으로부터 x축으로 mask를 extend한다.
이 때, slice인덱스가 올라갈수록 길게했다가 다시 짧게한다.

그럼 다음과 같이 결과가 나온다.
이렇게 길어졌다가 짧아진다. ( 실제는 5장으로, 가운데가 가장길게끔 코딩하였다)



이 slice들을 png로 저장한 후,
해당 범위만 원본카피본에 덮어씌우고 nii.gz로 저장하여
3d slice에 segmentation으로 불러오면?
