Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- fsm
- 스마트팩토리
- 모니터링시스템
- intensity
- 산업자동화
- Ik
- 디지털트윈
- Histogram
- datastructure
- c++
- 로봇공학
- 역기구학
- git
- 깃허브
- github
- C
- mqtt
- c프로그래밍
- 컴퓨터비전
- robotics
- 로보틱스
- makefile
- 자료구조
- IoT
- cprogramming
- pointer
Archives
- Today
- Total
yebeen.kim
3_1 Histogram equalization 본문
히스토그램(Histogram) 이란?
- 이미지의 픽셀 값(강도, intensity 수준)에 따른 분포를 나타내는 그래프
- 각 강도 수준에 해당하는 픽셀 수를 세어 표현하며, 일반적으로 이미지의 밝기나 색상에 따른 변화를 시각적으로 확인할 수 있다.
- 히스토그램의 빈(bin) 수는 이미지에서 표현 가능한 강도 값의 범위인 L에 해당한다.
강도 수준 범위 : [0, L - 1]

히스토그램 정규화 (Histogram normalization)
- 각 강도 값에 해당하는 픽셀 수를 전체 픽셀 수로 나누는 과정
- 이를 통해 히스토그램을 확률 분포 함수(probability function)로 해석할 수 있다.
- 즉, 각 강도 수준에 대한 픽셀 비율을 계산하여 이미지의 전체적인 밝기 분포를 파악할 수 있게 됩니다.
히스토그램 계산하는 방법
예시)
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 | 2 |
| 2 | 3 | 3 | 3 | 3 |
| 3 | 3 | 3 | 7 | 10 |
- Intensity level is 16 [0, 15]
설명
- 6 x 5 배열로, 30개의 픽셀로 이루어져있다.
- 강도 수준은 [0, 15] 까지 존재하며, 주어진 빈(bin)의 개수는 4개이다.
- 주어진 배열에서 각 강도 수준의 픽셀 수를 세고, 이를 각 빈에 맞춰 정리한다
1번째 빈 : [0 ~ 3]
강도 0, 1, 2, 3 에 해당하는 픽셀을 센다
0 (7개) + 1 (5개) + 2 (5개) + 3 (11개) = 28개 / 30개
2번째 빈 : [4 ~ 7]
강도 4, 5, 6, 7 에 해당하는 픽셀을 센다
7 (1개) = 1개 / 30개
3번째 빈 : [8 ~ 11]
강도 8, 9, 10, 11 에 해당하는 픽셀을 센다
10 (1개) = 1개 / 30개
4번째 빈 : [12 ~ 15]
강도 12, 13, 14, 15 에 해당하는 픽셀을 센다
0개 / 30개
결론 : 각 빈에 해당하는 픽셀 비율은 다음과 같다.
- Number of bins : 4
- 1st bin [0-3] : 28/30
- 2nd bin [4-7] : 1/30
- 3rd bin [8-11] : 1/30
- 4th bin [12-15] : 0/30
히스토그램 평활화 (Histogram Equalization)
- 히스토그램 평활화는 이미지의 대비(Contrast)를 개선하는 방법입니다.
- 이미지를 보다 선명하게 만들어 객체를 쉽게 구분할 수 있도록 돕습니다.
- 이 작업은 이미지의 픽셀 값이 특정 범위에 집중되어 있을 때, 강도 값을 재분배하여 균일한 밝기 분포를 만드는 과정을 포함한다.
- 대비(Contrast): 밝기 또는 색상의 차이로 인해 객체가 더욱 두드러져 보이는 정도
- 대비는 이미지의 강도 값 분포에 따라 결정된다, 강도 값의 차이가 클수록 대비가 높아진다

1. 히스토그램 계산 (Histogram computation)
- 먼저, 입력 이미지의 히스토그램을 계산하는 과정이다. 각 픽셀의 강도 값을 기준으로 픽셀의 분포를 확인하여 히스토그램을 작성한다. 이를 통해 이미지가 밝은 부분, 어두운 부분, 또는 특정 강도에 집중되어 있는지 파악할 수 있다.
2. 픽셀 값을 균일하게 분포시키는 매핑 함수 찾기 (Find mapping function which distributes pixel values uniformly)
- 다음으로, 픽셀 값을 균일하게 분포시키기 위한 매핑 함수를 찾는 단계이다.
- 이 함수는 히스토그램의 누적 분포 함수(CDF)를 사용하여 생성된다.
- 이를 통해 기존 픽셀 값이 새로운 픽셀 값으로 변환되며, 이미지의 대비를 조정할 수 있게 된다.
3. 입력 이미지에 매핑 함수 적용 (Apply the mapping function to an input image)
- 마지막으로, 찾은 매핑 함수를 입력 이미지에 적용하는 과정이다.
- 각 픽셀의 강도 값은 매핑 함수를 통해 새롭게 변환되며, 이를 통해 히스토그램이 균일하게 조정된 이미지를 생성하게 된다.
- 예시 코드 )
int main() {
Mat image;
Mat hist_equalized_image;
image = imread("lena.png", 0); // 그레이스케일 이미지 로드
if (!image.data) exit(1); // 이미지 로드 실패 시 종료
equalizeHist(image, hist_equalized_image); // 히스토그램 평활화 적용
imshow("Input Image", image); // 원본 이미지 출력
imshow("Hist Equalized Image", hist_equalized_image); // 평활화된 이미지 출력
waitKey(0); // 키 입력 대기 후 종료
return 0;
}
히스토그램 평활화의 한계
- 히스토그램 평활화가 항상 이미지를 향상시키는 것은 아니다.
- 특히, 특정 강도 범위의 픽셀 값이 우세한 이미지에서는 오히려 이미지의 디테일이 손상되거나, 과도하게 대비가 증가하여 불필요한 노이즈가 발생할 수 있다.
- 따라서 이미지에 따라 히스토그램 평활화의 효과는 달라질 수 있다.