2015년 2월 20일 금요일

OpenCV - 콘트라스트와 밝기 적용하기

콘트라스트와 밝기는 아래 수식으로 표현된다.
g(x) = \alpha f(x) + \beta

알파는 0보다 큰 콘트라스트 값이다. 베타는 밝기값이다. 는 입력이미지이고 는 출력이미지이다. 정확하게는 아래와 같이 표현할 수 있다.

g(i,j) = \alpha \cdot f(i,j) + \beta

여기에서 i는 이미지에서 x축을 의미하고 j는 y축을 의미한다. 이 함수의 샘플코드는 아래와 같다.


#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;

double alpha; /*< Simple contrast control */
int beta;  /*< Simple brightness control */

int main( int argc, char** argv )
{
   /// Read image given by user
   Mat image = imread( argv[1] );
   Mat new_image = Mat::zeros( image.size(), image.type() );

   /// Initialize values
   std::cout<<" Basic Linear Transforms "<<std::endl;
   std::cout<<"-------------------------"<<std::endl;
   std::cout<<"* Enter the alpha value [1.0-3.0]: ";std::cin>>alpha;
   std::cout<<"* Enter the beta value [0-100]: "; std::cin>>beta;

   /// Do the operation new_image(i,j) = alpha*image(i,j) + beta
   for( int y = 0; y < image.rows; y++ ) {
       for( int x = 0; x < image.cols; x++ ) {
           for( int c = 0; c < 3; c++ ) {
               new_image.at<Vec3b>(y,x)[c] =
               saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta );
           }
       }
   }

   /// Create Windows
   namedWindow("Original Image", 1);
   namedWindow("New Image", 1);

   /// Show stuff
   imshow("Original Image", image);
   imshow("New Image", new_image);

   /// Wait until user press some key
   waitKey();
   return 0;
}



gray scale이미지일때는 채널(RGB)이 없으므로 아래와 같이 변경되어야 한다.

   for( int y = 0; y < image.rows; y++ ) {
       for( int x = 0; x < image.cols; x++ ) {
           new_image.at<uchar>(y,x) =
           saturate_cast<uchar>( alpha*( image.at<uchar>(y,x) ) + beta );
       }
   }


saturate_cast함수는 대상수치가 지정된 데이터형의 최소값 밑으로 내려간 경우 데이터형의 최소값을 돌려 주고 최대값을 넘어 간 경우 최대값을 돌려 주는 함수다. 즉, 보통 데이터 형이 바뀌면서 표현할 수 있는 비트가 줄어 드는 경우 상위비트를 버리고 하위비트만을 취하면서 이상한 값을 돌려 주는 문제가 발생하는데 saturate_cast는 이런 문제를 해결하기 위한 것이다.


참고링크

http://docs.opencv.org/trunk/doc/tutorials/core/basic_linear_transform/basic_linear_transform.html

댓글 없음 :

댓글 쓰기

참고: 블로그의 회원만 댓글을 작성할 수 있습니다.