C++ 을 이용한 OpenCV(4)

런치·2023년 9월 27일
0

C++

목록 보기
10/14
post-thumbnail

색상 변경 ( COLOR -> GRAYSCALE)

#pragma once
#include<opencv2/opencv.hpp>
static cv::Mat getGrayHistImage(const cv::Mat& hist);
static cv::Mat calcGrayHist(const cv::Mat& hist);
void example() {
	cv::Mat img1 = cv::imread("lenna.bmp");
	cv::Mat img2;
	cv::cvtColor(img1, img2, cv::COLOR_BGR2GRAY); //BGR -> GRAYSCALE
	cv::imshow("IMG1", img1);
	cv::imshow("IMG2", img2);
	cv::waitKey();
	cv::destroyAllWindows();

}

밝기 조절

void brightness() {
	cv::Mat src = cv::imread("lenna.bmp", cv::IMREAD_GRAYSCALE);
	if (src.empty()) return;
	cv::Mat dst(src.rows,src.cols,src.type());
	for (int i = 0; i < src.rows; ++i) {
		for (int j = 0; j < src.cols; ++j) {
			/*uchar temp1 = src.at<uchar>(i, j);
			int temp2 = temp1 + 100;
			if (temp2 > 255) temp2 = 255;
			dst.at<uchar>(i, j) = static_cast<uchar>(temp2);*/
			//or
			//dst.at<uchar>(i, j) = cv::saturate_cast<uchar>(src.at<uchar>(i, j) + 100);
			//int temp = src.at<uchar>(i, j) + 100;
			//dst.at<uchar>(i, j) = temp > 255 > 255 temp < 0 ? 0 : temp;
			dst.at<uchar>(i, j) = src.at<uchar>(i, j) + 100;
		}
	}
	cv::Mat dst2 = src + 100;

	cv::imshow("SRC", src);
	cv::imshow("DST2", dst2);
	cv::imshow("DST", dst);
	cv::waitKey();
	cv::destroyAllWindows();
}

밝기 대조

void contrast() {
	cv::Mat src = cv::imread("lenna.bmp", cv::IMREAD_GRAYSCALE);
	float alpha = 1.0f;
	cv::Mat dst = ((1 + alpha) * src - 128 * alpha);
	cv::imshow("SRC", src);
	cv::imshow("DST", dst);
	cv::waitKey();
	cv::destroyAllWindows();
}

히스토그램 사용

void show_hist() {
	cv::Mat src = cv::imread("hawks.bmp", cv::IMREAD_GRAYSCALE);
	if (src.empty()) return;
	cv::Mat hist1 = calcGrayHist(src);
	cv::Mat hist_img = getGrayHistImage(hist1);
	cv::imshow("HISTOGRAM", hist_img);
	cv::imshow("SRC", src);
	cv::waitKey();
	cv::destroyAllWindows();
}
cv::Mat calcGrayHist(const cv::Mat& img) {
	cv::Mat hist;
	int channels[] = { 0 };
	int dims = 0;
	int histsize[] = { 256 };
	float graylevel[] = { 0, 256 };
	const float* ranges[] = { graylevel };
	cv::calcHist(&img, 1, channels, cv::noArray(), hist,dims, histsize, ranges);
	return hist;
}

cv::Mat getGrayHistImage(const cv::Mat& hist) {
	double histMax;
	cv::minMaxLoc(hist, 0, &histMax);
	cv::Mat imgHist(100, 250, CV_8UC1, cv::Scalar(255));
	for (int i = 0; i < 256; ++i) {
		cv::line(imgHist, cv::Point(i, 100),\
			cv::Point(i,100 - cvRound(hist.at<float>(i, 0) * 100 / histMax)), cv::Scalar(0));
	}
	return imgHist;
}
void histogram_stretching() {
	cv::Mat src = cv::imread("hawkes.bmp", cv::IMREAD_GRAYSCALE);
	if (src.empty()) return;
	double min = 0.0;
	double max = 0.0;
	cv::minMaxLoc(src, &min, &max);
	cv::Mat dst = ((src - min) / (max - min)) * 255;
	cv::Mat hist1 = calcGrayHist(src);
	cv::Mat hist_img = getGrayHistImage(hist1);
	cv::imshow("SRC", src);
	cv::imshow("DST", dst);
	cv::imshow("HISTOGRAM", hist_img);
	cv::imshow("DST_IMG", getGrayHistImage(calcGrayHist(dst)));
	cv::waitKey();
	cv::destroyAllWindows();
}
profile
점심을 안먹음

0개의 댓글