[HCI] 08. 화소 처리 : 영상 반전, 이진화, 감마보정

19205 단어 OPEN CVOPEN CV

✔ 영상 반전(Image Invert)

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);
}
실행 화면

✔ 영상 이진화(Image Binaryzation)

임계값(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);
}
실행 화면

✔ Test Image

lenna.jpg (400 x 400)

좋은 웹페이지 즐겨찾기