개발자 끄적끄적

영상의 디스플레이 본문

영상처리

영상의 디스플레이

햏치 2023. 3. 16. 16:50

<영상의 디스플레이>
- 가장 기초적인 Matlab 함수 : image
>> c=imread('cameraman.tif');
>> image(c) -> color가 적절치 않다

- imshow() 함수로는 Graylevel을 조절할 수 없다 하지만
  >>colormap(gray(256));
  >>image(c);를 하면 제대로 보인다

- truesize 
  - 디스플레이에 사용할 수직과 수평의 스크린 화소수를 나타낸다
    실제 영상의 size로 display된다

- axif off 
  - 축의 라벨링을 off한다

- colormap(gray(level 수)) 
  - colormap을 그레이 음영으로 조정한다
 
- >>image(c), truesize, axif off, colormap(gray(247)) -> 적절한 그레이 영상 생성
  1) >> image(c), truesize, axis off, colormap(gray(512))
    -> 247레벨은 512로 확장하므로 부족한 부분은 어둡게 처리된다(없는 colormap은 0으로 지정)
        Gray level 0 : Black, Gray level 511 : White

  2) >> image(c), truesize, axis off, colormap(gray(128))
    -> 밝게 처리된다(128보다 높은 그레이 레벨을 갖는 화소가 그 칼라맵에서 단순히 가장 높은 그레이 값(흰색)을 지정하기 때문이다)
        Gray level 0 : Black, Gray level 127 : White

- >> [x, map] = imread('emu.tif');
- >>imgae(x), truesize, axis off, colormap(map)
  -> index color영상을 imread로 읽은 경우
      - 3차원 배열로 읽는다. 현재의 color를 무시하고 그 배열에서 그 값들에 기반하는 디스플레이를 위해
        color를 할당한다


<imshow 함수>
- 그레이 스케일 영상
  1. Unit8로 변환하여 디스플레이한다
    - 0~255 사이의 정수로 data를 한정한다
  2. 매트릭스를 직접 디스플레이한다
    - Double을 사용한다(0~1사이의 실수)
    - imshow가 매트릭스 요소들이 0과 1사이의 그레이 영상으로 double형식의 매트릭스를 디스플레이하기 때문에 가능하다
    - >>c=imread('caribou.tif'); //0~255까지의 정수를 갖는다
    - >>cd = double(c); 0.0~255.0까지의 실수를 갖는다
    - >>imshow(c), figure, imshow(cd) //imshow(c)는 보이지만 imshow(cd)는 보이지 않는다
    즉, >>imshow(cd/255) //0.0~1.0사이의 실수값을 갖도록 scaling해야한다
        >>imshow(cd/512) -> 숫자가 작아지므로 어두어진다
        >>imshow(cd/128) -> 숫자가 커지므로 밝아진다



<비트평면(bit plane)>
- 그레이스케일 영상은 비트평면으로 분리하여 2진 영상의 수열로 변환할 수 있다
  8비트 영상의 각 화소의 그레이 값을 8비트 2진 워드로 생각하면 0번째 비트면은 각 그레이 값의 마지막 비트로 구성된다
  이 비트는 그 값의 크기로서 최소 효과를 가지므로 최소크기비트(least significant bit)라 하고,
  이들 비트로 구성한느 평면을 최소크기비트면 이라고 한다
  이와 유사하게 각 화소에서 8번째 비트면은 첫 번째 비트로 구성된다
  이 비트는 그 값의 크기로서 가장 큰 효과를 갖기 때문에 최대크기비트(most significant bit)라 하고,
  이 면을 최대크기비트면 이라고한다
  만일 그레이 영상을 입력하여 이를 double 형식으로 만들어서 시작한다
  이것은 그 값들을 아래와 같이 연산할 수 있음을 의미한다
  >c=imread('cameraman.tif');
  >>cd=double(c);
  C0 = 1 <-최하위 비트(Least Significant Bit(LSB)), 즉, 영상정보가 1만큼 들어가있다(영상정보가 적다)
  C1 = 2 
  C2 = 4
  C3 = 8
  C4 = 16
  C5 = 32
  C6 = 64 
  C7 = 128 <-최상위 비트(Most Significant Bit(MSB)), 영상정보가 많다

- 여기서 연속적인 2의 급수로 매트릭스를 간단히 나누어서 비트평면을 격리시키고, 나머지는 버리는데
  최종 비트가 0 혹은 1이 되게 한다. 이를 아래와 같이 mod함수로 처리할 수 있다
  mod(x, y) : x를 y로 나눈 나머지, ex) x=100일 때

  >> c0=mod(cd,2) ;  mod(100, 2) = 0
  >> c0=mod(floor(cd,2),2) ;  mod(50, 2) = 0
  >> c0=mod(floor(cd,4),2) ;  mod(25, 2) = 1
  >> c0=mod(floor(cd,8),2) ;  mod(12, 2) = 0
  >> c0=mod(floor(cd,16),2) ;  mod(6, 2) = 0
  >> c0=mod(floor(cd,32),2) ;  mod(3, 2) = 1
  >> c0=mod(floor(cd,64),2) ;  mod(1, 2) = 1
  >> c0=mod(floor(cd,128),2) ;  mod(0, 2) = 0
 *>>floor(12.5)=12; 바닥함수
  >>ceil(12.2)=13; 천장함수
 


