获取蓝色在图片中所占百分比

  • 思路
    • 代码
    • 运行结果
    • 测试图片

思路

由于每种颜色都有一个阈值,单纯的计算RGB百分比的效果并不好,对于这点,网上已经有很多结论。于是,我想到采用hsv空间下每个像素点分量,获取某种颜色所占百分比(我这里采用的是蓝色)。因为,在hsv空间下,相近颜色都会被归于一个范围。所以,我们可以比较相近颜色,在图片中,所占百分比。

代码

#include <iostream>
#include <opencv2/opencv.hpp>
#include <iomanip>
#include <cmath>
#include <string>
#include <opencv2/highgui/highgui_c.h>
#include <unordered_map>
#include <vector>
using namespace std;
using namespace cv;
//struct Triple
//{//    char col[_MAX_PATH];
//    int h_min;
//    int s_min;
//    int v_min;
//    int h_max;
//    int s_max;
//    int v_max;
//};
/*
区分不同颜色,在图片中所占百分比
*/
unordered_map<string,float> hsv_percentage(Mat hsv_image) {int num_black = 0;int num_grey = 0;int num_white = 0;int num_red = 0;int num_orange = 0;int num_yellow = 0;int num_green = 0;int num_blue = 0;int num_purple = 0;//vector<float> record(9,0);unordered_map<string, float> record;float area = (float)(hsv_image.rows * hsv_image.cols);for (int i = 0; i < hsv_image.rows; i++) //行数{for (int j = 0; j < hsv_image.cols; j++)   //列数{//在这里操作具体元素//{"black", 0, 0, 0, 180, 255, 46}if ((hsv_image.at<Vec3b>(i, j)[0] >= 0 && hsv_image.at<Vec3b>(i, j)[0] <= 180)&& (hsv_image.at<Vec3b>(i, j)[1] >= 0 && hsv_image.at<Vec3b>(i, j)[1] <= 255)&& (hsv_image.at<Vec3b>(i, j)[2] >= 0 && hsv_image.at<Vec3b>(i, j)[2] <= 46)) {num_black++;}//{ "grey",0,0,46,180,43,220 }else if ((hsv_image.at<Vec3b>(i, j)[0] >= 0 && hsv_image.at<Vec3b>(i, j)[0] <= 180)&& (hsv_image.at<Vec3b>(i, j)[1] >= 0 && hsv_image.at<Vec3b>(i, j)[1] <= 43)&& (hsv_image.at<Vec3b>(i, j)[2] >= 46 && hsv_image.at<Vec3b>(i, j)[2] <= 220)) {num_grey++;}// { "white",0,0,221,180,30,255 }else if ((hsv_image.at<Vec3b>(i, j)[0] >= 0 && hsv_image.at<Vec3b>(i, j)[0] <= 180)&& (hsv_image.at<Vec3b>(i, j)[1] >= 0 && hsv_image.at<Vec3b>(i, j)[1] <= 30)&& (hsv_image.at<Vec3b>(i, j)[2] >= 221 && hsv_image.at<Vec3b>(i, j)[2] <= 255)) {num_white++;}//{ "red", 156, 43, 46, 180, 255, 255 }else if ((hsv_image.at<Vec3b>(i, j)[0] >= 156 && hsv_image.at<Vec3b>(i, j)[0] <= 180)&& (hsv_image.at<Vec3b>(i, j)[1] >= 43 && hsv_image.at<Vec3b>(i, j)[1] <= 255)&& (hsv_image.at<Vec3b>(i, j)[2] >= 46 && hsv_image.at<Vec3b>(i, j)[2] <= 255)) {num_red++;}else if ((hsv_image.at<Vec3b>(i, j)[0] >= 0&& hsv_image.at<Vec3b>(i, j)[0] <= 10)&& (hsv_image.at<Vec3b>(i, j)[1] >= 43 && hsv_image.at<Vec3b>(i, j)[1] <= 255)&& (hsv_image.at<Vec3b>(i, j)[2] >= 46 && hsv_image.at<Vec3b>(i, j)[2] <= 255)) {num_red++;}//{ "orange",11,43,46,25,255,255 }else if ((hsv_image.at<Vec3b>(i, j)[0] >= 11 && hsv_image.at<Vec3b>(i, j)[0] <= 25)&& (hsv_image.at<Vec3b>(i, j)[1] >= 43 && hsv_image.at<Vec3b>(i, j)[1] <= 255)&& (hsv_image.at<Vec3b>(i, j)[2] >= 46 && hsv_image.at<Vec3b>(i, j)[2] <= 255)) {num_orange++;}// { "yellow", 26, 43, 46, 34, 255, 255 }else if ((hsv_image.at<Vec3b>(i, j)[0] >= 26 && hsv_image.at<Vec3b>(i, j)[0] <= 34)&& (hsv_image.at<Vec3b>(i, j)[1] >= 43 && hsv_image.at<Vec3b>(i, j)[1] <= 255)&& (hsv_image.at<Vec3b>(i, j)[2] >= 46 && hsv_image.at<Vec3b>(i, j)[2] <= 255)) {num_yellow++;}//{ "green",35,43,46,99,255,255 },else if ((hsv_image.at<Vec3b>(i, j)[0] >= 35 && hsv_image.at<Vec3b>(i, j)[0] <= 99)&& (hsv_image.at<Vec3b>(i, j)[1] >= 43 && hsv_image.at<Vec3b>(i, j)[1] <= 255)&& (hsv_image.at<Vec3b>(i, j)[2] >= 46 && hsv_image.at<Vec3b>(i, j)[2] <= 255)) {num_green++;}//{ "blue",100,43,46,124,255,255 },else if ((hsv_image.at<Vec3b>(i, j)[0] >= 100 && hsv_image.at<Vec3b>(i, j)[0] <= 124)&& (hsv_image.at<Vec3b>(i, j)[1] >= 43 && hsv_image.at<Vec3b>(i, j)[1] <= 255)&& (hsv_image.at<Vec3b>(i, j)[2] >= 46 && hsv_image.at<Vec3b>(i, j)[2] <= 255)) {num_blue++;}//  { "purple",125,43,46,155,255,255 }else if ((hsv_image.at<Vec3b>(i, j)[0] >= 125 && hsv_image.at<Vec3b>(i, j)[0] <= 155)&& (hsv_image.at<Vec3b>(i, j)[1] >= 43 && hsv_image.at<Vec3b>(i, j)[1] <= 255)&& (hsv_image.at<Vec3b>(i, j)[2] >= 46 && hsv_image.at<Vec3b>(i, j)[2] <= 255)) {num_purple++;}}}record.insert(make_pair("black", (float)num_black / area));record.insert(make_pair("grey", (float)num_grey / area));record.insert(make_pair("white", (float)num_white / area));record.insert(make_pair("red", (float)num_red / area));record.insert(make_pair("orange", (float)num_orange / area));record.insert(make_pair("yellow", (float)num_yellow / area));record.insert(make_pair("green", (float)num_green / area));record.insert(make_pair("blue", (float)num_blue / area));record.insert(make_pair("purple", (float)num_purple / area));//(float)num / (float)(hsv_image.rows * hsv_image.cols);return record;
}
/*
在图片里查找指定颜色的比例
*/
void Mat_color_Find(string qimage)
{Mat image = imread(qimage);//将图片加载进来if (image.empty()){cout << "could not load image...\n" << endl;return;}Mat hsv_image;cvtColor(image, hsv_image, CV_BGR2HSV);unordered_map<string, float> temp = hsv_percentage(hsv_image);//rat = (float)num / (float)(hsv_image.rows * hsv_image.cols);for (auto it = temp.begin(); it != temp.end();it++) {cout << it->first << " " <<it->second << endl;}return;
}
int main(){/*struct Triple colour[9] ={{"black",0,0,0,180,255,46},{"grey",0,0,46,180,43,220},{"white",0,0,221,180,30,255},{"red",156,43,46,180,255,255},{"orange",11,43,46,25,255,255},{"yellow",26,43,46,34,255,255},{"green",35,43,46,99,255,255},{"blue",100,43,46,124,255,255},{"purple",125,43,46,155,255,255}};*/string s = "C:/Users/wenhaofu/Desktop/picture/2021-07-01.png";Mat_color_Find(s);//cout << blue_temp << endl;
}

