获取图片某种颜色所占百分比
获取蓝色在图片中所占百分比
- 思路
- 代码
- 运行结果
- 测试图片
思路
由于每种颜色都有一个阈值,单纯的计算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;
}
运行结果
测试图片
获取其中各种颜色所占百分比
获取图片某种颜色所占百分比相关推荐
- java图片中各颜色占比_计算图片中某种颜色所占的面积比例 - Photoshop 方法
时间:2013-11-20 23:17来源:未知 作者:PS314 点击: 5041 次关键词:混合色带 通常,我们仅需要图片显示视觉信息,不过有些时候,还需要对图片中的信息进行分析.如,需要获得照片 ...
- 获取图片像素颜色,转换为CSS3 box-shadow显示
原理: 1.使用FileReader 读取图片 2.使用canvas 的 getImageData 获取图片像素信息 3.将像素信息转换为CSS3 box-shadow 代码: <!DOCTYP ...
- python获取图片的颜色信息
python获取图片的颜色更多 0 getcolors 图片颜色 python image = Image.open("outofmemory.cn.png") image.get ...
- pytohn用Pillow或OpenCV删除图片某种颜色
实际对图片进行处理的时候,经常会碰到单一颜色背景的情况,这时候就可以采用图像处理的方法,将该单一颜色去除,形成一个透明的图片.如果需要,还可以加上新的背景图,图片就焕然一新了. 删除图片某种颜色,Pi ...
- js获取图片像素颜色,修改图片像素颜色
直接上代码示例 <!DOCTYPE HTML PUBLIC> <html><head><meta charset="utf-8">& ...
- python查看图片颜色统计_Python通过PIL获取图片主要颜色并和颜色库进行对比的方法...
本文实例讲述了Python通过PIL获取图片主要颜色并和颜色库进行对比的方法.分享给大家供大家参考.具体分析如下: 这段代码主要用来从图片提取其主要颜色,类似Goolge和Baidu的图片搜索时可以指 ...
- python获取图片像素点颜色_Python获取图片位置像素色值及判断色值是否存在
本文背景: 公司项目的广告系统有个功能,给图片模板打指定的颜色值点,根据需要拼合的图片数量,打点数量也不同.设计说他弄好了,运营上传打点后的模板图片时,获取不到打点的位置坐标.于是找研发看是怎么回事, ...
- java百分比怎么写_怎样写一个统计图片颜色所占百分比的程序
你要的命令应该在这能找到 A a abs 绝对值, 模 acos 反余弦 acosh 反双曲余弦 acot 反余切 acoth 反双曲余切 acsc 反余割 acsch 反双曲余割 all 所有元素均 ...
- php获取图片所有颜色代码,php 获取一张图片所有点的颜色值
image_all_rgb.php 0 //188 =>1 for ($i = 0; $i < $size[1]; ++ $i) { for ($j = 0; $j < $size[ ...
最新文章
- Winform界面中主从表编辑界面的快速处理
- 算法提高课-图论-有向图的强连通分量-AcWing 1174. 受欢迎的牛:tarjan算法求强连通分量、tarjan算法板子、强连通图
- ASP.NET %%,%=%,%#%区别
- subpress installed post-installation script returned error exit status 1
- javascript console 函数详解 js开发调试的利器 浏览:3201|更新:2014-05-30 09:27
- 设计模式学习---单件模式
- 一种牛逼的网站分享插件实现
- 计算机如何驱动无线网络,win7焦头烂额的无线网卡驱动程序安装问题!求帮助!...
- javascript RegExp正则表达式
- C#使用webclient下载图片返回403forbiden
- [病毒分析]熊猫烧香应急处理方法
- 转载:SolidWorks 2014 安装完成破解成功,用过一段时间后提示重新激活(win10系统)...
- Python实例---爬取下载喜马拉雅音频文件
- uni-app返回上一级并刷新页面
- SVG排版公众号图文『实时计算日期差』模板代码
- 关于idea的debug调试
- codeforces C. Two Teams Composing
- java.sql.SQLException: Access denied for user ‘xxx‘@‘localhost‘ (using password: YES)
- windows安装golang多版本管理工具gvm/g
- 场景中配置阴影(个人笔记)