본문 바로가기
디지털영상처리기초/Matlab

[디지털 영상처리 기초] 6. 화소 단위 영상처리 2

by CodingKwon 2021. 6. 24.

[디지털 영상처리 기초] 6. 화소 단위 영상처리 2

 

 

1) 히스토그램 평활화 과정을 손으로 풀어라.

– 위 내용을 프로그래밍하여 결과를 비교하라.

ⅰ) 히스토그램 평활화 과정을 손으로 풀어라.

손으로 히스토그램 평활화

 

손으로 히스토그램 평활화 한 결과

 

ⅱ) 위 내용을 프로그래밍하여 결과를 비교하라.

 

% 연습문제 7 데이터
a = [12 6 5 13 14 14 16 15;
    11 10 8 5 8 11 14 14;
    9 8 3 4 7 12 18 19;
    10 7 4 2 10 12 13 17;
    16 9 13 13 16 19 19 17;
    12 10 14 15 18 18 16 14;
    11 8 10 12 14 13 14 15;
    8 6 3 7 9 11 12 12;]

% 손으로 평활화시킨 데이터
b = [11 3 2 12 15 15 17 15;
    9 7 5 2 5 9 15 15;
    6 5 1 1 4 11 18 19;
    7 4 1 0 7 11 12 17;
    17 6 12 12 17 19 19 17;
    11 7 15 15 18 18 17 15;
    9 5 7 11 15 12 15 15;
    5 3 1 4 6 9 11 11;]
    
a1 = uint8(a);
b1 = uint8(b);

ah = histeq(a1); % 평활화 함수 적용

subplot(1,3,1), imhist(a1), axis([0 19 0 15]), title("평활화 전 영상")
subplot(1,3,2), imhist(b1), axis([0 19 0 15]), title("손으로 평활화 한 영상")
subplot(1,3,3), imhist(ah), axis tight, title("평활화 함수를 사용한 영상")

 

평활화 비교

 

평활화 전 영상은 중앙(10~14)에 데이터가 몰려 있지만 손으로 평활화한 결과 히스토그램이 전체적으로 높이(빈도수)가 비슷한 모양으로 바뀌었습니다. 마지막으로 평활화 함수를 사용해서 한번 더 비교를 해보았습니다. 평활화 함수를 사용한 결과도 손으로 평활화한 결과와 비슷한 전체적으로 히스토그램의 높이(빈도수)가 비슷해진 결과를 보여주었습니다. 다만 histeq함수는 범위를 0~19가 아닌 0~255로 표현되었습니다.

 

 

 

2) 변환한 카메라맨 인덱스 영상을 입력으로 사용하여 히스토그램 평활화 알고리즘을 실행하는 프로그램을 작성하라.

히스토그램 스트레칭 결과와 비교 평가하라.

 

2번에서 사용할 스트레칭 함수입니다.

% 히스토그램 스트레칭(대비 확장) - Contrast 스트레칭 함수 
function stretching1 = hist1(c, x)

max_c = max(c(:)); max_x = max(x(:)); % 원본의 최대 값, 참조 영상의 최대 값을 찾아줍니다.
min_c = min(c(:)); min_x = min(x(:)); % 원본의 최소 값, 참조 영상의 최소 값을 찾아줍니다.

% 스트레칭 = (d - c) / (b - a) * (i - a) + c
stretching1 = (max_c - min_c) / (max_x - min_x) * (x-min_x) + min_c

 

인덱스 영상의 인덱스 x, 스트레칭 함수를 적용한 y, 평활화 함수를 적용한 xh를 비교해보겠습니다.

c = imread('cameraman.tif'); % cameraman 영상을 불러옴
[x, map] = gray2ind(c); % cameraman 영상을 인덱스 영상으로 변경

y = hist1(c,x); % 직접 만든 스트레칭 함수를 이용해서 스트레칭 한 값을 y에 담음
xh = histeq(x); % 평활화 함수를 이용하여 평활화 한 다음 xh에 담음

subplot(3,2,1), imshow(x)
subplot(3,2,2), imhist(x), axis tight, title("인덱스영상의 인덱스")

subplot(3,2,3), imshow(y)
subplot(3,2,4), imhist(y), axis tight, title("스트레칭한 인덱스")

subplot(3,2,5), imshow(xh)
subplot(3,2,6), imhist(xh), axis tight, title("평활화한 인덱스")

 

히스토그램 스트레칭, 히스토그램 평활화 비교

 

인덱스 함수의 인덱스 영상은 한쪽으로 편향되어 있는 히스토그램을 보여주고 있습니다. 스트레칭 함수를 적용한 결과 그레이 스케일이 전체적으로 퍼져서 대비가 좋아진 모습을 볼 수 있습니다. 평활화 함수를 사용한 인덱스 영상은 한쪽으로 몰려있던 히스토그램의 빈도수를 전체적으로 퍼트려서 대비를 좋게 하였습니다. 스트레칭 함수에 비해 전체적으로 히스토그램의 높이(빈도수)가 비슷해진 것으로 스트레칭 함수와 차이를 확인할 수 있습니다.

 

 

 

3)

 원데이터를 플롯 하라.

문제의 히스토그램 스트레칭 함수를 LUT로 만들고 스트레칭 함수를 플롯 하라.

 

LUT로 히스토그램을 확장하고 결과 데이터를 플롯 하라.

 

% 원데이터

x = [0:15];
y = [15 0 0 0 0 70 110 45 70 35 0 0 0 0 0 15];

 

% 문제의 히스토그램 스트레칭 함수를 LUT로 만듦
t1 = 0.4*[0:5];
t2 = 3*[6:9]-13;
t3 = 1/6*[10:15]+25/2;

T = uint8(floor([t1 t2 t3]));

 

% 스트레칭 함수 플롯

plot(T)

 

% LUT 확인

T

 

% y를 LUT로 히스토그램 확장
y1 = [15 0 70 0 0 110 0 0 45 0 0 70 0 0 35 15];
subplot(1,2,1), bar(x,y), xlim([0, 15]), set(gca, 'xtick', 0:15);
subplot(1,2,2), bar(x, y1),xlim([0, 15]), set(gca, 'xtick', 0:15);

 

LUT로 히스토그램 확장

 

히스토그램을 확장하여 전체적으로 높이가 평활화된 것을 확인할 수 있습니다.

댓글