运行结果

测试图片


获取其中各种颜色所占百分比

获取图片某种颜色所占百分比相关推荐

  1. java图片中各颜色占比_计算图片中某种颜色所占的面积比例 - Photoshop 方法

    时间:2013-11-20 23:17来源:未知 作者:PS314 点击: 5041 次关键词:混合色带 通常,我们仅需要图片显示视觉信息,不过有些时候,还需要对图片中的信息进行分析.如,需要获得照片 ...

  2. 获取图片像素颜色,转换为CSS3 box-shadow显示

    原理: 1.使用FileReader 读取图片 2.使用canvas 的 getImageData 获取图片像素信息 3.将像素信息转换为CSS3 box-shadow 代码: <!DOCTYP ...

  3. python获取图片的颜色信息

    python获取图片的颜色更多 0 getcolors 图片颜色 python image = Image.open("outofmemory.cn.png") image.get ...

  4. pytohn用Pillow或OpenCV删除图片某种颜色

    实际对图片进行处理的时候,经常会碰到单一颜色背景的情况,这时候就可以采用图像处理的方法,将该单一颜色去除,形成一个透明的图片.如果需要,还可以加上新的背景图,图片就焕然一新了. 删除图片某种颜色,Pi ...

  5. js获取图片像素颜色,修改图片像素颜色

    直接上代码示例 <!DOCTYPE HTML PUBLIC> <html><head><meta charset="utf-8">& ...

  6. python查看图片颜色统计_Python通过PIL获取图片主要颜色并和颜色库进行对比的方法...

    本文实例讲述了Python通过PIL获取图片主要颜色并和颜色库进行对比的方法.分享给大家供大家参考.具体分析如下: 这段代码主要用来从图片提取其主要颜色,类似Goolge和Baidu的图片搜索时可以指 ...

  7. python获取图片像素点颜色_Python获取图片位置像素色值及判断色值是否存在

    本文背景: 公司项目的广告系统有个功能,给图片模板打指定的颜色值点,根据需要拼合的图片数量,打点数量也不同.设计说他弄好了,运营上传打点后的模板图片时,获取不到打点的位置坐标.于是找研发看是怎么回事, ...

  8. java百分比怎么写_怎样写一个统计图片颜色所占百分比的程序

    你要的命令应该在这能找到 A a abs 绝对值, 模 acos 反余弦 acosh 反双曲余弦 acot 反余切 acoth 反双曲余切 acsc 反余割 acsch 反双曲余割 all 所有元素均 ...

  9. php获取图片所有颜色代码,php 获取一张图片所有点的颜色值

    image_all_rgb.php 0 //188 =>1 for ($i = 0; $i < $size[1]; ++ $i) { for ($j = 0; $j < $size[ ...

