개발자 끄적끄적

영상의 영역처리 본문

영상처리

영상의 영역처리

햏치 2023. 4. 1. 03:40

<영상의 영역처리>
- 마스크를 이동하여 처리하는 것으로서, 구형 마스크(홀수 길이) 또는 주어진 영상에 걸쳐 다른 형태의 마스크를 사용한다
  마스크 함수와 결합은 필터의 기능을 가진다
  새로운 그레이 값으로 계산되는 함수는 마스크 내의 모든 그레이 값의 선형함수이기 때문에 선형필터라고 한다
  선형필터는 이웃하는 화소들을 대상으로 마스크 내에서 대응하는 모든 값들을 각각 곱한 후에 이들을 모두 더하기하는 기능이다



<공간 필터의 처리 단계>
1. 현 화소에 걸쳐진 마스크의 위치
2. 이웃 화소들에 대응하는 값(화소의 값)과 필터의 해당 값(가중치)을 각각 서로 곱한다
3. 곱의 항들을 모두 더한다
이 과정을 영상의 모든 화소에 대하여 반복처리한다



<평균값 필터>
- 3x3 마스크는 널리 사용되는 하나의 필터이고, 이는 마스크 내의 총 9개의 값들을 평균처리 하는 것이다
  이 값은 새로운 영상에서 대응하는 화소의 그레이 값이 된다
- 평균값 필터, blurring 효과




<영상의 에지처리>
- 에지의 무시
  - 필터 마스크를 여상에 완전히 포개지도록 하여 마스크 내의 평균을 취한 값을 출력으로 처리한다
    원 영상의 에지를 제외하고 적용하므로 출력 영상은 원 영상보다 사이즈가 적어지는 결과가 된다
    마스크의 사이즈가 클수록 더 많은 양의 정보를 잃게된다
  - 즉, 3x3 마스크를 쓸 경우 좌우 상하 한 라인씩 줄어든다

- 영(0)으로 채우는 방법(0 padding)
  - 영상의 외부 영역에서 필요한 부분에 모두 0으로 채워서 적용한다고 가정한다
    이 가정은 처리할 모든 값을 얻을 수 있기 때문에 원 영상의 사이즈와 같은 출력 영상을 얻을 수 있다
    그러나 이 방법은 영상의 주위(에지) 부분에서 원하지 않는 결과가 나타나는 효과가 발생한다



<Matlab에 의한 필터링>
- filter2 함수를 선형필터로 처리하면 그 결과는 double 형 데이터의 행렬로 구해진다
  파라미터 형태는 선택적이고, 이는 에지를 처리하는 방법을 나타낸다

- filter2(filter, image, shape) : 기본값(default)
  filter2(filter, image, 'same')에서 'same'은 input영상과 output 영상의 사이즈가 같다는 의미

- filter2(filter, image, 'valid')는 내부의 화소에만 적용되어 항상 원 영상보다 작은 사이즈의 출력을 얻는다
  
- 'same'으로 처리한 결과는 원 영상의 오부에 미리 0으로 채운 후에 'valid'로 처리한 결과와 같게 된다

- filter2(filter, image, 'full')은 원 영상보다 더 큰 사이즈의 출력을 얻게 되는데, 이는 원 영상의 주위를 0으로 채운 후 
  마스크와 영상의 행렬이 겹치는 부분에 필터를 적용하는 방법이다



<fspecial>
- 여러 가지 필터를 쉽게 만들 수 있도록 많은 option을 가질 수 있다
  주어진 사이즈를 평균하는 필터를 가지는 average 선택을 할 수 있다
  >>fspecial('average', [5,7]) //5x7 사이즈의 평균필터를 수행한다(계수=1/35)
  >>fspecial('average', 11) //11x11 사이즈의 평균필터를 수행하며 필터 사이즈가 커질수록 burring이 더 많이 일어난다

- 처리되는 데이터의 형태는 double형이고, 이를 디스플레이하기 위해 다음과 같이 처리한다
  >>c=imread('cameraman.tif');
  >>f1=fspecial('average') //defualt = 3x3
  >>cf1=filter2(f1,c);



