점점 어려워지는데 해당 파트 이해가 안되면 다시 보고, 정 안되면 그냥 갖다 사용하는 걸로하자
#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 |