디지털 영상처리 교재(연습 문제 2, 3번)
1) blocks 영상 b에 대해서 다음의 명령들을 수행하라.
우선 ‘blocks.tif’를 가져와 다음 문제에 있는 명령을 수행해보자.
[그림 1] blocks.tif | [그림 2] imshow(bb2) 출력 결과 |
결과:
영상의 크기는 같다. 하지만 눈으로 보이는 품질은 많은 차이가 존재한다.
imdivide 함수를 통해 64로 나누었을 때 데이터값이 손실되었고, 그 이후 immultiply 함수를 통해 64를 곱하여도 손실된 값은 돌아오지 않기 때문이다.
정확히는 255/64로 4개의 화소 데이터 중 한 화소 만을 가지고 저장이 되고, 다시 곱하였을 때 그 값을 곱하는 것이기 때문이다.
2) 문제 2에서의 값 64를 32와 16으로 치환하여 수행하라.
우선 ‘blocks.tif’를 64, 32, 16으로 나누고 곱하는 명령을 수행해보자.
2번이랑 별로 설명할 것은 없지만 64로 나누고 곱한 것과 32, 16으로 처리한 것이다.
그 결과는 밑과 같다(명확한 차이점 비교를 위해 원본에 가깝게 키웠습니다).
보다시피 화소를 나누는 값이 작을수록 원본에 가깝게 느껴진다(품질이 더 좋다).
255를 64로 나눌 때 생기는 영역보다 32, 16으로 나눌 때 생기는 영역이 더 세분되어 있어서 손실 데이터 값이
더 적기 때문에 다시 곱하였을 때 더 좋은 품질로 나타나는 것이다.
3) 카메라맨 영상을 인덱스 영상으로 변환하라.
• 원영상, 인덱스영상의 인덱스를 영상으로 디스플레이
어려운 내용은 아니니 따로 설명은 적지 않았다. 밑은 출력 결과이다.
• 위 두 영상의 히스토그램 디스플레이
밑은 히스토그램으로 출력한 결과이다.
inshow로 출력했을 때 어두웠던 인덱스 영상으로 알 수 있듯이 인덱스 영상의 히스토그램이 왼쪽으로 치우쳐져 있다.
• 히스토그램 스트레칭 알고리즘을 적용하여 영상을 개선하시오.
– 인덱스 영상의 히스토그램을 보고 2개의 적절한 스트레칭 함수를 만들고 디스플레이 하세요.
– 이 스트레칭 함수를 사용하여 히스토그램 스트레칭을 구현하라.
– 결과 영상과 히스토그램을 디스플레이하고 비교 설명하라.
우선 스트레칭을 하기 위해서는 원래의 그레이 값(i: 몰려있는 값)을 변환된 그레이 값(j: 스트레칭으로 전체적으로 퍼지게 한 값)으로 변환해야 한다.
식은 [j = (d - c) / (b –a) * (i – a) + c]와 같이 진행된다.
그래서 인덱스 영상 히스토그램을 눈으로 참고하면서 스트레칭을 할 경우 범위를 0~60을 0~250까지 직접 스트레칭 해보는게 맞지만, 찾아보던 중 max, min을 구하는 함수를 구현한 것을 이용하기로 했다.
출처: [디지털 영상처리 기초] 5. 화소 단위 영상처리
Str1이라는 함수를 만든 것이며 평활화를 진행한 것이다.
매트랩에서는 imjust라는 함수로 구현되어 있다. 만들어진 함수를 사용해보자.
보다시피 Index histogram은 좌로 치우쳐져 있었다.
하지만 스트레칭을 통해 전체적으로 펴진 모양을 보여주고 있으며 스트레칭이 된 이미지 또한 원본과 비슷한 수준의 품질로 보여진다.
두 번째 함수는 부분적 선형 스트레칭 함수(Piecewise Linear-Stretching Function)이다.
우선 histpls 함수를 제작해보자.(이 부분도 참고했습니다.)
제작된 histpls 함수를 사용해서 i2(index된 cameraman 영상을 스트레칭 진행한 것)를 저장,
비교하기 위해 한꺼번에 결과를 출력한다.
부분적 선형 스트레칭 함수를 수행한 결과로는 인덱스 영상의 히스토그램이 치우치지 않게 되었고, 좌측으로 치우쳐졌을 당시 어두웠던 영상보다 밝아진 것(원본과 비슷한)을 볼 수 있다.