<분리형 필터> - 계산량이 줄어든다
- 3x3에서 분리하지 않을 경우
  n=3일 때, 곱셈 9회 : n^2
               덧셈 8회 : (n^2)-1
  Total : 2*(n^2)-1 의 복잡도

- 분리한 경우
  곱셈 : 3회*2 = 6 = 2n
  Total : 4n-2의 복잡도


<주파수 영역필터 : 저역통과 및 고역통과 필터>
- 고주파 필터
  - 고주파 성분을 통과시키고, 저주파 성분을 줄이거나 제거하는 기능을 가진다

- 저주파 필터
  - 저주파 성분을 통과시키고, 고주파 성분을 줄이거나 제거하는 기능을 가진다

- 주파수 : 간격에 대한 그레이 level의 변화
- 고주파 : 작은 간격에서 그레이 값의 변화가 크게 나타나는 곳(edge, nolse 등)
- 저주파 : 그레이 값의 변화가 작다(배경 등)



<고역통과 필터>
- 고역통과필터는 마스크 내부에 있는 계수들의 총합(행렬 내부의 모든 값의 합)이 0
  - 계수의 합이 '0' 이다
  - 배경 등 데이터 변화가 작은 저주파 부분은 '0'에 가까운 값이 된다
  - edge 등 값의 변화가 큰 곳은 필터링 결과가 '0'이 되지 않고 center의 큰 계수에 의해서 오히려 강조된다

>>help fspecial
  - average : averaging filter
  - disk : circular averaging filter
  - gaussian : Gaussian lowpass filter //저주파 필터
  - laplacian : filter approximating the 2-D Laplacian operator //라플라시안 방정식을 만족하는 필터
  - log : Laplacian of Gaussian filter //laplacian보다는 edge가 좀 더 강조된다
  *노이즈(noise)는 고주파
  - motion : motion filter
  - prewitt : Prewitt horizontal edge-emphasizing filter
  - sobel : Sobel horizontal edge-emphasizing filter



<가우시안 필터 : 저주파 필터, blurring이 일어난다>
- 1차형 가우시안 필터
  - Small value of Sigma : Less blurring
  - Large value of Sigma : More blurring

- 2차형 가우시안 필터
  - 가우시안 특성은 회전 대칭성을 가진다
  - 가우시안 필터는 분리하여 처리 가능한데, 먼저 가로(x)방향으로 처리한 후에 다음으로 세로(y)방향으로 처리할 수 있어 빠른 처리를 할 수 있다
  - 2개의 가우시안 함수의 회선(convolution)처리는 그 결과도 역시 가우시안 특성을 나타낸다

- 3차형 가우시안 필터
  - 필터 계수의 합은 1이다
  - average filter의 기능을 한다
  - 모든 계수값이 같은 average filter보다 blurring이 덜 하다


<에지 샤프닝>
- Unsharp masking
  - Unsharp : 날카롭지 않은 영상을(unsharp 영상) 필터를 가지고 original을 masking 
                즉, 저주파 성분을 빼주면 상대적으로 고주파 성분이 강조되어 blurring된 부분을 빼줌으로써 edge가 강조

ex)
x=imread('buffalo.tif');
f=fspecial('average'); //평균 필터를 정의
xf=filter2(f,x); //고주파 성분이 사라지고 blurring이 일어난다
xu=double(x)-xf/1.5; //원본영상에서 필터링된 데이터를 1.5배 나눠서 빼준다
subplot(1,2,1), imshow(x)
subplot(1,2,2), imshow(xu/70) //double데이터를 display해줘야하기 때문에 70을 나눔으로써 data의 scale을 줄여줌
- 결과적으로 원본 영상을 scaling한 후 average filtering 한 값을 빼주는 것


ex)
p=imread('pelicans.tif');
u=fspecial('unsharp', 0.5) //0.5는 scaling 한 값
pu=filter2(u,p);
imshow(pu/255)



<하이부스트(High-Boost) 필터링 : 원본영상에 고주파 영상을 더해주는 개념(결과는 unsharp masking이랑 거의 같다)
- high boost = A(original)-(low pass),
  high boost = A(original)-(low pass)
                 = A(original)-((original)-(high pass))
                 = (A-1)(original) + (high pass)



