[HCI] 07. 화소 처리 : 밝기 및 콘트라스트 조정

조혜정·2021년 10월 13일
1
post-thumbnail

✔ 화소 접근 방법

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;
}
실행 화면
왼쪽 원본 사진과 오른쪽 콘트라스트 조정한 사진을 비교해보면
확실히 색 대비가 커진 것을 볼 수 있습니다.

✔ Test Image

lenna.jpg (400 x 400)
contrast.jpg (553 x 346)

profile
ʜʏᴇᴘᴘʏ ᴅᴇᴠ

0개의 댓글