c++와 opencv를 이용한 영상처리
visual studio에 opencv를 설치하여 진행했다.
- 히스토그램 표현하기
밝기 분포를 계산하시오 : 히스토그램
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;
}
정규화를 통해 모든 값이 콘솔 창에 모두 표현되게 했다.