์ฐ๋ฆฌ๊ฐ ํํ ์จํฐ(CT) ์ดฌ์์ด๋ผ๊ณ ๋งํ๋
์ปดํจํฐ๋จ์ธต์ดฌ์(Computed Tomography scan)์ ๋ํด ์์๋ณด์.
CT๋?
CT scanner์ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ฏ์ด,
์ฌ๋ฌ ๋ฐฉํฅ์์ ์์ค์ ํฌ๊ณผ๊ธฐ๋ฒ์ผ๋ก
์ธ์ฒด ๋จ๋ฉด์ ์ดฌ์ํ์ฌ ๋ณต์ํ๋ ์๋ฃ์์์ดฌ์๋ฒ์ด๋ค.
์์ ์ฌ์ง์ฒ๋ผ ์ธ์ฒด์ ํก๋จ๋ฉด ํ๋์ ๋ํด,
์ ๋ฐฉํฅ์์ X์ ์ ์ก, ์์ ํ์ฌ ์ฌ๋ฌ์ฅ์ ์์์ ์ดฌ์ํด
ํก๋จ๋ฉด ํ๋์ ์์์ผ๋ก ํฉํ๋ค.
์ผ์ชฝ ์ฌ์ง์ ํฐ์ ๊ทธ๋ํ๋ฅผ ๋ณด๋ฉด,
ํฌ๊ณผํ X์ ๋ค์ด ํ ํํํ ์ผ์์ ๊ฐ์ง๋๋ ๊ฒ์ ์ ์ ์๋ค.
์ด๋ ์ผ์์ ๋งบํ X์ ํก๊ด๋๋ฅผ ์ฌ๋ฌ ๋ฐฉํฅ์ ๋ํด ํฉํ ๋ค
๊ทธ๋ํ๋ก ์๊ฐํํ ๊ฒ์ด ์ค๋ฅธ์ชฝ ์ฌ์ง์ ์ฌ์ด๋ ธ๊ทธ๋จ(sinogram)์ด๋ค.
์ฌ๊ธฐ์ ์ง๊ณ ๋์ด๊ฐ ๊ฐ๋ ์ด '๋ผ๋ ๋ณํ(Radon transform)'์ด๋ค.
์ ๊ธฐํ์ ์ธ ์๋ฏธ๋,
ํจ์ f๋ฅผ ์์ ์์ s(๊ฑฐ๋ฆฌ)๋งํผ ๋จ์ด์ ธ ์๊ณ α(๊ฐ)์ ์์ง์ธ ๋ชจ๋ ์ ์์ ์ ๋ถํ ๊ฒ์ด๋ค.
์ฆ ํน์ ๊ฐ๋์ ๊ฑฐ๋ฆฌ์ ๋ํ ํฌ๊ณผ๋ ๊ฐ์ ๊ฐ๋ projection ๋ฐ์ดํฐ๊ฐ ๋๋ค.
sinogram์ ์ด๋ฌํ ๋ผ๋ ๋ณํ(Radon transform)์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๊ตฌํํ ๊ฒฐ๊ณผ์ด๋ฉฐ,
์ฐ๋ฆฌ๋ sinogram์ ์ญ ๋ผ๋ ๋ณํ์ ํตํด ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ์ฌ๊ตฌ์ฑํ ์ ์๋ค.
matlab ๋ด์ฅ ํจ์๋ก ํฌํ ์ด๋ฏธ์ง์ sinogram์ ๋ฝ๊ณ ๋ค์ ์ญ๋ณํ ํด๋ณด์.
obj = phantom(256);
imagesc(obj); colormap gray; axis image; axis off;
์์ ๊ฐ์ด 256*256 size์ phantom ์ด๋ฏธ์ง๋ฅผ ํ์ธํ ์ ์๋ค.
phantom(n)์ n*n phantom ๋ฐฐ์ด์ ๋ฐํํ๋ ํจ์์ด๋ฉฐ,
imagesc๋ ๋ฐฐ์ด์ ์ด๋ฏธ์ง๋ก ์๊ฐํํด์ฃผ๋ ํจ์๋ค.
thetas = linspace(0,180,256);
[sinogram, x] = radon(obj, thetas);
imagesc(sinogram);
๊ฐ์ 0๋ถํฐ 180๋๊น์ง ์ผ์ ํ๊ฒ 256๊ฐ๋ก ๋๋
built-in radon function์ผ๋ก ํด๋น ๊ฐ๋ค์ ๋ํด projectionํด์ฃผ๋ฉด sinogram์ ์ป์ ์ ์๋ค.
์ด๋ [sinogram, x] = radon(obj, thetas); ์์
sinogram์ ๋ผ๋๋ณํ์ ๊ฒฐ๊ณผ๋ก ์ป์ด์ง๋ projection ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ 2์ฐจ์ ๋ฐฐ์ด์ด๋ค.
x๋ ๋ผ๋ ๋ณํ ๊ฒฐ๊ณผ์ ๊ฑฐ๋ฆฌ ๊ฐ ๋ฐ์ดํฐ์ธ๋ฐ, ์ฌ๊ธฐ์ ํ์์๋ค.
์ด๋ฅผ ํตํด ์ป์ sinogram์ ๋ค์๊ณผ ๊ฐ๋ค.
CT์ ์๋ฆฌ๋๋ก๋ผ๋ฉด
์ฐ๋ฆฌ๊ฐ ๋ด์ฅ phantom ํจ์๋ฅผ ์ด์ฉํด ์ป์ phantom์ด๋ฏธ์ง๊ฐ ์ง์ง ์ธ์ฒด๊ฐ ๋ ๊ฒ์ด๊ณ ,
X์ ์ ํฌ๊ณผํด ์ป์ ๊ฐ๊ณต ์ ์ ๋ฐ์ดํฐ๊ฐ sinogram์ด๋ค.
์ด sinogram์ ์ญ๋ณํ ํ๊ธฐ ์ ๊น์ง ์ฐ๋ฆฌ๋ ์ธ์ฒด ๋ด๋ถ ์ด๋ฏธ์ง๋ฅผ ์ ์ ์๋ค.
์ด์ ์ญ๋ณํ์ ํตํด ์ฐ๋ฆฌ๊ฐ CT ์ดฌ์์ผ๋ก ๋ณด๊ฒ ๋ ์ด๋ฏธ์ง๋ฅผ ์ป์ด๋ณด์.
matlab์ ๋ด์ฅ๋ ๋ผ๋ ์ญ๋ณํ ํจ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
I = iradon(R,theta)
I = iradon(R,theta,interp,filter,frequencyScaling,outputSize)
filter๋ฅผ ์ฌ์ฉํด ์๋ฐํ ๋ณํํ๋ฉด ๋ ์ข๊ฒ ์ง๋ง,
์ผ๋จ ๊ฐ๋จํ ์ฒซ๋ฒ์งธ ๋ฐฉ์์ผ๋ก ์ญ๋ณํํด๋ณด์.
I = iradon(sinogram,thetas);
imagesc(I); colormap gray;
์ค!
sinogram์ ์ญ๋ณํ์ผ๋ก ์๋ณธ ๋ฐ์ดํฐ์ ๊ฑฐ์ ์ผ์นํ๋ ์ด๋ฏธ์ง๋ฅผ ์ป์๋ค.
์ด๋ฒ์๋ ์ง์ ๋ผ๋ ์ญ๋ณํ ์ฝ๋๋ฅผ ์ง๋ณด์.
์ฌ๊ธฐ์ Back-projection ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ๊ฒ์ด๋ค.
์ด ๋ฐฉ๋ฒ์ ์ฝ๊ฒ ๋งํด sinogram์ ๊ฐ ์ด ๋ฐ์ดํฐ(ํ ๋ฐฉํฅ์ ๋ํ projection ๋ฐ์ดํฐ)๋ฅผ ์ถ์ถํด
ํด๋น ๊ฐ๋งํผ ํ์ ์ํจ ๋ค ๋ค์ ํฉํ๋ ๊ฒ์ด๋ค.
[row, col] = size(sinogram);
backproj = zeros(size(sinogram));
for i=1:1:length(thetas)
backproj = backproj + imrotate(repmat(sinogram(:, i), [1,col]), -thetas(i), 'bilinear', 'crop');
end
backproj=backproj';
figure;
imagesc(backproj); colormap gray; axis image
๋ฐ๋ณต๋ฌธ ์์ ๋ณด์.
sinogram(:, i)๋ฅผ col๋ฒ ๋ฐ๋ณตํ์ฌ 2์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ค๊ณ , ๊ฐ์ ๋ํด ํ์ ์์ผ ํฉํ๊ณ ์๋ค.
์ด๋ ๊ฒ ํ๋ฉด sinogram์ ์ด ๋ฐ์ดํฐ๊ฐ ํ ๋ฐฉํฅ์ผ๋ก ๋ณต์ฌ๋๊ณ , ๊ทธ ์ด๋ฏธ์ง๋ฅผ ํด๋น ๊ฐ์ ๋ง๊ฒ ํ์ ์์ผ ํฉํ๊ฒ ๋๋ค.
(๊ทธ๋ฅ backproj๋ฅผ ์ถ๋ ฅํ๋ฉด 90๋ ๋์๊ฐ ์๊ธธ๋ ์ ์น์์ผ์ฃผ์๋ค.)
back-projection ๋ฐฉ์์ผ๋ก ์ญ๋ณํํ ์ด๋ฏธ์ง๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ค!
ํฌ๋ฟ์ฐ ๋๋์ด ์์ด๊ณ ์๊ณก, blur ํจ๊ณผ๊ฐ ๊ฐ๋ฏธ๋ ๋ฏํ๊ธด ํ์ง๋ง..
์๋ณธ ์ด๋ฏธ์ง๋ฅผ ์์๋ณผ ์ ์๋ค.
์์ผ๋ก ๋ฐ์ด์ค ์ชฝ์ ๋ ๊ณต๋ถํ๊ฑฐ๋ ์ฐ๊ตฌํ ์ผ์ด ์์์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง..
์ ์ ๊ณต๋ถํ๋ ๋ด์ฉ๋ค์ด ํ๋ฒ ๋ค์ด์๋ ์์ด๋ฒ๋ฆด ๊ฒ ๊ฐ์ ๊ฒ๋ค์ด๋ผ,
์ข ์ข ์๊ฐ๋ ๋ ์ ๋ฆฌํ๋ฌ ์์ผ๊ฒ ๋ค!
2023.07.25 - [Study/Bio Technology] - [Bio] ๋ฐ์ด์ค์ ๊ธฐ์ ์ #2 Matlab์ผ๋ก DFT ๊ตฌํํ๊ธฐ