C++ OpenCV 이미지 전처리

2021. 1. 4. 00:29OpenCV/OpenCV C++

반응형

1.이미지 불러오고 보여주기

이미지 읽기 & 불러오기 ( Image Read, imread() )

using namespace cv;
using namespace std;

...

Mat img = imread("Lenna.png", 1);

imread("fileName", flag)

fileName : 불러오고자 하는 이미지의 경로를 입력

flag : 불러오는 옵션

 

 

이미지 보여주기 ( Image Show, imshow() )

...
imshow("img", img);
waitKey(0);
...

imshow("windowName", image)

windowName : 이미지를 보여줄 윈도우 창의 이름을 입력

image : Mat 형식의 image 변수 이름을 입력

 

waitKey(delay time)

delay time : 키입력을 기다릴 시간을 입력 

 

보통 imshow() 함수를 사용하게 되면, 거의 waitKey()함수가 필수적으로 따라온다.

 

 

테스트 코드

#include <opencv2/highgui.hpp>

using namespace cv;
using namespace std;

int main(int ac, char** av) {

	Mat color_img = imread("Lenna.png",IMREAD_COLOR);
	Mat grayscale_img = imread("Lenna.png", IMREAD_GRAYSCALE);
	Mat unchanged_img = imread("Lenna.png", IMREAD_UNCHANGED);
	Mat reduced_img = imread("Lenna.png", IMREAD_REDUCED_COLOR_2);
	Mat reduced_grayscale_img = imread("Lenna.png", IMREAD_REDUCED_GRAYSCALE_4);

	imshow("color_img", color_img);
	imshow("grayscale_img", grayscale_img);
	imshow("unchanged_img", unchanged_img);
	imshow("reduced_img", reduced_img);
	imshow("reduced_grayscale_img", reduced_grayscale_img);
	waitKey(0);

	return 0;
}

결과 

 

 

2. 이미지 색채널 변경 ( Converter Color )

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

...

Mat color_img = imread("Lenna.png");
Mat grayscale_img;

cvtColor(color_img, grayscale_img, COLOR_BGR2GRAY);

...

cvtColor( inputArray, outputArray, flag)

input Array 를 입력 받아 flag에 대한 옵션으로 이미지 색채널을 변경하여 outputArray에 저장한다.

 

테스트 코드

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int ac, char** av) {

	Mat color_img = imread("Lenna.png");
	Mat grayscale_img;

	cvtColor(color_img, grayscale_img, COLOR_BGR2GRAY);
	
	imshow("color_img", color_img);
	imshow("grayscale_img", grayscale_img);
	waitKey(0);

	return 0;
}

 

결과

 

 

3. 이미지 밝기 조절

OpenCV를 사용해서 영상처리를 할 때 흑백(grayscale) 이미지에서 연산을 처리해야 한다.

연산처리 속도가 빨라지고 명확하게 할 수 있으므로, 오히려 정확도가 올라간다.

grayscale 이미지에서 밝기를 조절하는 방법을 알아보려고 한다.

 

가장 쉬운 방법은 사칙연산을 이용한 밝기 조절이다.

 

덧셈 뺄셈

 

테스트 코드

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int ac, char** av) {

	Mat img_1 = imread("Lenna.png",0);	//이미지를 grayscale로 불러옴

	Mat img_2 = img_1 + 100;
	Mat img_3 = img_1 - 100;

	imshow("original", img_1);
	imshow("img_sum", img_2);
	imshow("img_sub", img_3);

	waitKey(0);

	return 0;
}

 

결과

 

곱셈 나눗셈

 

테스트 코드

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int ac, char** av) {

	Mat img_1 = imread("Lenna.png",0);	//이미지를 grayscale로 불러옴

	Mat img_2 = img_1 * 2;
	Mat img_3 = img_1 / 2;

	imshow("original", img_1);
	imshow("img_mul", img_2);
	imshow("img_div", img_3);

	waitKey(0);

	return 0;
}

 

결과

 

Histogram을 이용한 이미지 밝기 조절

 

히스토그램(histogram) : 이미지의 밝기 값이 0~255 까지 있을 때, 픽셀들이 얼마나 그 값들을 갖고 있는지 알려주는 그래프

 

히스토그램 균일화 ( equalizeHist )

...

	Mat img_1 = imread("Lenna.png", 0);	//이미지를 grayscale로 불러옴

	Mat hist_img;

	equalizeHist(img_1, hist_img);
    
...

equalizeHist(Input Array, Output Array)

InputArray(입력 이미지)의 히스토그램 정보를 통해서 균일화를 해준 후 해당 정보를 Output Array(결과 이미지)에 저장한다.

 

코드 테스트

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int ac, char** av) {

	Mat img_1 = imread("Lenna.png", 0);	//이미지를 grayscale로 불러옴

	Mat hist_img;

	equalizeHist(img_1, hist_img);

	imshow("Original", img_1);
	imshow("Histogram equalization", hist_img);

	waitKey(0);



	return 0;
}

 

결과

 

 

출처 - DIYver

 

[C++ opencv] 효율적인 Histogram 이용한 이미지 밝기 조절

본문 목표 이미지의 Histogram 정보를 통해서 이미지의 밝기를 효과적으로 조절할 수 있다. OpenCV 에서도 해당 기능을 지원하는데, 이를 적용해보도록 한다. 키워드 : equalizeHist, Histogram equalization, 히

diyver.tistory.com

반응형