개발자 끄적끄적
영상의 영역분할 본문
<영상의 영역분할>
- 영역분할은 영상을 부분을 구분하거나 물체를 분리하는 처리이다
<문턱치 처리(Thresholding)>
- 단일 문턱치 처리
- 그레이 영상을 먼저 원 영상에서 그레이레벨 T를 선택하여 이진(흑백과 백색)영상으로 변환하고,
모든 화소에 대하여 T보다 작으면 흑색으로 T보다 크면 백색으로 치환
A pixel becomes
white if its gray level is > T,
black if its gray level is <= T
영상에서 특정 물체를 분리하는 것처럼 기본적인 영역분할 문제에서 문턱치 처리가 중요하며
컴퓨터 비젼에서도 매우 중요한 부분
변수 X로서 저장된 8bit영상을 생각할 때
>>r=imread('rice.tif');
>>imshow(r), figure, imshow(r>110) //모든 데이터를 벡터로 처리하기때문에 r은 전체 영상을 뜻한다 -> 벡터화
결과 영상은 이후에 쌀의 개수나 평균 사이즈를 구하는데 이용할 수 있다
>>b=imread('bacteria.tif');
>>imshow(b), figure, imshow(b>100)
<Matble에서 any data type의 영상을 문턱치 처리>
>>im2bw(r, 0.43); //0.43은 임계값(0~1사이의 값으로 스케일링할 때)
>>im2bw(b,0.39); //0.39는 임계값(0~1사이의 값으로 스케일링할 때)
- 여기서 레벨은 0과 1사이의 값(한계값 포함)이고, 분수로 되는 그레이 값은 흰색으로 치환한다
이 명령은 그레이스케일 영상, 칼러 영상 및 데이터 형식이 unit8, unit16 또는 double형의 indexed 영상에서 수행한다
im2bw 함수는 해당 레빌이 그레이 값이 그 영상의 형태를 가지도록 자동적으로 척도변환하고 다음에 첫 번째 방법으로 문턱치 처리를 수행한다
배경에서 물체를 분리하는 것과 문턱치 처리는 영상에 숨어 있는 모양을 보여주는 매우 간단한 방법이다
예를 들면 영상 paper.tif는 모든 그레이 값들이 매우 높기 때문에 모두 희게 보인다
그러나 높은 레벨에서 문턱치 처리를 하면 훨씬 의미가 있는 영상을 만든다
>>p=imread('paper1.tif');
>>imshow(p), figure, imshow(p>241) //241보다 작은건 모두 0으로 처리 -> 암호화된 영상을 만들 때(key 값이 241)
<더블 문턱치 처리>
- 두개의 값 T(1)과 T(2)를 선택하고 문턱치 처리를 아래와 같이 적용(임계값이 2개)
a pixel becomes
white if its gray level is between T(1) and T(2),
black if its gray level is otherwise
아래와 같이 단순한 변화로 구현
X>T(1) & X<T2
이 기호는 논리적 "and"이므로, 이 결과는 두 개의 부등식이 만족될 때에만 1이된다
- ex)
spine.tif라는 indexed 영상의 8bit 그레이로 만드는 것
>>[x, map]=imread('spine.itf'); //index영상
>>s=unit8(ind2gray(x,map)); //grayscale로 바꾼다
>>imshow(s), figure, imshow(s>115 & s<125)
>>imshow(im2bw(x,map,0.45) & im2bw(x,map,0.5)) //결과는 위와 같다
- 그러나 indexed 영상을 취급할 때 모든 여분의 계산을 포함하므로 계산이 매우 느리다
<문턱치 처리의 응용>
1. 영상에서 반드시 필요한 부분만 남기고 불필요한 부분은 제거할 때 사용 -> 이 정보는 사이즈, 모양 및 blob의 수를 관찰
2. 숨겨진 미세한 부분을 나타낼 때 사용 -> 비밀문서를 볼 때
3. 교재나 그림으로부터 변화하는 배경을 제거하고자 할 때 적용 가능 -> 세월이 갈 수록 망가질 때(변화하는 배경을 제거)
r=rand(256)*128+127; //256x256(난수가 포함된 256영상) -> 127부터 255사이의 값
t=imread('text.tif'); imshow(t);
tr=unit8(r.*double(not(t)));//두개의 행렬에 매칭되는 포인트를 곱해서 새로운값을 만들어낸다, 'r' = 행렬연산(행X열의 곱), 'r.' = 매칭되는 부분의 값만 계산
figure(2), imshow(tr);
figure(3), imshow(tr>100)
<적절한 문턱치(임계값)의 선정>
- 문턱치 처리를 이용하는 중요한 이유는 배경으로부터 물체를 분리하는 것이다
그 후 그 물체의 사이즈를 측정하거나 물체의 개수를 셀 수 있다
이 처리과정의 성패는 적당한 문턱치 레벨의 결정에 좌우된다
값을 너무 낮게 선정하면 물체의 사이즈가 감소되고 그 개수도 줄어든다
반대로 너무 높게 선정하면 너무 많은 배경정보를 포함하게 된다
>>n=imread('nodules1.tif');
>>imshow(n);
>>n1=im2bw(n, 0.35); //임계값이 너무 낮아서 object의 일부가 사라진다(Threshold too low)
>>n2=im2bw(n, 0.75); //임계값이 너무 높아서 object가 많이 생긴다(Threshold too high)
>>figure, imshow(n1), figure, imshow(n2)
일반적인 문제는 물체와 배경의 히스토그램이 서로 중첩된다는 것이다
물체와 배경의 히스토그램이 각각 정규분포를 이룬다고 가정하면, 히스토그램이 '서로 교차하는 위치'에 '문턱치'를 선택한다. 즉, 정확한 임계값이 아니고 최선의 값
P(i) = n(i)/N
- n(i) : 그레이레벨 i를 가지는 화소의 수
- N : 총 화소 수
- p(i) : 그레이 레벨 i인 화소의 확률
레벨 k로 할 때 아래와 같이 정의 가능
왼쪽면적 : a(k) = i=0 부터 k까지 p(i)
오른쪽 면적 : b(k) = i=k+1부터 L-1까지 p(i)
여기서 L은 그레이척도의 수이고, 따라서 L-1은 '그레이 최대값'이다
a(k) + b(k) = i=0부터 L-1까지 p(i) = 1
a(k)와 b(k)사이의 차분을 최대화하는 k를 구하기를 원한다 -> 최선의 임계값
함수 : >>tn = graythresh(n) //tn은 최선의 임계값
<적응(상황에 따라 switch가 되는 것, =adapted) 문턱치 처리>
- 가끔 단일 문턱치로서 물체를 완전히 분리할 수 없는 경우가 있다
이는 물체와 배경이 변하는 경우이다
- 임계값을 여러개를 써야 한다
- 영상을 조각낸 것을 보이고, 각 조각에 대하여 문턱치 처리, 상당히 제한적(즉, 일반적 영상에서는 제한적이다)
---적극적인 방법---
<에지 검출(Edge detection)>
- 에지(Edge)는 영상에서 가장 유용한 정보를 포함한다 -> 고주파 성분이 있는 부분(데이터값이 급격하게 변하는 부분), 고주파 통과필터(계수의 합은 0)
에지는 영상에서 물체의 사이즈를 측정하기도 하고, 배경에서 특정한 물체를 분리하기도 하며, 물체를 인식 또는 분류하는 데 적용된다
에지를 구하는 알고리즘 : edge(image, 'method', parameters...) //method : mask, parametes : 문턱치(임계값을 어떻게 줄 것인가)
<미분(영상 데이터를 잘게 자른다, 데이터의 변화율 -> pixel과 pixel사이의 거리 : 1)과 에지>
- 기본적 정의
- 그레이 값들에서 서서히 변하는 ramp에지와 급하게 변하는 step 에지가 있다
대부분의 에지탐색 동작은 미분에 기초를 두는데, 이산 영상에 대해 연속적 도함수를 적용한다
df(데이터 화소의 변화율)/dx(x축으로의 변화율) = lim h->0 {f(x+h)-f(x)/h} //h : pixel과 pixel사이의 거리(=1), f : 화소값
영상에서, h의 최소 양의 값이 1이므로 2개의 이웃하는 화소의 지수(index)사이에 차분이 f(x+1)-f(x)로 존재하므로 도함수의표현에 이산 형태는
lim h->0 {f(x)-f(x-h)/h}, lim h->0 {f(x+h)-f(x-h)/2h} //에지 구하기
이의 이산 형은
f(x)-f(x-1), {f(x+1)-f(x-1)/2}
이차원 영상에 대하여 편미분을 사용할 수 있으며 이의 표현은 gradient(기울기)이다
<몇 가지의 에지검출 필터>
- 차분을 이용하여 척도(scaling)를 그대로 유지하는 수평과 수직방향의 필터를 내면
[-1 0 1]//수직에지 골라낸다(계수의 합은 0 -> 고주파 통과 필터)
[-1
0
1]//수평에지를 골라낸다(계수의 합은 0 -> 고주파 통과 필터)
Px = -1 0 1
-1 0 1
-1 0 1
이 필터아 상반되는 것은 수평에지를 구하는 것으로 아래와 같다
Py = -1 -1 -1
0 0 0
1 1 1
위 필터를 에지검출을 위한 prewitt 필터라고 한다(Px와 Py는 서로 전치행렬)
Px 및 Py가 영상에 적용되어 그레이 값을 얻었다면 그 기울기의 크기는
root Px^2 + Py^2
그러나 실제로는 아래의 2가지 중 하나를 구하는 것이 적절
max{|Px|, |Py|}
|Px|+|Py|
대각선 대칭(Robert 대각-기울기 필터)
1 0 0 0 1 0
0 -1 0 and -1 0 0
0 0 0 0 0 0
그리고 Sobel 필터는 아래와 같다
-1 0 1 -1 -2 1
-2 0 2 and 0 0 0
-1 0 1 1 2 1
<2차 도함수>
- Laplacian
- 2차 도함수를 이용하여 에지검출을 할 수 있다
양방향의 2차 도합수의 합을 Laplacian이라 한다
필터로 구현(고주파 통과필터의 형태, 좌우상하 대칭, 합이 0)
- ex)
0 1 0
1 -4 1
0 1 0
이것은 이산 라플라시안으로 알려져 있다
라플라시안은 1차 도함수 방법보다 등방향성필터(isotropic filter)의 특성을 가지므로 장점을 가진다
이는 회전 불변을 의미한다
즉, 라플라이사안을 영상에 적용한 후에 회전을 시켜도 영상을 먼저 회전시킨 다음 라플라시안을 적용한 것과 그 결과는 같다
이것은 에지검출의 이상적인 필터를 구성한다
그러나 주된 문제점은 모든 2차 도함수의 필터는 잡음에 매우 민감하다는 것이 단점이다
라플라시안(절대치 또는 제곱을 취한 후)는 2중의 에지를 구한다
>>1=fspecial('laplacian', 0); //라플라시안 필터의 표준편차를 0으로 지정
>>ic_1=filter2(1, ic);
>>figure, imshow(mat2gray(ic_1))
- 에지함수의 2차 도함수
- The edge
- First derviative
- Second derivate
- Absolute values(double edge)
<영 교차(Zero Crossing)>
- 라플라시안을 위한 더욱 적당한 방법은 영 교차의 위치로서 에지의 위치를 구하는 것이다
에지의 위치는 필터의 값이 0이 되는 곳에 주어진다. 일반적으로 이 점은 필터의 결과의 부호가 변하는 곳이다
다음 중 하나를 만족하는 화소가 되는 필터링 영상에서 영 교차를 정의한다
1. 음의 그레이 값을 가지고, 이웃하는 화소의 그레이 값이 직교하는 양의 값이 0이 되는 경우
2. 음과 양의 값을 가지는 화소 사이에 0의 값을 가지는 경우
- 라플라스 필터링 후에 영 교차를 처리
>>1=fspecial('laplace',0);
>>ics=edge(ic,'zerocross',1);
>>imshow(icz)
이 방법으로는 너무 많은 그레이레벨 변화가 생기는게 단점이다
그들을 제거하기 위하여 먼저 가우시안 필터로 영상을 스므딩한다
이는 에지검출에 대하여 Marr-Hildreth 방법이라는 다음의 단계를 따라 처리한다
1. 가우시안필터(저주파 통과필터)로 영상을 스므딩처리를 한다
2. 그 결과를 라플라시안필터로 회선(convolution)한다
3. 영 교차를 구한다
첫 두개의 단계는 LoG(Laplacian of Gaussian)필터를 만들기 위해 하나로 결합될 수 있다
이 필터는 fspecial 함수로 만들 수 있다
zerocross의 에지 옵션이라는 여분의 파라메터가 없는 경우 필터는 아래와 같이 LoG필터가 얻어진다
>>fspecial('log', 13, 2);
이는 아래와 같은 명령을 의미한다
>>edge(ic, 'log');
위 2개의 명령은 아래의 명령과 동일한 결과를 준다
>>log=fspecial('log', 13, 2); //13x13, 표준편차 : 2
>>edge(ic, 'zerocross', log);
<Canny 에지 검출기>
1. 낮은 에러율의 검출. 에지가 아닌 것을 제외한 모든 에지를 구한다
2. 에지의 위치. 영상에서 실제 에지들 사이의 거리와 이 알고리즘으로 구해진 에지들을 최소화 한다
3. 단일 응답. 이 알고리즘은 단지 하나의 에지가 존재할 때 다중 에지화소를 받아들여서는 안된다
Canny는 그의 알고리즘의 시작에 사용할 최상의 필터가 가우시안(스므딩을 위해)이고,
그 뒤에 1차원 가우시안 도함수의 적용을 보였다
이 필터는 에지에 대하여 잡음의 스므딩과 가능한 에지들의 후보를 구하는 효과를 가진다
이 필터를 분리할 수 있기 때문에 먼저 수직형(column)필터로 수직방향으로 적용하고, 다음으로 수평형(row)필터로
수평방향으로 적용할 수 있다
이렇게 하여 에지 영상을 구성하기 위해 2개의 결과를 합성할 수 있다
이는 앞에서 2차원 필터를 적용하는 것보다 계산에서 훨씬 효과적이다
따라서 여기서는 다음과 같은 처리를 한다
1. 영상을 읽는다
2. Gaussian Filter를 적용한다(Noise 제거(background noise제거), Smoothing)
3. Robert, Sobel, Prewitt등을 적용하여 수평, 수직 Edge를 구한다
4. 아래 식을 이용하여 edge의 값을 구한다 -> xe = root(x1)^2+(x2)^2
- non-maximum suppression(비 최대치 억제)처리 -> 임계값 처리, 현존하는 필터 중 가장 훌륭한 필터
- 에지화소들만 유지시키기 위해 에지영상 xe를 문턱치 처리하고 그 외는 제거한다
화소 p는 에지화소로 고려해야 할 방향성(에지의 경사)를 가지며, p는 방향성에서 그 아웃 화소보다 더 큰 크기를 가져야한다
위 크기 xe를 계산하는 것처럼 아래와 같이 역tan함수를 이용하여 에지 경사를 계산할 수 있다
xg=tan^-1(x2/x1) //에지 방향을 구하는 것(The edge direction at a pixel)
즉, 좌우 상하방향과 비교하여 에지가 인접한 데이터보다 크면 에지, 작으면 에지에서 탈락
2번째 접근은 값들 중의 하나를 0도, 45도, 90도 및 135도로 양자화하고, 원래의 경를 이 양자화한 점들에 대한 화소의 경사와 비교한다
'영상처리' 카테고리의 다른 글
영상의 형태적 처리 (0) | 2023.05.11 |
---|---|
영상 복원 (0) | 2023.04.28 |
영상의 기하학처리 (0) | 2023.04.10 |