图像RGB个通道像素点统计
最近项目需要统计图像RGB各个通道像素点个数的分布,写了这样一个小的程序。
主要是对之前写的东西的一些整合,格式输出是看到opencv自带的分类器训练过程中,命令窗内的输出格式很舒服,所以进行了模仿。
实现的主要功能:
- 从目录中逐一读取图片
- 对图像的三个通道进行统计
- 将统计结果格式输出到txt
其他不多说了,直接贴代码了:
代码下载地址:这里写链接内容
#include <iostream>
#include "opencv2/opencv.hpp"
#include "fstream"
#include <windows.h>
using namespace std;
using namespace cv;
int calMax(int count[10])
{
int max = count[0];
int max_num = 0;
for (int i = 1; i < 10; ++i)
{
if (count[i]>max)
{
max = count[i];
max_num = i;
}
}
return max_num;
}
void statisticOfRgb(Mat src)
{
ofstream out("test.txt", ios::app);
int count_r[10] = {0};//store 10 intervals' counts
int count_g[10] = {0};
int count_b[10] = {0};
int count = 0;//total pixels' count
int row = src.rows;
int col = src.cols;
//get r g b of every pixel
for (int i = 0; i < row; ++i)
{
uchar *p = src.ptr<uchar>(i);
for (int j = 0; j < col; ++j)
{
int b = p[j * 3];
int g = p[j * 3 + 1];
int r = p[j * 3 + 2];
int index_b = ceil(b / 25);
int index_g = ceil(g / 25);
int index_r = ceil(r / 25);
if (index_b >= 0 && index_b <= 9 && index_g >= 0 && index_g <= 9 && index_r >= 0 && index_r <= 9)
{
count_b[index_b]++;
count_g[index_g]++;
count_r[index_r]++;
}
count++;
}
}
//calculate max
int max_b_num = calMax(count_b);
int max_g_num = calMax(count_g);
int max_r_num = calMax(count_r);
char b_string[10] = { 0 };
sprintf(b_string, "%ld-%ld", max_b_num*25,(max_b_num+1)*25);
char g_string[10] = { 0 };
sprintf(g_string, "%ld-%ld", max_g_num * 25, (max_g_num + 1) * 25);
char r_string[10] = { 0 };
sprintf(r_string, "%ld-%ld", max_r_num * 25, (max_r_num + 1) * 25);
//out put
for (int i = 0; i < 88; i++)
{
out << "-";
}
out << endl;
//count
out << count << " " << "b_max: " << b_string << " " << "g_max: " << g_string << " " << "r_max: " << r_string << endl;
//b
for (int i = 0; i < 88; i++)
{
out << "-";
}
out << endl;
out<<"|" << "b" <<" "<< "|";
for (int i = 0; i < 10; i++)
{
out << count_b[i]<<" ";
int space_count;
if (count_b[i] == 0)
{
space_count = 5;
}
else
{
int n=0;
while (count_b[i] >= 10)
{
n++;
count_b[i] = count_b[i] / 10;
}
space_count = 5 - n;
}
for (int j = 0; j < space_count; j++)
{
out << " ";
}
out << "|";
}
out << endl;
//g
for (int i = 0; i < 88; i++)
{
out << "-";
}
out << endl;
out << "|" << "g" << " " << "|" ;
for (int i = 0; i < 10; i++)
{
out << count_g[i] << " ";
int space_count;
if (count_g[i] == 0)
{
space_count = 5;
}
else
{
int n = 0;
while (count_g[i] >= 10)
{
n++;
count_g[i] = count_g[i] / 10;
}
space_count = 5 - n;
}
for (int j = 0; j < space_count; j++)
{
out << " ";
}
out << "|";
}
out << endl;
//r
for (int i = 0; i < 88; i++)
{
out << "-";
}
out << endl;
out << "|" << "r" << " " << "|";
for (int i = 0; i < 10; i++)
{
out << count_r[i] << " ";
int space_count;
if (count_r[i] == 0)
{
space_count = 5;
}
else
{
int n = 0;
while (count_r[i] >= 10)
{
n++;
count_r[i] = count_r[i] / 10;
}
space_count = 5 - n;
}
for (int j = 0; j < space_count; j++)
{
out << " ";
}
out << "|";
}
out << endl;
}
int main()
{
WIN32_FIND_DATAA FileData;
HANDLE hFind;
hFind = FindFirstFileA((LPCSTR)"E:\\2016年11月\\20161122\\statisticsOfPoint\\statisticsOfPoint\\1\\*.jpg", &FileData);
if (hFind == INVALID_HANDLE_VALUE)
{
printf("Invalid File Handle. GetLastError reports %d\n", GetLastError());
return 0;
}
do
{
string path = "E:\\2016年11月\\20161122\\statisticsOfPoint\\statisticsOfPoint\\1\\";
path += FileData.cFileName;
Mat src = imread(path.c_str(), 1);
statisticOfRgb(src);
} while (FindNextFileA(hFind, &FileData));
return 0;
}
输出效果如下图:
![这里写图片描述](http://img.blog.csdn.net/20161123103832119)