Opencv图像处理:如何判断图片里某个颜色值占的比例


Posted in Python onJune 03, 2020

一、功能

这里的需求是,判断摄像头有没有被物体遮挡。这里只考虑用手遮挡---->判断黑色颜色的范围。

二、使用OpenCV的Mat格式图片遍历图片

下面代码里,传入的图片的尺寸是640*480,判断黑色范围。

/*
在图片里查找指定颜色的比例
*/
int Widget::Mat_color_Find(QImage qimage)
{
  Mat image = QImage2cvMat(qimage);//将图片加载进来
  int num = 0;//记录颜色的像素点
  float rate;//要计算的百分率
  //遍历图片的每一个像素点
  for(int i = 0; i < image.rows;i++) //行数
  {
   for(int j = 0; j <image.cols;j++) //列数
   {
    //对该像素是否为指定颜色进行判断 BGR 像素点
    //OpenCV 中 MAT类的默认三原色通道顺序BGR
    /*
   动态地址访问像素语法:image.at<Vec3b>(i,j)[0]、image.at<uchar>(i, j)
   访问三通道图像的单个像素:
   int b = image.at<Vec3b>(i, j)[0];
   int g = image.at<Vec3b>(i, j)[1];
   int r = image.at<Vec3b>(i, j)[2];
   对于三通道图像,每个像素存储了三个值,分别为蓝色、绿色、红色通道上的数值。
   int gray_data = image.at<uchar>(i, j);
   用来访问灰度图像的单个像素。对于灰度图像,每个像素只存储一个值
   */
    if((image.at<Vec3b>(i, j)[0] <= 120 &&
     image.at<Vec3b>(i, j)[1] <= 120 &&
     image.at<Vec3b>(i, j)[2] <= 120))
    {
     num++;
    }
   }
  }
  rate = (float)num / (float)(image.rows * image.cols);
 
  //阀值为 0.249255 表示为全黑
  if(rate>0.20)
  {
   qDebug()<<":Mat:故意遮挡摄像头";
  }
  qDebug()<<"Mat:比例"<<rate;
  return 0;
}
 
 
Mat Widget::QImage2cvMat(QImage image)
{
 Mat mat;
 switch(image.format())
 {
 case QImage::Format_ARGB32:
 case QImage::Format_RGB32:
 case QImage::Format_ARGB32_Premultiplied:
  mat = Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
  break;
 case QImage::Format_RGB888:
  mat = Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
  cvtColor(mat, mat, CV_BGR2RGB);
  break;
 case QImage::Format_Indexed8:
  mat = Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
  break;
 }
 return mat;
}

三、使用QImage遍历像素点

/*
在图片里查找指定颜色的比例
*/
int Widget::qimage_color_Find(QImage qimage)
{
 int num = 0;//记录颜色的像素点
 float rate;//要计算的百分率
 quint8 r,g,b;
 //遍历图片的每一个像素点
 for(int i = 0; i < qimage.height();i++) //行数
 {
  for(int j = 0; j <qimage.width();j++) //列数
  {
   QRgb rgb=qimage.pixel(j,i);
   r=qRed(rgb);
   g=qGreen(rgb);
   b=qBlue(rgb);
 
   if((r <= 120 && g <= 120 && b <= 120))
   {
    num++;
   }
  }
 }
 rate = (float)num / (float)(qimage.height() * qimage.width());
 
 //阀值为 0.99777 表示为全黑
 if(rate>0.60)
 {
   //qDebug()<<"qimage:故意遮挡摄像头";
 }
 qDebug()<<"qimage:比例:"<<rate;
 return 0;
}

补充知识:判断一批图片中含有某中颜色物体的图片个数占总图片的比例

最近在做一个语义分割项目,使用Label工具进行了类别的标注.然后不同类别生成了不同的颜色,如需要代码可以参考.后来我想统计一下含有一种类别的图片和含有两种类别的图片占总图片的比例,下面是我的代码:

代码思路:

1)循环读取文件夹中的图片

2)循环读取图片的每一个像素点,当图片的像素点和你检测的物体像素点一致时,对应类别加1.

