반만 흑백으로 만드는 함수 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 에 - 값을 해준다면, 어두워지는 것을 확인 가능하다.
'IT' 카테고리의 다른 글
[openCV / C++ ] 픽셀 아트 만들기 (0) | 2020.12.31 |
---|---|
[opencv][C++ ] 가우시안 필터 구현하기 / 사진 노이즈 제거하기 (gaussian filter, gaussian blur) (0) | 2020.12.31 |
[c++/openCV] 비주얼 스튜디오(visual stdio)에 openCV 설치하기 (0) | 2020.12.30 |
[Web] css / html tag 태그 정리 - 3 (0) | 2020.12.25 |
[Web] css / html tag 태그 정리 - 2 (0) | 2020.12.25 |
댓글