라즈베리파이에서 Processing을 이용한 영상처리- 히스토그램

메카 2017-04-03 (월) 13:02 2년전 1165  

5.2 히스토그램

히스토그램은 영상의 밝기값을 프로파일(profile)로 보여주기 위해 사용되는 도구이다. 수학에서는 도수분포표를 그래프로 나타낸 것이며, 영상처리에서는 영상의 명암대비 및 명암값 분포에 대한 정보를 제공한다. 영상 히스토그램은 화소가 가질 수 있는 명암값을 X축 상에 그려지며, 각 명암값이 가진 빈도는 누적해서 Y축에 그려진다.

 

[실습5-5] 영상 히스토그램

영상 1개를 불러와서 영상 히스토그램을 그려본다.

a) 소스코드 및 결과 영상

 

 size(1280, 500);

background(255);

 

PImage img = loadImage("GrayScaleImage.jpg");

image(img, 0, 0);

int[] hist = new int[256];

 

// Calculate the histogram

for (int i = 0; i < img.width; i++) {

for (int j = 0; j < img.height; j++) {

int bright = int(brightness(get(i, j)));

hist[bright]++;

}

}

// Find the largest value in the histogram

int histMax = max(hist);

 

// Draw half of the histogram (skip every second value)

for (int i = 0; i < img.width; i += 2) {

int which = int(map(i, 0, img.width, 0, 255));

int y = int(map(hist[which], 0, histMax, img.height, 0));

line(img.width+i, img.height, img.width+i, y);

}

 

line(640,480,1280,480);

line(640,481,1280,481);

 

textSize(20);

fill(0,0,0);

text("0",640,500);

text("255",1242,500);

 

 

02c7232450ce0f92271d32085c8e4707_1491191
02c7232450ce0f92271d32085c8e4707_1491191
02c7232450ce0f92271d32085c8e4707_1491191

 

[그림 5-5] 실습5-5 소스 코드 및 밟기에 따른 히스토그램 분포도 결과 영상; (a) 정상적인 영상, (b) 밝은 영상, (c) 어두운 영상

 

b) 코드 설명

4장의 그레이스케일 영상 만들기 실습을 통해 만들어진 그레이스케일 영상을 이용한다. brightness()함수get()함수를 이용하여 각 픽셀의 밝기 값을 획득한다. 배열의 위치는 정수 이므로 획득된 밝기 값을 int를 이용하여 정수화 시킨다. 그레이스케일 영상은 0부터 255까지 표현하므로 배열 변수 hist의 크기를 256으로 설정한다. max()함수를 이용하여 배열 변수 hist가운데서 가장 큰 값을 찾는다. 이것은 히스토그램을 그릴 때 사용한다. 히스토그램을 나타내는 화면의 크기는 입력 영상의 가로 640, 세로 480과 같은 크기로 나타내고자 한다. 그러나 히스토그램의 가로는 256, 세로는 max()에 의해 얻어진 값이므로 출력하고자 하는 크기와 다르다. 이를 극복하기위해 map()함수를 이용하여 그리고자하는 영상의 크기(640x480)와 같은 폭과 높이가 되도록 조절한다. map()함수 내부는 map(value, from_min, from_max, to_min, to_max)로 나타낼 수 있다. , which = int(map(i, 0, img.width, 0, 255))는 현재 i값을 0부터 480의 범위를 0부터 255 범위로 매핑 시켜 결과 값을 which에 저장 하는 것으로써, 가로의 크기 0~4800~255의 크기로 맞추는 것이다. 다음 줄의 것도 마찬가지로 hist[which]의 값을 0~histMax640~0의 크기로 맞추는 것이다. 최종으로 얻어진 히스토그램의 세로축 y 값을 line()함수를 이용해서 그려주는 것이다. 글자와 히스토그램의 밑선을 표시하기위해 출력 화면 크기는 1280x500으로 하였다. fill()함수는 이후에 오는 글자의 색을 결정하는 것이다. 없으면 아무것도 나타나지 않으며, 다른 글자색을 원할 경우 괄호안의 값을 변경하면 된다

 

메카리워즈 Image Map


모바일 버전으로 보기