3)读取完图片后计算每一类的比例.

import cv2
import os
import matplotlib.pyplot as plt
picture_path="/home/wsb/桌面/picture"
picture_list=os.listdir(picture_path)
total_picture=len(picture_list)
total=total_picture
per=[]
number=0#图片中道路类型为1的个数
number1=0#一种道路类型并且比例小于0.0638的个数
number2=0
for item in picture_list:
  src = os.path.join(os.path.abspath(picture_path), item)
  print("start: %s "%item)
  total_picture-=1
  mat=cv2.imread(src)
  height=mat.shape[0]
  width=mat.shape[1]
  ground=0
  zero=0  
  one=0
  two=0
  three=0
  four=0
  five=0
  six=0
  seven=0
  eight=0
  rateground=0
  rate0=0
  rate1=0
  rate2=0
  rate3=0
  rate4=0
  rate5=0
  rate6=0
  rate7=0
  rate8=0
  rate=0
  road_type=0
  for i in range(height):
    for j in range(width):
#      print("r:%s"%mat[i][j][0])
#      print("r:%s"%mat[i][j][1])
#      print("r:%s"%mat[i][j][2])

      '''
      我这里共有9种分类情况,况且我已知道每一种颜色的具体rgb值,我将它们作为我的判断条件
      如不你不知道可以在网上查找自己想查看比例的rgb值或者范围
      '''
      if mat[i][j][0]==0 and mat[i][j][1]==0 and mat[i][j][2]==0:
        ground+=1
      elif mat[i][j][0]==128 and mat[i][j][1]==0 and mat[i][j][2]==0:
        zero+=1
      elif mat[i][j][0]==0 and mat[i][j][1]==128 and mat[i][j][2]==0:
        one+=1
      elif mat[i][j][0]==128 and mat[i][j][1]==128 and mat[i][j][2]==0:
        two+=1
      elif mat[i][j][0]==0 and mat[i][j][1]==0 and mat[i][j][2]==128:
        three+=1
      elif mat[i][j][0]==128 and mat[i][j][1]==0 and mat[i][j][2]==128:
        four+=1
      elif mat[i][j][0]==0 and mat[i][j][1]==128 and mat[i][j][2]==128:
        five+=1
      elif mat[i][j][0]==128 and mat[i][j][1]==128 and mat[i][j][2]==128:
        six+=1
      elif mat[i][j][0]==0 and mat[i][j][1]==0 and mat[i][j][2]==64:
        seven+=1
      elif mat[i][j][0]==0 and mat[i][j][1]==0 and mat[i][j][2]==192:
        eight+=1
      else:
        print("输入正确的图片,或者更改上面判断条件的像素值")
  rateground=ground/(height*width)
  rate0=zero/(height*width)
  if rate0!=0:
    road_type+=1
  rate1=one/(height*width)
  if rate1!=0:
    road_type+=1
  rate2=two/(height*width)
  if rate2!=0:
    road_type+=1
  rate3=three/(height*width)
  if rate3!=0:
    road_type+=1
  rate4=four/(height*width)
  if rate4!=0:
    road_type+=1
  rate5=five/(height*width)
  if rate5!=0:
    road_type+=1
  rate6=six/(height*width)
  if rate6!=0:
    road_type+=1
  rate7=seven/(height*width)
  if rate7!=0:
    road_type+=1
  rate8=eight/(height*width)
  if rate8!=0:
    road_type+=1
  rate=rate0+rate1+rate2+rate3+rate4+rate5+rate6+rate7+rate8
  per.append(rate)
  if road_type==1:
    number+=1
    if rate<0.0638:
      number1+=1#一种类型道路并且所占比例小于0.0638的情况 
  else:
    if rate<0.532:
      number2+=1#两种道路类型,并且正确正确道路类型所占比例小于0.532时的个数
  print("the remaining %d"%total_picture)
