히스토그램과 평활화(1)

전종원·2022년 10월 18일
0

1. 히스토그램

히스토그램이란?

  • 영상의 픽셀값 분포를 그래프의 형태로 표현한 것.

정규화된 히스토그램(normalized histogram)

  • 히스토그램으로 구한 각 픽셀의 개수를 영상 전체 픽셀 개수로 나누어준 것
  • 특정 픽셀값이 나타날 확률

2. 히스토그램 구하기

int main()
{
	Mat src;
	src = imread("lenna.bmp", IMREAD_GRAYSCALE);
	
	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return -1;
	}

	int hist[256] = {};
    
    for(int j = 0; j < src.rows; j++) {
    	for(int i = 0; i < src.cols; i++) {
        	hist[src.at<uchar>(j,i)]++;
        }
    }

	int histMax = 0;
    
    for(int i = 0; i < 256; i++) {
    	if(hist[i] > histMax) histMax = hist[i];
    }
    
    Mat imgHist(100, 256, CV_8UC1, Scalar(255));
    for(int i=0; i < 256; i++) {
    	line(imgHist, Point(i, 100), Point(i, 100-cvRound(hist[i]*100/histMax)), Scalar(0));
    }
    
	imshow("src", src);
	imshow("histogram", imgHist);

	waitKey();
}

OpenCV 히스토그램 계산함수

void calcHist(const Mat* images, int nimages, const int* channels, 
			InputArray mask, OutputArray hist, int dims, const int* histSize, 
            const float** ranges, bool uniform = true, bool accumulate = false);
  • images: 입력영상의 배열 혹은 입력영상의 주소. 영상의 배열인 경우 모두 크기와 깊이가 같아야함.
  • nimages: 영상의 갯수
  • channels: 히스토그램을 구할 채널을 나타내는 정수형 배열
  • mask: 마스크 영상. 영상 전체에서 구하려면 noArray() 지정
  • hist: 출력 히스토그램. dims-차원 배열. Mat 또는 SparseMat.
  • dims: 출력 히스토그램 차원
  • histSize: 히스토그램 각 차원의 크기를 나타내는 배열
  • ranges: 히스토그램 각 차원의 최솟값과 최댓값을 원소로 갖는 배열
  • uniform: 히스토그램 빈의 간격이 균등한지를 나타내는 플래그
  • accumulate: 누적 플래그. 이 값이 true이면 hist배열을 초기화하지 않고 누적하여 히스토그램을 계산함.

사용예제


3. 히스토그램 분석

영상과 히스토그램의 관계

  • 밝은 영상: 히스토그램 분포가 우로 치우침
  • 어두운 영상: 히스토그램 분포가 좌로 치우침
  • 명암비가 높은 영상: 히스토그램이 넓게 분포
  • 명암비가 낮은 영상: 히스토그램이 좁게 분포

0개의 댓글