개발자 끄적끄적
영상의 점처리 본문
<영상의 점처리 과정>
- 화소(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 |