<공간 분해능> - data압축 중 하나
- 공간 분해능은 전체 영상에 걸친 화소들의 밀도이며, 공간 분해능을 높을수록 더 많은 화소들의 영상의 디스플레이에 사용된다
  Matlab에서 imresize(image re size)함수로서 공간 분해능을 시험할 수 있다
  256X256 8비트 그레이영상을 매트릭스 x로 저장한다고 생각하면 
  아래의 명령은 영상의 사이즈를 반으로 나타내는 것이다
  imresize(x, 1/2);
  이것은 각각의 행과 열 방향으로 1화소씩 생략하고 나타나는 형태이다
  즉, 4개의 픽셀 데이터가 1개로 된다(1/4로 줄어든다)
  
  만일 이로부터 다시 imresize의 파라메터를 1/2대신에 2로서 처리하면 원 영상과 같은 사이즈를 만들면서
  모든 화소들이 반복된다. 즉 화소수는 같지만 분해능을 저하된다
  x2 = imresize(imresize(x, 1/2), 2);
  
  imresize의 파라메터를 아래와 같이 변화시켜서 영상의 실제적 분해능을 더 적은 양으로 변화시킬 수 있다
  Command : 영상의 size는 모두 같다
  imresize(imresize(x, 1/4), 4);   Effective resolution 64x64
  imresize(imresize(x, 1/8), 8);   Effective resolution 32x32
  imresize(imresize(x, 16), 16);   Effective resolution 16x16
  imresize(imresize(x, 1/32), 32);   Effective resolution 8x8
  분해능이 감소함에 따라 블록화 혹은 화소화(Pixelization)효과가 크게 나타난다



<양자화 및 디더랑(Dithering)> - Bit수를 줄이고 가공의 Data로 치환한다
- 그레이스케일 수에 해당하는 양자화는 영상을 표현하는데 사용된다
  '균일 양자화'는 이는 오로조 n개의 그레이스케일로 영상을 표현하며 이 때 그레이스케일의 범위를 n개 구간의 범위로 나누고
  0에서 n-1까지의 값을 해당하는 범위에 사상시킨다
  즉, 
  Original values    Output value
  0-63                 0
  64-127              1
  128-191            2
  192-255            3
  0, 1, 2, 3의 값들을 디스플레이하기 위해 스케일링이 필요하다
  Matlab에서 사상처리를 하기 위해 x를 unit8 형식의 매트릭스로 가정하여 아래와 같이 연산을 수행할 수 있다
  x는 0.0~255.0 사이의 실수
  f=floor(double(x) /64) //64보다 작은 수는 모두 같은 값으로 사상된다(0~3)
  q=unit8(f*64); //64를 곱해서 Scaling한다



<디더링(Dithering)>
- 일반적으로 디더랑은 영상에서 칼라의 수를 축소시키는 과정이다
  영상을 제한한 칼라의 수를 가진 장비에 디스플레이를 하거나 프린트를 해야한다면 이를 위해 디더링 처리가 필요하다
  특히 신문은 흑과 백의 2가지의 그레이만을 사용한다 
  단지 2가지의 톤으로 영상을 표현하는 것은 Halftoning으로 알려져있다
  이와 같은 잘못된 윤곽(선)을 취급하는 한 가지 방법은 양자화하기 전에 불규칙 변수를 영상에 가하는 것이다
  2가지의 그레이스케일로 양자화하기 위해 불규칙 매트릭스 r을 영상과 비교한다
  그레이 스케일이 그 결과에 표현되도록 적당한 매트릭스를 적용하는 변칙적인 처리를 한다
ex)>>D[0 128; 192 64] - Dithering matrix
   >> r=repmat(D, 128, 128); - Repeat Matrix[가로 세로 128회씩, 356x256 Matrix 생성]
  >> x2=x>r; imshow(x2) - Input 영상 x가 디더링 행렬 r보다 크면 출력영상 x2에 1을, 작으면 x2에 0을 대입하여 이진 영상 생성
  >> D2=(0 128 32 160; 192 64 224  96; 48 176 16 144; 240 112 208 80);
  >> r2=repmat(D2, 64, 64); - 행렬의 크기가 커지면 pattern의 수가 늘어나므로 출력영상이 정교해진다
  >> x4=x>r2; imshow(x4)


<Error Diffusion>
- 0~255사이의 값이 0,1로 Mapping되므로 이로 인하여 발생되는 Error는 
  E = p(i,j) ifp(i,j)<128
  E = p(i,j) - 255 if p(i,j) >=128
- 위에서 발생된 error를 인접한 화소로 확산시킨다
  
  

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

영상의 점처리  (0) 2023.03.24
영상과 Matlab  (0) 2023.03.10
영상처리 개요  (0) 2023.03.09