개발자 끄적끄적

영상의 점처리 본문

영상처리

영상의 점처리

햏치 2023. 3. 24. 02:36

<영상의 점처리 과정>
- 화소(pixel)의 그레이 값의 변환을 의미한다

1. 변환
- Time Domain 또는 주파수 도메인 칼라 도메인 변경 등

2. 주위 화소처리 : 영역처리
- 주어진 화소의 그레이레벨을 변환하기 위해 주어진 화소를 둘러싸고 있는 주위 화소를 이용하여 해당 화소의 그레이레벨 값을 처리하는 방법

3. 점처리
- 한 화소의 그레이레벨 값이 주위의 어떤 것도 이용하지 않고 변환하는 방법

4. 연산처리
- y = f(x) //함수 또는 알고리즘을 적용시킨다
  함수의 값은 0~255의 범위에 있는 정수값으로 주어지는 함수
  y = x +- C(C는 상수)
  y - Cx 또는 y=x/C

- 각 경우 대하여 그 결과가 주어진 범위 0~255에서 정수 값이 되도록 조정할 필요가 있다
  그리고 결과가 아래 식와 같이 범위를 초과하는 경우에는 결과 값을 절단하여 처리
  y <- 255 if  | y > 255, 0 if y<0

- bc = imcomplement(x) 보수 즉, 1을 0으로 0을 1로 바꾼다 -> 반전 특성
  imshow(bc)

- 영상의 특정 부분만 보수
  - Complementing only dark pixels
  - Complementing only light pixels



<히스토그램>
- 어두운 영상에서는 화소들의 그레이 값이 낮은 영역에 모여서 분포한다
- 균일하게 밝은 영상에서는 화소들이 그레이 값이 높은 영역에 모여서 분포한다
- 콘트라스트(대비)가 적당한 영상에서는 화소들의 그레이 값이 주어진 범위 전체에 걸쳐 분포한다
- 히스토그램이 중앙에 모여있으면 영상의 대비(contrast)가 좋지 않다


<감마 특성>
 >>t=imread('tire.tif');
 >>th=imadjust(t, [], [] 0.5); /[], [] input | output의 전구간, 일부를 하려면 0.0~1.0 사이의 실수를 쓴다
 >>imshow(t), figure, imshow(th) //ex) inadjust(t, [0.6,0.8], [0.4,0.7], 0.5);

- 감마 특성을 그래프로 나타내기
 >>plot(t, th, '.'), axis tight


<constract 부분적 선형 스트레칭 함수>
 >>pix=find(im>=a(i) & im < a(i+1));
 >>out(pix)=(im(pix)-a(i))*(b(i+1)-b(i))/(a(i+1)-a(i))+b(i)); 
  //find() 함수 : 괄호안의 조건에 맞는 화소를 찾아내어 화소가 위치한 곳의 좌표값(index)를 return 한다
                    find 함수 사용의 예에서 return 된 pix는 화소의 좌표값에 대한 배열이다
  //Out(pix)는 find() 함수의 사용으로 찾아낸 좌표 위치에 대한 출력


<히스토리 스트레칭 함수 작성 - Matlab 함수 정의>
function out=histpwl(im, a,b) //out : 출력데이터의 이름, histpwl : 사용자 정의 함수, a,b는 행렬

classChanged=0; //flag값, classChange=1 : Double에 대한 값
if~isa(im, 'double'), //imge 데이터가 double이 아니라면
  classChanged=1; //Double에 대한 flag 값
  im=im2double(im); //data형은 double로 바뀌고 값은 0.0~1.0
end

if length(a) ~= length(b) //두 행렬의 길이가 다르면 연산이 안된다
  error('Vectors A and B must be of equal size');
end

--------------
N=length(a);
out=zeros(size(im)); //입력 영상의 크기와 동일한 출력 영상 out을 생성하고 '0'으로 초기화
 for i=1:N-1 //N은 a의 길이
  pix=find(im>=a(i) & im<a(i+1)); //pix는 index행렬
  out(pix)=(im(pix)-a(i))*(b(i+1)-b(i))/(a(i+1)-a(i)) +b(i);
end

pix=find(im == a(N)); //마지막 N번째는 입출력 모두 1 이므로 
 out(pix)=b(N);  //연산이 필요 없이 입력과 동일한 출력 생성
                          
if classChanged == 1 //double  이라면
    out= uint8(255*out); // 출력과 display를 위해 0~255 사이의 정수로 바꿈
end


실행
t=imread('tire.tif');
th=histpwl(t,[0 .25 .5 .75 1], [0 .75 .25 .5 1]);
subplot(2,2,1), imshow(t);
subplot(2,2,3), imshow(th);
subplot(2,2,2),plot(t,th, '.'), axis tight
% histp : piecewise linear transformation




<히스토그램 평활화 -> 영상데이터가 전 영역으로 펼쳐져서(평활화 되어서) 대비(constrast)가 향상>
- 더 좋은 대비 영상을 얻기 위해 그레이 값 i를 다음과 같이 변환한다
  ((n0+n1+n2+...+ni)/n)(L-1)
  - L : 그레이 level 수(ex)256(8bit의 경우), 15(4bit의 경우))
  - n : 전체 화소(pixel) 수
  - i : 그레이 값
  - ni : 발생빈도
  - 시그마 ni : 누적합
  - n=360일 때, 시그마(N-1/360)=시그마(1-24) : 누적합
  - Rounded value : 반올림
  >>p=imread('pout.tif');
  >>ph=histeq(p); //histeq()는 image processing에 포함되어 있는 내장함수
  >>imshow(ph), figure, imhist(ph), axis tight


<Look-Up 테이블(LUT)>
- Look-Up(LUT) 테이블을 이용하여 포인트(점)처리를 보다 효율적으로 수행할 수 있다
  8비트의 영상을 처리하는데, 256 그레이 값의 단일 배열과 같은 테이블로 구성되고 
  각 화소 값이 0~255의 범위에서 표현된다
  이 방법은 각 화소 값의 테이블 내의 대응값 tp로 치환하여 나타낸다
  만일 Matlab에서 T가 look-up 테이블이고, im이 영상이라면 look-up 테이블은 T(im)의 간단한 명령을 적용할 수 있다
  >>T=unit8(floor(0:255)/2); //0~255사이의 정수를 2로 나눈후 floor() 함수를 이용하여 정수처리 한다
  >>b2=T(b) //블록 영상 b에 적용, 영상 b2는 unit8의 형식이다
  *floor : 소숫점 버림, T : 테이블 형성

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

영상의 영역처리  (0) 2023.04.01
영상의 디스플레이  (1) 2023.03.16
영상과 Matlab  (0) 2023.03.10