1. Mat class at() 메소드 사용
Mat Class가 가지고 있는 at() 함수를 사용하면 영상에서 임의의 화소값을 가져오거나 수정 가능 at(y, x)의 인수로 화소의 행 번호와 열 번호 전달
Code
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { Mat img = imread("lenna.jpg", IMREAD_GRAYSCALE); if (img.empty()) { cout << "Image not found.\n"; return -1; } imshow("Image", img); Mat atImg = img.clone(); for (int r = 0; r < atImg.rows; r++) { for (int c = 0; c < atImg.cols; c++) { atImg.at<uchar>(r, c) = saturate_cast<uchar>(atImg.at<uchar>(r, c) + 30); } } imshow("at Image", atImg); waitKey(0); return 0; }
실행화면
// Overflow 오버플로우 img.at<uchar> (r, c) = img.at<uchar>(r, c) + 30; // 255값을 넘어가면 Overflow 발생 // 해결 방법 img.at<uchar> (r, c) = saturate_cast<uchar>(img.at<uchar>(r, c) + 30); // 255를 넘는 수는 255로 casting 된다.
2. 배열 연산자[] 사용
Code
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { Mat img = imread("lenna.jpg", IMREAD_GRAYSCALE); if (img.empty()) { cout << "Image not found.\n"; return -1; } imshow("Image", img); Mat arrayImg = img.clone(); for (int r = 0; r < arrayImg.rows; r++) { uchar* p = arrayImg.ptr<uchar>(r); for (int c = 0; c < arrayImg.cols; c++) { p[c] = saturate_cast<uchar>(p[c] + 30); } } imshow("arrayImage", arrayImg); waitKey(0); return 0; }
img.ptr : 이미지 데이터 포인터
실행화면
3. Open CV convertTo() 함수 사용하기
영상의 밝기를 증가시키는 것은 Open CV에서 함수로 지원하고 있다. src.convertTo(dst, rType, alpha, beta); // dst : output matrix // rType : output matrix type || depth (-1 : src와 같은 type으로) // alpha : scale factor (콘드라스트 조정에 주로 사용) // beta : added value (밝기에 주로 사용)
Code
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { Mat img = imread("lenna.jpg", IMREAD_GRAYSCALE); if (img.empty()) { cout << "Image not found.\n"; return -1; } imshow("Image", img); Mat convertImg; img.convertTo(convertImg, -1, 1, 30); // (outputImage, type, alpha, beta) -- alpha : contrast, beta : brightness imshow("convertImg ", convertImg); waitKey(0); return 0; }
실행 화면
Brightness : 밝기 Contrast : 색상 대비 (밝기 생상 차이)
increased constrast : 가장 밝은 값과 어두운 값의 차이를 키운다. decreased constrast : 가장 밝은 값과 어두운 값의 차이를 줄인다. Image Enhancement를 위해 사용된다.
α : Contrast 조정 값 (gain) (α > 1 → 색상 스펙트럼이 넓어진다. : high contrast) (α < 1 → 색상 스펙트럼이 좁아진다. : low contrast) β : Brightness 조정 값 (bias)
Code
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { Mat img = imread("contrast.jpg", IMREAD_COLOR); if (img.empty()) { cout << "Image not found.\n"; return -1; } imshow("color Image", img); double alpha = 1.5; int beta = 0; Mat enhaceImg; img.convertTo(enhaceImg, -1, alpha, beta); // enhaceImg = img * alpha + beta; imshow("enhaceImg ", enhaceImg); waitKey(0); return 0; }
실행 화면
왼쪽 원본 사진과 오른쪽 콘트라스트 조정한 사진을 비교해보면 확실히 색 대비가 커진 것을 볼 수 있습니다.
lenna.jpg (400 x 400)
contrast.jpg (553 x 346)