#pragma once
#include "dowith.h"
// 本函数用来统计图像中的三种颜色的直方图
void getColorHis(Mat& src, int colorCountBlue[], int colorCountGreen[],
int colorCountRed[])
{
int size = src.rows * src.cols * src.channels(); // 获得图像中序列中的像素的个数
//int imageDataSize = src.rows * src.cols;
memset(colorCountBlue, 0, COLORCOUNT * sizeof(int)); // 对数组进行初始化
memset(colorCountGreen, 0, COLORCOUNT * sizeof(int)); // 对数组进行归零初始化
memset(colorCountRed, 0, COLORCOUNT * sizeof(int)); // 对数组进行归零初始化
for(int i = 0; i < size; i += 3)
{
colorCountBlue[src.data[i]]++;
colorCountGreen[src.data[i+1]]++;
colorCountRed[src.data[i+2]]++;
}
}
// 获得直方图中的最大值
unsigned char getMaxColor(int colorCount[])
{
unsigned char size = COLORCOUNT - 1;
//unsigned char = size;
while (!colorCount[size])
{
size--;
}
return size;
}
// 获得直方图中的最小值
unsigned char getMinColor(int colorCount[])
{
unsigned char size = 0;
while(!colorCount[size])
{
size++;
}
return size;
}
// 返回直方图的中间值 (以图像中像素点的个数为比例)
unsigned char getMidColor(int colorCount[], int count)
{
int mind = count / 2;
int temp = 0;
unsigned char mindColor = 0;
// 进行遍历进行统计机图形的点的个数
for(mindColor = 0; temp < mind; mindColor ++)
{
temp += colorCount[mindColor];
}
return mindColor;
}
// 根据最大和最小的获取中间点
//
unsigned char getMidColor(int colorCount[], unsigned char minColor,
unsigned char maxColor)
{
int tempCount = 0;
int mindCount = 0;
unsigned char tempColor = minColor;
for(tempColor = minColor; tempColor < maxColor; tempColor ++)
{
tempCount += colorCount[tempColor];
}
mindCount = tempCount / 2;
tempCount = 0;
for(tempColor = minColor;tempCount < mindCount; tempColor ++)
{
tempCount += colorCount[tempColor];
}
return tempColor;
}
// 图像分割的算发
// 存在问题,就是关于中间的点的获得
void splitColorBox(ColorBox srcColorBox, ColorBox& tempBox_A,
ColorBox& tempBox_B, SPLITTYPE splitType)
{
tempBox_A = srcColorBox;
tempBox_B = srcColorBox;
switch(splitType)
{
case COLOR_BLUE:
{
tempBox_A.maxB = srcColorBox.mindB;
tempBox_B.minB = srcColorBox.mindB;
getMaxDis(tempBox_A); // 获得颜色中的最大的颜色的轴距
getMaxDis(tempBox_B); //
}
break;
case COLOR_GREEN:
{
tempBox_A.maxG = srcColorBox.mindG;
tempBox_B.minG = srcColorBox.mindG;
getMaxDis(tempBox_A);
getMaxDis(tempBox_B);
}
break;
case COLOR_RED:
{
tempBox_A.maxR = srcColorBox.mindR;
tempBox_B.minR = srcColorBox.mindR;
getMaxDis(tempBox_A);
getMaxDis(tempBox_B);
}
break;
}
}
// 获取颜色的最大轴距
//
//
void getMaxDis(ColorBox& srcColorBox)
{
unsigned char tempB = srcColorBox.maxB - srcColorBox.minB;
unsigned char tempG = srcColorBox.maxG - srcColorBox.minG;
unsigned char tempR = srcColorBox.maxR - srcColorBox.minR;
if(tempB >= tempG)
{
if(tempB >= tempR)
{
srcColorBox.maxDisColor = tempB;
srcColorBox.splitType = COLOR_BLUE;
}
else
{
srcColorBox.maxDisColor = tempR;
srcColorBox.splitType = COLOR_RED;
}
}
else
{
if(tempG > tempR)
{
srcColorBox.maxDisColor = tempG;
srcColorBox.splitType = COLOR_GREEN;
}
else
{
srcColorBox.maxDisColor = tempR;
srcColorBox.splitType = COLOR_RED;
}
}
}
void initColorBox(int color_B[], int color_G[], int color_R[],
ColorBox& srcColorBox)
{
srcColorBox.maxB = getMaxColor(color_B);
srcColorBox.minB = getMinColor(color_B);
srcColorBox.maxG = getMaxColor(color_G);
srcColorBox.minG = getMinColor(color_G);
srcColorBox.maxR = getMaxColor(color_R);
srcColorBox.minR = getMinColor(color_R);
completeColorBox(color_B, color_G, color_R, srcColorBox);
}
// 完善这个这颜色盒子
void completeColorBox(int color_B[], int color_G[], int color_R[],
ColorBox& srcColorBox)
{
srcColorBox.mindB = getMidColor(color_B, srcColorBox.minB, srcColorBox.maxB);
srcColorBox.mindG = getMidColor(color_G, srcColorBox.minG, srcColorBox.maxG);
srcColorBox.mindR = getMidColor(color_R, srcColorBox.minR, srcColorBox.maxR);
getMaxDis(srcColorBox);
}
// 检测颜色是不在颜色盒子中
bool checkColorIsInTheBox(ColorBox srcColorBox, Color color)
{
return (color.B >= srcColorBox.minB && color.B <= srcColorBox.maxB
&& color.G >= srcColorBox.minG && color.G <= srcColorBox.maxG
&& color.R >= srcColorBox.minR && color.R <= srcColorBox.maxR);
}