x : 입력 화소 값, y : 출력 화소 값 일때, 직선 방정식은 아래와 같다. y = 255 - x
1. GrayScale Image Invert
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { Mat grayImg = imread("lenna.jpg", IMREAD_GRAYSCALE); imshow("GrayScale", grayImg); Mat dst = 255 - grayImg; // 반전 처리 imshow("Inverted", dst); waitKey(0); return 0; }
실행 화면
2. Color Image Invert
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { Mat colorImg = imread("lenna.jpg"); imshow("Color", colorImg); for (int r = 0; r < colorImg.rows; r++) { for (int c = 0; c < colorImg.cols; c++) { for (int type = 0; type < 3; type++) { colorImg.at<Vec3b>(r, c)[type] = 255 - colorImg.at<Vec3b>(r, c)[type]; } } } imshow("Inversed", colorImg); }
실행 화면
임계값(threshold)을 기준으로 명암값을 흑(0)과 백(255) 中 하나로 결정하는 방법
✔ 이진화 threshold() : Open CV
threshold(src, dst, thresh, maxVal, type) // 반드시 입력영상 src는 1채널(8bit || 32-bit floating point) // thresh : 임계값 // type : 이진화 종류
> type 종류
✔ 주로 이진화 작업할 때 <THRESH_BINARY> type! (threshold 보다 작을 때 → 0, 클 때 → 255) ✔ 일반 이진화와 반대 작업을 원할 때, <THRESH_BINAEY_INV> 사용 (threshold 보다 클 때 → 0, 작을 때 → 255)
1. THRESH_BINARY (GrayScale)
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { Mat src = imread("Lenna.jpg", IMREAD_GRAYSCALE); imshow("GrayScale", src); Mat dst; int threshold_value = 127; threshold(src, dst, threshold_value, 255, THRESH_BINARY); imshow("Threshold", dst); }
실행 화면
2. THRESH_BINARY_INV (GrayScale)
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { Mat src = imread("Lenna.jpg", IMREAD_GRAYSCALE); imshow("GrayScale", src); Mat dst; int threshold_value = 127; threshold(src, dst, threshold_value, 255, THRESH_BINARY_INV); imshow("Threshold", dst); }
실행 화면
3. Color Image Binaryzation
threshold()는 1채널 src image에 대해 잘 작동하는데, 만일 3개의 채널을 가진 Color image를 이진화 시키고 싶다면 어떻게 해야할까? ⓐ b, g, r값을 모두 더해 3으로 나눠 평균 값을 구해 1채널 src이미지를 만든다. ⓑ 1채널 image를 src로 threshold() 함수 사용
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { Mat src = imread("Lenna.jpg"); imshow("GrayScale", src); Mat dst(src.rows, src.cols, CV_8U); int threshold_value = 127; for (int r = 0; r < src.rows; r++) { for (int c = 0; c < src.cols; c++) { double rgb = src.at<Vec3b>(r, c)[0] + src.at<Vec3b>(r, c)[1] + src.at<Vec3b>(r, c)[2]; dst.at<uchar>(r, c) = (rgb) / 3; } } threshold(dst, dst, threshold_value, 255, THRESH_BINARY); imshow("Threshold", dst); }
실행 화면
lenna.jpg (400 x 400)