<비선형 필터>
- 비선형 필터는 마스크 내의 그레이 값을 비선형 함수에 의해서 구해진다
  몇 가지 예를 들면 마스크 내의 가장 큰 값을 출력하는 maximum(최대값)필터, 가장 작은 값을 출력하는 minimum(최소값)필터가 있다
  최대 및 최소값 필터는 rank-order 필터의 예이다. 이러한 필터는 마스크 내의 값을 가장 작은 값에서 차례로 큰 값으로 순서적으로 정렬하여
  특정한 값을 출력한다. 최소값 필터는 첫째 값을 출력하고, 최대값 필터는 마지막 값을 출력한다
*비선형 필터 : 1:1 대응이 되지 않는 것
*선형 필터 : 마스크와 pixel data를 1:1대응 

ex)
c=imread('cameraman.tif');
cmin=nlfilter(c, [3,3], 'min(x(:))'); //%non-linear(=1:1대응이 되지 않는다), 3x3 데이터 블럭내에 모든 픽셀값 중에 가장 작은 값 -> 영상이 어두어진다
cmax=nlfilter(c,[3,3], 'max(x(:))'); //3x3 데이터 블럭내에 모든 픽셀값 중에 가장 큰 값 -> 영상이 밝아진다
imshow(cmin)
figure, imshow(cmax)

ex)
tsp=imnoise(c, 'salt & pepper'); //black and white('salt & pepper') noise를 발생, c는 원본영상, tsp는 noise영상
cmin=nlfilter(tsp,[3,3],'min(x(:))'); //하얀 점이 없어지고 검은점이 강조
cmax=nlfilter(tsp,[3,3],'max(x(:))'); //검은점이 없어지고 하얀점이 강조
cmin1=nlfilter(cmin,[3,3],'max(x(:))'); //minimum된 필터를 maximum 필터
cmin2=nlfilter(cmin1, [3,3],'max(x(:))'); //cmin1에 발생한 검은 점이 없어진다
imshow(cmin2);



<Median filter>
mid=nlfilter(tsp[3,3], 'median(median(x(:)))'); //median은 중앙값
imshow(mid) //noise가 거의 제거



<Region of Interesting Processing(ROI 처리)>
- 비선형 필터는 전체 영상에 적용하기에 계산시간이 너무 많이 소요되거나 작은 영역에만 관심이 있는 경우이다
  영상 내에서 이러한 작응 영역을 Region of interest(ROIs)라 하고 이 처리를 ROI 처리라고 한다
- ex) 이구아나영상에서 머리 부분만 분리


<Matlab에 의한 ROI 처리>
- ROI의 정의는 2가지가 있는데 마우스를 이용하여 다각형 영역 또는 상호적으로 작용하는 list 이다
- ROI는 2개의 좌표 군(set)으로 정의되고, 첫째는 열(column)이고 다음은 행(row)인데,
  순서대로 처리하여 점에서 점으로 직선으로 연결하여 처리한다
- 일반적으로 ROI 마스크는 원 영상과 같은 사이즈이고, 1이면 ROI이고, 0이면 주위영역이다
  roipoly 함수를 상호적으로 사용할 수 있는데 roi=roipoly(ig); 로 처리 할 수 있다(ig=imread('iguana.tif');)
 


<ROI 필터링>
- ROI의 동작 중 가장 간단한 처리는 공간필터링이다. 이는 roifilt2 함수의 구현이다
a=fspecial('average', [15, 15]); //평균값 필터 15x15
iga=roifilt2(a, ig, roi); //a는 평균값 필터, ig는 input 영상, roi는 사용자가 만든 mask
imshow(iga) //선택한 부분만 평균값 필터
u=fspecial('unsharp'); //unsharp masking
igu=roifilt2(u, ig, roi); //log filter
figure, imshow(igu)
l=fspecial('log');
igl=roifilt2(l, ig, roi);
figure, imshow(igl)

'영상처리' 카테고리의 다른 글

영상의 기하학처리  (0) 2023.04.10
영상의 점처리  (0) 2023.03.24
영상의 디스플레이  (1) 2023.03.16