반응형

●  히스토그램 작성 순서도

●  cvCreateHist 함수  (히스토그램을 정의하는데 사용하는 함수)

 

CvHistogram* cvCreateHist( int dims, int *sizes, int type, 

                                                     float **range=NULL, int uniform=1)

 

 

-> dims

   히스토그램의 차원을 지정.

   흑백 영상이면 1, 컬러 영상이면 3차원.

 

-> sizes

    히스토그램 차원의 크기를 나타내며 배열로 표시함. 

    1차원 256 흑백영상의 경우 0부터 255까지 256개의 박대를 사용하므로

         int sizes[1] = {256}  으로 나타낼 수 있다.

    3차원 컬러영상의 경우 각각의 태널은 256개의 막대를 사용하므로

         int sizes[3] = {256, 256, 256}  으로 나타낼 수 있다.

 

-> type

    히스토그램 표현 형식을 나타낸다.

    type = CV_HIST_ARRAY이면 다채널 밀집 배열 (0인 원소가 적은 배열)을 나타내고

    type = CV_HIST_SPARSE이면 다채널 희소 배열 (0인 원소가 많은 배열)을 나타낸다.

 

-> ranges

    히스토그램의 x축 범위를 나타낸다.

 

-> uniform

    히스토그램에서 막대 사이의 간격을 일정하게 할 것인지 결정한다.

    uniform ≠ 0 이면 막대의 간격을 일정한 간격으로 한다.

 

 

●  cvCalcHist 함수 (영상으로부터 히스토그램을 계산하는데 사용하는 함수)

 

void cvCalcHist( IplImage** img, CvHistogram* hist);

 

 

->  img

     원 영상을 나타냄

 

->  hist

     히스토그램에 대한 포인터를 나타낸다.

 

 

●  cvGetMinMaxHistValue 함수 (막대에 대한 최대 빈도수와 최소 빈도수를 구함)

 

void cvGetMinMaxHistValue( CvHistogram* hist,

                                                 float* value_min, float* value_max);

 

 

->  hist

     히스토그램을 나타냄

 

->  value_min

     히스토그램의 최소 빈도수를 나타낸다.

 

->  value_max

     히스토그램의 최대 빈도수를 나타낸다.

 

 

●  cvScale 함수 (하나의 배열을 다른 배열로 선형 변환헤 의해 변환하는 함수)

 

void cvScale( CvArr* src, CvArr* dst, double scale=1, double shift=0);

 

 

->  src

      원 영상을 나타낸다.

 

->  dst

      목적 영상을 나타낸다.

 

->  scale

      스케일 파라미터를 나타낸다.

 

->  shift

      이동 파라미터를 나타낸다.

 

         cvScale() 함수는 dst = src * scale + shift 에 의해 변환된다.(cvConvertScale()와 동일)

 

 

●  cvRectangle 함수  (직사각형을 그리기 위한 함수)

 

void cvRectangle( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1 );

 

 

->  img

     직사각형이 그려질 영상을 나타냄

 

->  pt1

     직사각형의 모서리를 나타낸다.

 

->  pt2

     직사각형의 반대편 모서리를 나타낸다.

 

->  color

     직사각형의 선의 색상을 나타낸다.

 

->  thickness

     직사각형의 선의 두께를 나타낸다.

 

          cvRectangle() 함수에서 모서리 좌표 pt1과 pt2를 정할 때 원정이 어디에 위치하느냐는 중요한 문제이다.

          영상 좌표에서 원점은 왼쪽 상단임을 알고있자!

 

 

●  cvGetReal1D 함수  (1차원 히스토그램에서 i번째 막대의 빈고수를 얻기 위한 함수)

 

double cvGetReal1D( CvArr* arr, int idx0 );

 

 

-> arr

     1차원 배열을 나타낸다.

 

->  idx0

     원소의 위치에 대한 인덱스를 나타낸다.

     cvGetReal1D(histo->bins, i) 는 배열 bins 에서 i번째 인덱스에 대한 원소를 반환한다.

 

 

 

●  cvSet 함수  (영상을 주어진 값으로 설정할 때 사용)

 

void cvSet( CvArr* arr, CvScalar valuem CvArr* mask=0 );

 

 

->  arr

     원 영상을 나타낸다.

 

->  value

     채울 값을 지정한다.

 

