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 相关文章推荐
python批量下载图片的三种方法
Apr 22 Python
python实现获取序列中最小的几个元素
Sep 25 Python
python版本坑:md5例子(python2与python3中md5区别)
Jun 20 Python
PyTorch快速搭建神经网络及其保存提取方法详解
Apr 28 Python
解决Python requests库编码 socks5代理的问题
May 07 Python
分享8个非常流行的 Python 可视化工具包
Jun 05 Python
python使用Pandas库提升项目的运行速度过程详解
Jul 12 Python
python中enumerate() 与zip()函数的使用比较实例分析
Sep 03 Python
python访问hdfs的操作
Jun 06 Python
Python偏函数Partial function使用方法实例详解
Jun 17 Python
python利用文件时间批量重命名照片和视频
Feb 09 Python
Python使用scapy模块发包收包
May 07 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
php win下Socket方式发邮件类
2009/08/21 PHP
Linux下将excel数据导入到mssql数据库中的方法
2010/02/08 PHP
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
设置php页面编码的两种方法示例介绍
2014/03/03 PHP
第一个JavaScript入门基础 document.write输出
2010/02/22 Javascript
HTML颜色选择器实现代码
2010/11/23 Javascript
用JQuery实现表格隔行变色和突出显示当前行的代码
2012/02/10 Javascript
JQuery的AJAX实现文件下载的小例子
2013/05/15 Javascript
怎么选择Javascript框架(Javascript Framework)
2013/11/22 Javascript
JS合并数组的几种方法及优劣比较
2014/09/19 Javascript
Javascript验证用户输入URL地址是否为空及格式是否正确
2014/10/09 Javascript
jquery实现浮动的侧栏实例
2015/06/25 Javascript
JavaScript正则表达式简单实用实例
2017/06/23 Javascript
Sublime Text新建.vue模板并高亮(图文教程)
2017/10/26 Javascript
详解RequireJs官方使用教程
2017/10/31 Javascript
AngularJS发送异步Get/Post请求方法
2018/08/13 Javascript
JavaScript实现的九种排序算法
2019/03/04 Javascript
js+HTML5 canvas 实现简单的加载条(进度条)功能示例
2019/07/16 Javascript
jQuery+PHP+Ajax实现动态数字统计展示功能
2019/12/25 jQuery
Python编程实现二叉树及七种遍历方法详解
2017/06/02 Python
python学习之hook钩子的原理和使用
2018/10/25 Python
Python实现正则表达式匹配任意的邮箱方法
2018/12/20 Python
关于Python 常用获取元素 Driver 总结
2019/11/24 Python
python路径的写法及目录的获取方式
2019/12/26 Python
Python 将 QQ 好友头像生成祝福语的实现代码
2020/05/03 Python
Django模型验证器介绍与源码分析
2020/09/08 Python
python爬取天气数据的实例详解
2020/11/20 Python
使用django自带的user做外键的方法
2020/11/30 Python
MSC邮轮官方网站:加勒比海、地中海和世界各地的假期
2018/08/27 全球购物
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
电子专业推荐信范文
2013/11/18 职场文书
2014年重阳节老干部座谈会局领导发言稿
2014/09/25 职场文书
党员评议个人总结
2014/10/20 职场文书
股份转让协议书范本
2015/01/27 职场文书
教你使用pyinstaller打包Python教程
2021/05/27 Python
解决mysql的int型主键自增问题
2021/07/15 MySQL