점점 어려워지는데 해당 파트 이해가 안되면 다시 보고, 정 안되면 그냥 갖다 사용하는 걸로하자

#include <iostream>
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

void hist1() {
	Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);

	if (src.empty()) {
		cerr << "Image laod failed!" << endl;
		return;
	}
	//히스토그램 
	int hist[256]{}; 
	for (int y = 0; y < src.rows; ++y) {
		for (int x = 0; x < src.cols; ++x) {
			hist[src.at<uchar>(y, x)]++;
		}
	}

	//정규화된 히스토그램
	int size = (int)src.total();
	float nhist[256]{};
	for (int x = 0; x < 256; ++x) {
		nhist[x] = (float)hist[x] / size;  // 히스토그램 모든 성분/ 히스토그램 사이즈
	}
	//히스토그램 그래프 그리기
	int histMax = 0;
	for (int x = 0; x < 256; ++x) {
		if (hist[x] > histMax)histMax = hist[x];
	}

	Mat imgHist(100, 256, CV_8UC1, Scalar(255));  //256x100 크기 영상
	for (int x = 0; x < 256; ++x) {
		line(imgHist, Point(x, 100), Point(x, 100 - cvRound(hist[x] * 100 / histMax)), Scalar(0));
	} //히스토그램 막대그래프 최대길이는 100픽셀.

	imshow("src", src);
	imshow("hist", imgHist);
	waitKey();
}

Mat getGrayHistImage(const Mat&hist) {
	CV_Assert(hist.type() == CV_32FC1);
	CV_Assert(hist.size() == Size(1, 256));

	double histMax = 0;
	minMaxLoc(hist, 0, &histMax);

	Mat imgHist(100, 256, CV_8UC1, Scalar(255));  //256x100 크기 영상
	for (int x = 0; x < 256; ++x) {
		line(imgHist, Point(x, 100), Point(x, 100 - cvRound(hist.at<float>(x,0) * 100 / histMax)), Scalar(0));
	} //히스토그램 막대그래프 최대길이는 100픽셀.
	return imgHist;
}
Mat calcGrayHist(const Mat& img) {  //기억해서 필요 시 복사해서 사용하자..
	CV_Assert(img.type() == CV_8UC1);

	Mat hist;
	int channels[] = { 0, };
	int dims = 1;
	const int histSize[] = { 256 };
	float graylevel[] = { 0,256 };
	const float* ranges[] = { graylevel };

	calcHist(&img, 1, channels, Mat(), hist, dims, histSize, ranges);
	//ranges: graylevel 배열이름을 원소로 갖는 배열

	return hist; 
}
void hist2() {
	//Mat src = imread("lenna.bmp",IMREAD_GRAYSCALE);
	//Mat src = imread("columbia.bmp", IMREAD_GRAYSCALE);
	Mat src = imread("camera.bmp", IMREAD_GRAYSCALE);

	// 0~255.   좌측에 빈도가 많을시  0에 가까운 픽셀값들이 많다는것
	if (src.empty()) {
		cerr << "Img load failed!" << endl;
		return;
	}
	Mat hist = calcGrayHist(src);
	Mat imgHist = getGrayHistImage(hist);

	imshow("src", src);
	imshow("hist", imgHist);
	waitKey();
}
int main()
{
	//hist1();
	hist2();
	//영상 밝기에 따라 낮을 시 좌측  높을 시 우측 쪽에 좀 더 치우쳐져있다.

	//명암비가 높으면 히스토그램이 넓게  작으면 히스토그램이 좁게 형성된다
}

'프로그래머스 > OPENCV' 카테고리의 다른 글

영상의 산술 및 논리연산  (0) 2022.12.02
(4-2) 히스토그램분석  (0) 2022.12.02
영상의 명암비 조절  (0) 2022.12.01
영상의 밝기조절(2)  (3) 2022.12.01
영상의 밝기 조절(1)  (0) 2022.12.01

+ Recent posts