사진술, 컴퓨팅, 그리고 표색계에서, 회색조 또는 그레이스케일(grayscale, greyscale) 디지털 영상은 각 화소의 값이 빛의 양을 나타내는 하나의 샘플인 이미지를 가리키며, 광도의 정보만을 전달한다. 이러한 종류의 이미지는 흑백 또는 단색화로도 알려져 있으며 회색 음영으로 이루어져 있어서 가장 여린 광도의 "검정"부터 가장 센 광도의 "백색"에 이르기까지 다양하다.
회색조 이미지는 1비트 투톤의 흑백 이미지와는 구분되며 컴퓨터 이미징에서 볼 때 이미지는 검은색과 흰색의 두 색만을 가지고 있다(bilevel또는 이진 이미지라고도 불린다). 회색조 이미지는 그 사이의 많은 회색 음영을 가지고 있다.
회색조 이미지는 진동수(또는 파장)의 특정한 가중 조합에 따라 각 픽셀에서 측정되는 빛의 세기의 결과이고 그런 경우에 한 주파수(실제로는 좁은 주파수 영역)만이 포착되었을 때 단색이 적합하다. 주파수는 이론적으로 전자기 스펙트럼의 어디에든 있을 수 있다(예를 들어, 적외선, 가시광선, 자외선, 등.).
출처 - https://ko.wikipedia.org/wiki/%ED%9A%8C%EC%83%89%EC%A1%B0
그레이 스케일 변환 공식은 다양하다. 그러는 이유는 영상 전처리 단계에서 사람이 인지 할 수 있는 색상 대역폭을 기준으로 처리하기도 하고 특수 한 경우에 사용하는 공식이 다르다.
Gray = (Red + Green + Blue) / 3
Gray = (Red * 0.3 + Green * 0.59 + Blue * 0.11)
Gray = (Red * 0.2126 + Green * 0.7152 + Blue * 0.0722)
Gray = (Red * 0.299 + Green * 0.587 + Blue * 0.114)
Gray = ( Max(Red, Green, Blue) + Min(Red, Green, Blue) ) / 2
cvtColor 함수에 3번째 인자에 COLOR_BGR2GRAY FLAG 설정하면 간단하게 작성 할 수 있다. 아래는 전체 소스 코드이다.
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>
using namespace std;
using namespace cv;
/*
* @brief - grayscale 영상으로 변경하는 메소드
*/
void showGrayScaleImage(Mat img) {
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
imshow("Gray", gray);
}
int main() {
Mat img = imread("image.png", IMREAD_COLOR);
if(img.empty()) {
cout << "이미지가 없거나, 유효한 파일 형식이 아닙니다." << endl;
return -1;
}
imshow("원본 이미지", img);
showGrayScaleImage(img);
waitKey(0);
return 0;
}
OpenCV 를 활용하면 간단하게 처리할 수 있으며
컬러영상을 그레이 스케일 영상으로 변환 할 수 있다.
아래는 위 소스코드의 출력 결과 이다.
OpenCV 설치 - Visual Studio 2012 (0) | 2021.02.14 |
---|---|
concrt140d.dll msvcp140d.dll ucrtbased.dll vcruntime140d.dll Runtime Error - OpenCV (0) | 2021.02.14 |
타이머 사용하기 TickMeter class - OpenCV (0) | 2021.02.14 |
비사실적 렌더링 Non-Photorealistic Rendering - OpenCV (0) | 2021.02.14 |
템플릿 매칭 Template Matching - OpenCV (0) | 2021.02.14 |
댓글 영역