색상 변경 ( 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);
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) {
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();
}