->  mask

     마스크를 나타낸다.

 

         cvSet(histImage, cvScalarAll(255), 0) 이면 영상 histImage의 픽셀값을 255로 설정한다.

 

         cvScalarAll(double num);

               ->  모든 스칼라의 value들을 num 으로 초기화시켜준다.

 

 

 

●  cvEqualizeHist 함수  (흑백 영상에서 히스토그램 평활화하는데 사용하는 함수)

 

void cvEqualizeHist(CvArr* src, CvArr* dst);

 

 

->  src

     흑백 영상을 나타낸다.

 

->  dst

     목적 영상을 나타낸다.

 

 

 

출처: OpenCV를 이용한 영상처리( 임동훈 지음)


    

반응형

'OpenCV > Histogram' 카테고리의 다른 글

히스토그램  (0) 2020.12.29
히스토그램 예제  (0) 2019.08.12
반응형

히스토그램이란 영상의 픽셀값들에 대한 분포를 나타내는 그래프로

영상을 분석하는데 매우 유용하다.

 

https://ttend.tistory.com/570

좌측은 일반적인 도수분포표이고 우측은 도수분포표를 이용하여 나타낸

히스토그램으로 영상처리 작업을 진행할 땐 히스토그램의 x축이 픽셀값,

y축이 빈도수로 나타내어 질 수 있다.

 

또한 픽셀값이 작을수록 영상은 어둡게 나타나고 픽셀값이 증가함에 따라

영상은 밝게 표시되므로 영상의 밝기에 따른 히스토그램은

(좌) 어두운 영상                                               (우) 밝은 영상

위와 같이 나타낼 수 있다.

 

또한 명암대비에 따른 히스토그램을 나타내면

 

(좌) 낮은 명암대비 영상                                 (우) 높은 명암대비 영상

위와 같이 나타낼 수 있고 이를통해 알 수 있듯이 명암대비가 낮은 영상은 픽셀값들이 좁은 영역에 분포되어

영상이 선명하지 않고 명암대비가 높은 영상은 넓은 범위에 걸쳐 골고루 분포되어 영상이 선명함을 알 수 있다.

 

*명암대비 : 상이한 2가지 색이 서로 영향을 미쳐서 그 상이함이 강조되어 지각()되는 현상

 

 

 

반응형

'OpenCV > Histogram' 카테고리의 다른 글

히스토그램을 나타내기 위한 OpenCV 함수들  (0) 2020.12.29
히스토그램 예제  (0) 2019.08.12
반응형
void main()
{
	IplImage* src_image = 0;
    IplImage* imgHistogram = 0;
    
    int bins = 256;
    int sizes[] = {bins};
    
    float max_value = 0, min_value = 0;
    
    float xranges[] = {0, 255};
    float *ranges[] = {xranges};
    
    src_image = cvLoadImage("c:/opencv/...../lena.jpg", 0);
    imgHistogram = cvCreateImage( cvGetSize(src_image), IPL_DEPTH_8U, 1);
    
    cvNamedWindow("Original Image", CV_WINDOW_AUTOSIZE);
    cvNamedWindow("Histogram", CV_WINDOW_AUTOSIZE);
    
    CvHistogram *histo = cvCreateHist(1, sizes, CV_HIST_ARRAY, ranges, 1);
    cvCalcHist( &src_image, histo);
    
    cvGetMinMaxHistValue( histo, &min_value, &max_value);
    cvConvertScale( histo->bins, histo->bins, ((double)imgHistogram->height)/max_value, 0);
    cvSet(imgHistogram, cvScalarAll(255), 0);
    
    int bandwidth = cvRound((double)imgHistogram->width/bins);
    for(int i=0; i<bins; i++)
    {
    	int val = cvRound(cvGetReal1D(histo->bins, i));
        cvRectangle(imgHistogram, cvPoint(i*bandwidth, imgHistogram->height), 
        		cvPoint((i+1)*bandwidth, imgHistogram->height-val), cvScalarAll(0), 1);
    }
    
    cvShowImage("Original Image", src_image);
    cvShowImage("Histogram", imgHistogram);
    
    cvWaitKey();
    cvReleaseImage(&src_image);
    cvReleaseImage(&imgHistogram);
}

 

 

 

출처: opencv를 이용한 영상처리 (임동훈 지음)

반응형

'OpenCV > Histogram' 카테고리의 다른 글

히스토그램을 나타내기 위한 OpenCV 함수들  (0) 2020.12.29
히스토그램  (0) 2020.12.29

+ Recent posts