본문 바로가기
IT

[openCV / c++] 사진 반만 흑백으로 만들기 / 사진 밝게 만들기 / 사진 어둡게 만들기

by 배애앰이 좋아 2020. 12. 30.
반응형

반만 흑백으로 만드는 함수 void gray(IplImage *img) 으로 half_width에서 사진의 반만 흑백으로 만들기 위해서 이미지 너비의 1/2를 얻어온다.

 

void gray(IplImage *img)
{
	int half_width = img->width / 2; //이미지의 1/2 너비를 가져온다

	for (int i = 0; i < half_width; i++) {
		for (int j = 0; j < img->height; j++)
		{
			CvScalar color = cvGet2D(img, j, i); //해당 픽셀 color 값을 가져온다
			double avgColor = (color.val[0] + color.val[1] + color.val[2]) / 3.0; //A설명
			cvSet2D(img, j, i, CV_RGB(avgColor, avgColor, avgColor));
		}
	}
}

 

CvScalar color = cvGet2D(img, j, i); 은 j, i 좌표에 해당 픽셀 color 값을 가져온다

cvSet2D(img, j, i, CV_RGB(avgColor, avgColor, avgColor)); 은 j, i 좌표에 해당 픽셀을 CV_RGB(avgColor, avgColor, avgColor) 값으로 바꾼다.

 

A 설명 :

(R + G + B)/3 = 하나의 값 => 이미지를 밝기를 계산하는 수식.

R G B 가 다 같은 숫자면 흑백이 됨. 

 

int main(void)
{
	IplImage *img = cvLoadImage("img//test.jpg");
	gray(img);
	cvShowImage("opencv", img);

	cvWaitKey();

	if (img != nullptr) {
		cvSaveImage("save_test1.jpg", img); //해당 이름으로 저장
		printf("save");
	}

	cvDestroyAllWindows();
	cvReleaseImage(&img);
}

 

이미지를 열기 전에 gray()함수를 통해 이미지를 변환해준다.

 

전체 코드 : 헤더파일 주의!

 

#include <stdio.h>
#include "opencv2/opencv.hpp"

void gray(IplImage *img)
{
	int half_width = img->width / 2;

	for (int i = 0; i < half_width; i++) {
		for (int j = 0; j < img->height; j++)
		{
			CvScalar color = cvGet2D(img, j, i);
			double avgColor = (color.val[0] + color.val[1] + color.val[2]) / 3.0;
			cvSet2D(img, j, i, CV_RGB(avgColor, avgColor, avgColor));
		}
	}
}

int main(void)
{
	IplImage *img = cvLoadImage("img//test.jpg");
	gray(img);
	cvShowImage("opencv", img);

	cvWaitKey();

	if (img != nullptr) {
		cvSaveImage("save_test1.jpg", img);
		printf("save");
	}

	cvDestroyAllWindows();
	cvReleaseImage(&img);
}

 

결과 이미지 : 

 

 

응용하기 : 반만 밝게 만들기

반만 흑백으로 만드는 함수 void gray(IplImage *img) 에서 아래와 같이 바꾸면 된다.

 

void gray(IplImage *img)
{
	int half_width = img->width / 2;

	for (int i = 0; i < half_width; i++) {
		for (int j = 0; j < img->height; j++)
		{
			CvScalar color = cvGet2D(img, j, i);
            		// 아래 코드 한 줄 설명 B
			cvSet2D(img, j, i, CV_RGB(color.val[2]+50, color.val[1] + 50, color.val[0] + 50));
		}
	}
}

 

이렇게 해주는 이유는 색의 값은 0 ~ 255 사이인데 0에 가까울수록 검은 색에 255에 가까울 수록 흰색에 가깝기 때문에 모든 R G B에 + 값을 더해주면 밝게, - 값을 더해주면 어둡게 바뀐다.

 

주의할 점은 B 줄에서 CvScalar 구조 : 색상정보, BGR 구조인데 이를

CV_RGB(r,g,b) 로 넣어줘야하기 때문에 color.var[0] color.var[1] color.var[2] 가 아닌 color.var[2] color.var[1] color.var[0]으로 넣어준다.

 

결과 이미지 : 

 

 

만약 각 R G B 에 - 값을 해준다면, 어두워지는 것을 확인 가능하다.

 

반응형

댓글