ISP(with opencv) c++ #1

천동민·2023년 5월 27일
0
post-thumbnail

c++와 opencv를 이용한 영상처리

visual studio에 opencv를 설치하여 진행했다.

  1. 히스토그램 표현하기

밝기 분포를 계산하시오 : 히스토그램
int arr[5] = {2,3,2,2,3}
hist[0] |
hist[1] |
hist[2] |= = =
hist[3] |= =
hist[4] |
int* pArr =arr;
pArr[0] |
pArr[1] |
pArr[2] |= = =
pArr[3] |= =
pArr[4] |

위 이미지의 히스토그램을 표현해보았다

#pragma once
#include "../Common/Common.h"

int main()
{
	
	string fileName = "jetson.bmp";	
	Mat gray_img = cv::imread(fileName, cv::ImreadModes::IMREAD_GRAYSCALE);		

	uchar* pData = gray_img.data; //시작
	size_t width = gray_img.cols;
	size_t height = gray_img.rows;
	int histo[256] = {0,};
	for (size_t i = 0; i < 256; i++)
	{
		for (int j = 0; j <width*height; j++)
		{
			if (int(pData[j]) == i)
			{
				histo[i] += 1;
			}
		}		
	}
	for (int i = 0; i <256; i++)
	{
		cout << "[" << i << "]"<<": ";
		for (int j = 0; j < histo[i]; j++)
		{
			cout << "=";
		}
		cout << endl;
	}
	return 1;
}


위 사진과 같이 콘솔 창에 모든 결과 값이 표현되지 못한다.
그렇기 때문에 정규화(normalization)를 해주었다.

#pragma once
#include "../Common/Common.h"

int* normalization(int* pHisto, size_t data_len, int& new_min, int& new_max)
{
	int Histo_norm[256] = { 0, };
	int A = 1;
	int B = 100;

	for (int i = 0; i < data_len; i++)
	{
		Histo_norm[i] = A + ((pHisto[i] - new_min) * (B - A)) / (new_max - new_min);
	}

	return Histo_norm;
}


void histoDisplay(uchar* pData, size_t& width, size_t& height)
{
	cout << (int)pData[0] << endl;

	//typedef unsigned char uchar; 256
	int size = sizeof(uchar);//pData[0]...0~255 sizeof(uchar)..BYTE
	const int histSize = 256;
	int histo[histSize] = { 0, };//?? size - 10, 100??
	int Histo_Norm[histSize] = { 0, };
	int new_histo[256] = { 0, };
	int A = 1;
	int B = 100;

	for (size_t i = 0; i < width * height; i++)
	{
		histo[pData[i]]++;
	}
	int min = histo[0];
	int max = histo[0];
	for (size_t i = 1; i < 256; i++)
	{
		if (histo[i] <= min)
		{
			min = histo[i];
		}
		if (histo[i] >= max)
		{
			max = histo[i];
		}
		else
			continue;
	}
	int* pn;


	for (size_t i = 0; i < histSize; i++)
	{
		pn = normalization(histo, 256, min, max);
		int count = pn[i];
		string tt(count, '=');
		//string tt = " ";
		//for (size_t d = 0; d < count; d++)
		//{
		//	tt += "=";
		//}
		cout << i << "\t" << "|" << tt << " :: " << histo[i] << endl;
	}

}


int main()
{
	string fileName = "jetson.bmp"; // 소스파일과 같은 경로에 있는 이미지 파일
	Mat gray_img = cv::imread(fileName, cv::ImreadModes::IMREAD_GRAYSCALE);	
	
	uchar* pData = gray_img.data; //시작
	size_t width = gray_img.cols;
	size_t height = gray_img.rows;
	int histo[256] = {0,};
	

	histoDisplay(pData, width, height);


	return 1;
}

정규화를 통해 모든 값이 콘솔 창에 모두 표현되게 했다.

0개의 댓글