@[TOC](
利用图像HSV实现一张图片中各颜色占比
)
一个朋友需要得到一组照片里的颜色占比数据,在网上找了很多代码,第一次是通过RGB来实现颜色的分类,但是差异很大,第二次朋友又说可以从图像的HSV来识别吗,所以本文分别给出RGB和HSV两种识别方法。以供大家交流使用。
一、利用RGB来实现多张图片中颜色占比(效果不太好)
#include "stdio.h"
#include<iostream>
#include<opencv2/opencv.hpp>
#include<iomanip>
#include<cmath>
#include<string>
using namespace std;
using namespace cv;
int main()
{
const int num =157;//在D:\\test_picture\\%d.png中你要处理的图片数量
char fileName[50];
char windowName[50];
Mat image;
float rateyellow; //要计算的百分率
float ratered;
float rategrey;
float ratewhite;
float rateblack;
cout << "序号" << "\t" << "黄色区域占比" << "\t" << "红色区域占比" << "\t" << "灰色区域占比""\t" << "白色区域占比""\t" << "黑色占比" << endl;
for (int k = 1; k <= num; k++){
//sprintf读入指定路径下的图片序列
sprintf_s(fileName, "D:\\test_picture\\%d.png", k);
sprintf_s(windowName, "No%d", k);
//按照图像文件名读取
image = imread(fileName);
int numOfyellow = 0;
int numOfred = 0;
int numOfgrey = 0;
int numOfwhite = 0;
int numOfblack = 0;
for (int i = 0; i < image.rows; i++)
{
for (int j = 0; j <image.cols; j++) //遍历图片的每一个像素点
{
if ((image.at<Vec3b>(i, j)[0] <= 120 && image.at<Vec3b>(i, j)[1] >= 170 && image.at<Vec3b>(i, j)[2] >= 230)
|| (image.at<Vec3b>(i, j)[0]>120 && image.at<Vec3b>(i, j)[0] <= 180 && image.at<Vec3b>(i, j)[1] >= 180 &&
image.at<Vec3b>(i, j)[2] >= 220)){
//对该像素是否为黄色进行判断
numOfyellow++;
}
if (image.at<Vec3b>(i, j)[0] <= 60 && image