알파는 0보다 큰 콘트라스트 값이다. 베타는 밝기값이다. 는 입력이미지이고 는 출력이미지이다. 정확하게는 아래와 같이 표현할 수 있다.
여기에서 i는 이미지에서 x축을 의미하고 j는 y축을 의미한다. 이 함수의 샘플코드는 아래와 같다.
#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
댓글 없음 :
댓글 쓰기
참고: 블로그의 회원만 댓글을 작성할 수 있습니다.