[Intel AI SW 아카데미] 영상처리 - 이미지 히스토그램

Jimeaning·2023년 11월 3일
0

Intel AIoT

목록 보기
12/38

23.11.3 (금) 32일차

영상처리 비전 (C++ 기반)

  1. Image J 다운받기
  2. OpenCV 다운받기 (23.11.3 기준 버전 4.8.0)

이미지 불러오기

(보기 > 다른 창 > Image Watch)

#pragma once
#include "Common.h"

int main()
{
	std::string fileName = "../KCCImageNet/stop_img.png";
	cv::Mat src = cv::imread(fileName, cv::ImreadModes::IMREAD_ANYCOLOR);

	return 1;
}

빈도수 출력하기

#pragma once
#include "Common.h"

int main()
{
	const int length = 3 * 3;
	int datas[length] = { 5, 3, 1, 4, 6, 4, 8, 4, 3 };
	int counts[length] = { 0, };

	int _max_count_val = -1;
	int _min_count_val = 1000;

	for (size_t i = 0; i < length; i++)
	{
		counts[datas[i]]++;
		if (_max_count_val < counts[datas[i]]) _max_count_val = counts[datas[i]];
		if (_min_count_val > counts[datas[i]]) _min_count_val = counts[datas[i]];
	}

	for (size_t i = 0; i < length; i++)
	{
		if (_max_count_val == counts[i])
			cout << "가장 많은 빈도 값: " << i << " ... " << counts[i] << endl;
	}

	for (size_t i = 0; i < length; i++)
	{
		if (_min_count_val == counts[i])
			cout << "가장 적은 빈도 값: " << i << " ... " << counts[i] << endl;
	}
	return 1;
}

히스토그램 출력하기

#pragma once
#include "Common.h"

int main()
{
	std::string fileName = "../KCCImageNet/stop_img.png";
	cv::Mat src = cv::imread(fileName, cv::ImreadModes::IMREAD_GRAYSCALE);

	uchar* pData = src.data; // data array
	int length = src.total(); // data length

	int counts[256] = { 0, };
	int _max_count_val = -1;
	float nrm;

	for (size_t i = 0; i < length; i++)
	{
		counts[pData[i]]++;
		if (_max_count_val < counts[pData[i]]) _max_count_val = counts[pData[i]];
	}

	for (size_t i = 0; i < 256; i++)
	{
		cout << i << " | ";
		nrm = counts[i] * 1.0 / _max_count_val * 100;
		for (size_t j = 0; j < nrm; j++)
		{
			cout << "=";
		}
		cout << endl;
	}
    
    return 1;

}

이미지 크기 동적 할당하기

const int histoSz = 256; // sizeof(uchar);
int counts[histoSz] = { 0, };
int* pHisto = new int[length];

영상 위에 히스토그램 그리기

#pragma once
#include "Common.h"

int main()
{
	std::string fileName = "../KCCImageNet/stop_img.png";
	cv::Mat src = cv::imread(fileName, cv::ImreadModes::IMREAD_GRAYSCALE);
	resize(src, src, Size(src.cols * 2, src.rows * 2));

	uchar* pData = src.data; // data array
	int length = src.total(); // data length
	int channels = src.channels();
	// length *= channels;

	const int histoSz = 256; // sizeof(uchar);
	int histo[histoSz] = { 0, };
	// int* pHisto = new int[length];
	
	for (size_t i = 0; i < length; i++)
	{
		histo[pData[i]]++;
	}

	int size = src.rows * src.cols;
	auto result = minmax_element(pData, pData + length);
	double mean_brightness = mean(src)[0];
	auto _minmax = minmax_element(histo, histo + histoSz);
	int _min_value = *_minmax.first;
	int _max_value = *_minmax.second;

	string strLine;
	for (size_t row = 0; row < histoSz; row++)
	{
		strLine = "";
		strLine += to_string(row);
		strLine += ("    || ");

		int scaled_cols = (histo[row]*1.0 / _max_value) * 100;
		for (size_t col = 0; col < scaled_cols; col++)
		{
			strLine += ("=");
		}
		cout << strLine << endl;
	}

	Mat draw = src.clone();
	cvtColor(draw, draw, ColorConversionCodes::COLOR_GRAY2BGR);
	for (size_t row = 0; row < histoSz; row++)
	{
		int scaled_cols = (histo[row] * 1.0 / _max_value) * 100;
		Point st = Point(0, row*2.7);
		Point ed = Point(scaled_cols, row*2.7);
		line(draw, st, ed, CV_RGB(255, 255, 0));
	}

	int a = 0;

	return 1;
}
profile
I mean

0개의 댓글