A=number/total#图片中道路类型大于1种的概率
A1=number1/total#图片中一种道路类型并且比例小于0.0638的概率
A2=number2/total#图片中有两种道路,并且一种道路所占比例小于0.532时的概率
print("A1:%s"%A1)
print("the precentage of one road is %s"%A)
print("the precentage of two road is %s"%(1-A))
print("A2:%s"%A2)
plt.plot(per)
plt.ylabel('the percentage of road')
plt.show()

以上这篇Opencv图像处理:如何判断图片里某个颜色值占的比例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Linux下使用python调用top命令获得CPU利用率
Mar 10 Python
Python 字符串大小写转换的简单实例
Jan 21 Python
python opencv之分水岭算法示例
Feb 24 Python
python实现windows下文件备份脚本
May 27 Python
python 字符串只保留汉字的方法
Nov 16 Python
详解Python中的内建函数,可迭代对象,迭代器
Apr 29 Python
pandas.DataFrame的pivot()和unstack()实现行转列
Jul 06 Python
python自动发微信监控报警
Sep 06 Python
Python 面向对象之类class和对象基本用法示例
Feb 02 Python
Python OrderedDict字典排序方法详解
May 21 Python
python实现凯撒密码、凯撒加解密算法
Jun 11 Python
keras K.function获取某层的输出操作
Jun 29 Python
QML用PathView实现轮播图
Jun 03 #Python
Python基于smtplib协议实现发送邮件
Jun 03 #Python
Pytorch环境搭建与基本语法
Jun 03 #Python
如何学习Python time模块
Jun 03 #Python
使用openCV去除文字中乱入的线条实例
Jun 02 #Python
Python能做什么
Jun 02 #Python
什么是Python中的匿名函数
Jun 02 #Python
You might like
Yii2如何批量添加数据
2016/05/17 PHP
thinkphp3.x中session方法的用法分析
2016/05/20 PHP
PHP简单实现数字分页功能示例
2016/08/24 PHP
Laravel框架集合用法实例浅析
2020/05/14 PHP
如何确保JavaScript的执行顺序 之jQuery.html深度分析
2011/03/03 Javascript
比例尺、缩略图、平移缩放之百度地图添加控件方法
2015/08/03 Javascript
js实现旋转木马效果
2017/03/17 Javascript
vue使用vue-cli快速创建工程
2017/07/28 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
VUE实现可随意拖动的弹窗组件
2018/09/25 Javascript
Vue实现图片轮播组件思路及实例解析
2020/05/11 Javascript
原生JavaScript写出Tabs标签页的实例代码
2020/07/20 Javascript
微信小程序自定义胶囊样式
2020/12/27 Javascript
vue实现树状表格效果
2020/12/29 Vue.js
[57:22]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第五场
2018/04/10 DOTA
Python 数据结构之队列的实现
2017/01/22 Python
matlab中实现矩阵删除一行或一列的方法
2018/04/04 Python
Python实现的文本对比报告生成工具示例
2018/05/22 Python
Django中日期处理注意事项与自定义时间格式转换详解
2018/08/06 Python
python实现多张图片拼接成大图
2019/01/15 Python
python getpass模块用法及实例详解
2019/10/07 Python
如何在 Django 模板中输出 &quot;{{&quot;
2020/01/24 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
python输出结果刷新及进度条的实现操作
2020/07/13 Python
pycharm中使用request和Pytest进行接口测试的方法
2020/07/31 Python
python日志通过不同的等级打印不同的颜色(示例代码)
2021/01/13 Python
利用CSS的Sass预处理器(框架)来制作居中效果
2016/03/10 HTML / CSS
CSS3 flex布局之快速实现BorderLayout布局
2015/12/03 HTML / CSS
英国假发网站:Hothair
2018/02/23 全球购物
上海奥佳笔试题面试题
2016/11/16 面试题
给校长的一封建议书
2014/03/12 职场文书
学校就业推荐信范文
2014/05/19 职场文书
小学英语教师2015年度个人工作总结
2015/10/14 职场文书
PHP实现rar解压读取扩展包小结
2021/06/03 PHP
Python编程中Python与GIL互斥锁关系作用分析
2021/09/15 Python
Nginx进程调度问题详解
2021/09/25 Servers