Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
관리 메뉴

어제보다 나은 내가 되자

히스토그램 스트레칭 본문

영상처리

히스토그램 스트레칭

rudruddl 2020. 5. 14. 00:49
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

Mat calcGrayHist(const Mat& img);
Mat getGrayHistImage(const Mat& hist);

int main() {
	Mat src = imread("hawkes.bmp", IMREAD_GRAYSCALE);

	double gmin, gmax;
	minMaxLoc(src, &gmin, &gmax); // 최소값은 gmin에 저장, 최대값은 gmax에 저장

	Mat dst = (src - gmin) * 255 / (gmax - gmin);

	imshow("src", src);
	imshow("srcHist", getGrayHistImage(calcGrayHist(src)));

	imshow("dst", dst);
	imshow("dstHist", getGrayHistImage(calcGrayHist(dst)));
	waitKey();
	return 0;
}

Mat calcGrayHist(const Mat& img)
{
	CV_Assert(img.type() == CV_8UC1);

	/* calc histogram */
	Mat hist;
	int channels[] = { 0 }; // grayscale
	int dims = 1; // 1차원
	const int histSize[] = { 256 }; // 256개의 빈
	float graylevel[] = { 0,256 }; // 0~255
	const float* ranges[] = { graylevel };

	calcHist(&img, 1, channels, noArray(), hist, dims, histSize, ranges);

	return hist;
}

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

	/* draw histogram */
	double histMax;
	minMaxLoc(hist, 0, &histMax); // 계산한 hist 행렬에서 최대값을 histMax에 저장

	Mat imgHist(100, 256, CV_8UC1, Scalar(255)); // 흰색으로 초기화한 256x100 크기의 영상 생성
	for (int i = 0; i < 256; i++) {
		line(imgHist, Point(i, 100),
			Point(i, 100 - cvRound(hist.at<float>(i, 0) * 100 / histMax)), Scalar(0));
	}

	return imgHist;
}

 

'영상처리' 카테고리의 다른 글

필터링  (0) 2020.05.18
히스토그램 평활화  (0) 2020.05.14
히스토그램 그리기  (0) 2020.05.14
모든 픽셀을 방문하여 밝기 변화하기  (0) 2020.05.13
그레이 스케일 영상 확인  (0) 2020.05.13
Comments