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语言
Mar 20 Python
django session完成状态保持的方法
Nov 27 Python
Python 2/3下处理cjk编码的zip文件的方法
Apr 26 Python
pip指定python位置安装软件包的方法
Jul 12 Python
python实现两个文件夹的同步
Aug 29 Python
wxPython电子表格功能wx.grid实例教程
Nov 19 Python
Django密码存储策略分析
Jan 09 Python
python实现tail -f 功能
Jan 17 Python
Pycharm配置PyQt5环境的教程
Apr 02 Python
Python matplotlib实时画图案例
Apr 23 Python
Python基于Opencv识别两张相似图片
Apr 25 Python
深入浅析Django MTV模式
Sep 04 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
火车头discuz6.1 完美采集的php接口文件
2009/09/13 PHP
php 记录进行累加并显示总时长为秒的结果
2011/11/04 PHP
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
2010/11/11 Javascript
图片延迟加载的实现代码(模仿懒惰)
2013/03/29 Javascript
基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍
2013/05/07 Javascript
基于jQuery的图片不完全按比例自动缩小
2014/07/11 Javascript
基于jQuery实现下拉框
2014/11/24 Javascript
Javascript模拟加速运动与减速运动代码分享
2014/12/11 Javascript
js实现Select头像选择实时预览代码
2015/08/17 Javascript
详解vue父子模版嵌套案例
2017/03/04 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
2017/05/02 Javascript
JavaScrpt判断一个数是否是质数的实例代码
2017/06/11 Javascript
微信小程序动态添加分享数据
2017/06/14 Javascript
requirejs + vue 项目搭建详解
2017/06/16 Javascript
仿淘宝JSsearch搜索下拉深度用法
2018/01/15 Javascript
Layui给数据表格动态添加一行并跳转到添加行所在页的方法
2018/08/20 Javascript
解决vue移动端适配问题
2018/12/12 Javascript
jquery分页优化操作实例分析
2019/08/23 jQuery
如何在面试中手写出javascript节流和防抖函数
2020/10/22 Javascript
约瑟夫问题的Python和C++求解方法
2015/08/20 Python
Python Socket传输文件示例
2017/01/16 Python
python itchat实现微信自动回复的示例代码
2017/08/14 Python
在NumPy中创建空数组/矩阵的方法
2018/06/15 Python
Django中使用Whoosh进行全文检索的方法
2019/03/31 Python
6行Python代码实现进度条效果(Progress、tqdm、alive-progress​​​​​​​和PySimpleGUI库)
2020/01/06 Python
详解Python的三种拷贝方式
2020/02/11 Python
Matplotlib自定义坐标轴刻度的实现示例
2020/06/18 Python
Lentiamo比利时:便宜的隐形眼镜
2020/02/14 全球购物
用友笔试题目
2016/10/25 面试题
GWebs公司笔试题
2012/05/04 面试题
研究生自我鉴定范文
2013/10/30 职场文书
高一学年自我鉴定范文(3篇)
2014/09/26 职场文书
英文产品推荐信
2015/03/27 职场文书
JavaScript控制台的更多功能
2021/04/28 Javascript
MySQL限制查询和数据排序介绍
2022/03/25 MySQL