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 内置函数complex详解
Oct 23 Python
Python编程对列表中字典元素进行排序的方法详解
May 26 Python
python OpenCV学习笔记之绘制直方图的方法
Feb 08 Python
Python爬虫信息输入及页面的切换方法
May 11 Python
Python 中字符串拼接的多种方法
Jul 30 Python
详解Python的循环结构知识点
May 20 Python
Python利用sqlacodegen自动生成ORM实体类示例
Jun 04 Python
FFrpc python客户端lib使用解析
Aug 24 Python
Pyinstaller 打包发布经验总结
Jun 02 Python
Python如何测试stdout输出
Aug 10 Python
python如何绘制疫情图
Sep 16 Python
python IP地址转整数
Nov 20 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中判断一个请求是ajax请求还是普通请求的方法
2011/06/28 PHP
PHP中如何判断AJAX提交的数据
2012/02/05 PHP
浅谈php+phpStorm+xdebug配置方法
2015/09/17 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
javascript OFFICE控件测试代码
2009/12/08 Javascript
Javascript学习笔记-详解in运算符
2011/09/13 Javascript
在Windows上安装Node.js模块的方法
2011/09/25 Javascript
jquery实现tr元素的上下移动示例代码
2013/12/20 Javascript
JavaScript+CSS控制打印格式示例介绍
2014/01/07 Javascript
详解JavaScript中常用的函数类型
2015/11/18 Javascript
jQuery 移动端artEditor富文本编辑器
2016/01/11 Javascript
体验jQuery和AngularJS的不同点及AngularJS的迷人之处
2016/02/02 Javascript
Javascript农历与公历相互转换的简单实例
2016/10/09 Javascript
JavaScript实现公历转农历功能示例
2017/02/13 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
nodejs实现超简单生成二维码的方法
2018/03/17 NodeJs
Vue组件间通信方法总结(父子组件、兄弟组件及祖先后代组件间)
2019/04/17 Javascript
简单了解Vue + ElementUI后台管理模板
2020/04/07 Javascript
python刷投票的脚本实现代码
2014/11/08 Python
Python cookbook(数据结构与算法)同时对数据做转换和换算处理操作示例
2018/03/23 Python
详解python3中tkinter知识点
2018/06/21 Python
Pytoch之torchvision.transforms图像变换实例
2019/12/30 Python
Python urlopen()和urlretrieve()用法解析
2020/01/07 Python
详解Python Celery和RabbitMQ实战教程
2021/01/20 Python
HTML5中Canvas与SVG的画图原理比较
2013/01/16 HTML / CSS
HTML5 在canvas中绘制矩形附效果图
2014/06/23 HTML / CSS
法国票务网站:Ticketmaster法国
2018/07/09 全球购物
C/C++程序员常见面试题一
2012/12/08 面试题
酒店个人求职信范文
2014/01/25 职场文书
大堂副理的岗位职责范文
2014/02/17 职场文书
创先争优一句话承诺
2014/05/29 职场文书
党员四风问题个人对照检查材料
2014/10/26 职场文书
公司食堂管理制度
2015/08/05 职场文书
「租借女友」第2季樱泽墨角色PV&新视觉图公开
2022/03/21 日漫
深入解析Apache Hudi内核文件标记机制
2022/03/31 Servers
JavaScript架构搭建前端监控如何采集异常数据
2022/06/25 Javascript