最新文章

  1. Winform界面中主从表编辑界面的快速处理
  2. 算法提高课-图论-有向图的强连通分量-AcWing 1174. 受欢迎的牛:tarjan算法求强连通分量、tarjan算法板子、强连通图
  3. ASP.NET %%,%=%,%#%区别
  4. subpress installed post-installation script returned error exit status 1
  5. javascript console 函数详解 js开发调试的利器 浏览:3201|更新:2014-05-30 09:27
  6. 设计模式学习---单件模式
  7. 一种牛逼的网站分享插件实现
  8. 计算机如何驱动无线网络,win7焦头烂额的无线网卡驱动程序安装问题!求帮助!...
  9. javascript RegExp正则表达式
  10. C#使用webclient下载图片返回403forbiden
  11. [病毒分析]熊猫烧香应急处理方法
  12. 转载:SolidWorks 2014 安装完成破解成功,用过一段时间后提示重新激活(win10系统)...
  13. Python实例---爬取下载喜马拉雅音频文件
  14. uni-app返回上一级并刷新页面
  15. SVG排版公众号图文『实时计算日期差』模板代码
  16. 关于idea的debug调试
  17. codeforces C. Two Teams Composing
  18. java.sql.SQLException: Access denied for user ‘xxx‘@‘localhost‘ (using password: YES)
  19. windows安装golang多版本管理工具gvm/g
  20. 场景中配置阴影(个人笔记)

热门文章

  1. 阿拉伯数字转换成中文或中文大写
  2. 设计美学 第五章 设计的转型与审美化生存
  3. 项目部署至Jenkins之后出现报错:git无法下载github中的工程
  4. iOS_Application
  5. 为什么python的可读性强?
  6. 【VSCode】切换文件与编辑器的快捷键
  7. BMG5100千兆5G智能杆网关
  8. PCB板的线宽、覆铜厚度与通过电流对应的关系
  9. ubuntu 无线网卡启动命令
  10. java的BigInteger里面的mod和remainder区别