Opencv图像处理:如何判断图片里某个颜色值占的比例
作者:DS小龙哥 发布时间:2023-09-27 16:57:40
标签:Opencv,图片,颜色值
一、功能
这里的需求是,判断摄像头有没有被物体遮挡。这里只考虑用手遮挡---->判断黑色颜色的范围。
二、使用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()
来源:https://blog.csdn.net/xiaolong1126626497/article/details/105594061


猜你喜欢
- 一、函数的定义及其应用 所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用函数的使用包含两个步骤1.定义函数–封装独立
- 在python3的sorted中去掉了cmp参数,转而推荐“key+lambda”的方式来排序。如果需要对python的list进行多级排序
- Go语言集成开发环境之VS Code安装使用VS Code是微软开源的一款编辑器,插件系统十分的丰富。下面介绍如何用VS Code搭建go语
- 本文实例讲述了微信小程序MUI导航栏透明渐变功能。分享给大家供大家参考,具体如下:导航栏透明渐变效果实现原理1. 利用position:ab
- 使用到的库: dlib+Opencv python版本: 3.8 编译环境: Jupyter Notebook (Anaconda3)0.D
- Wordpress 2.6.2 出来了,今天将网站程序从2.6升级上来,比较了一下2个版本的代码,发现2.6的版本中的代码还有几个地方出现了
- 1、打开插件市场链接:ext.dcloud.net.cn/plugin?id=2…点击红色框按钮绑定包名,这个包名与后
- Pycharm运行程序时,控制台输出PyDev console:starting1、问题:写好程序后,点击Run运行,控制台如下图所示提示P
- 如何利用微信JSSDK调用微信扫一扫功能?具体内容如下1. 确保有 调起微信扫一扫接口 权限,测试号可能不行;2. 导入相关JS<sc
- Myisam_revocer控制了Myisam查找和修复错误的方式。自动修复MySQL的myisam表常用MySQL的童鞋都知道这个myis
- 下面要学的是列表:任务1、“千年虫”我来了函数enumerateenumerate() 函数用于将一
- 目录1 摘要2 概述2.1 什么是并行计算?2.2 为什么要并行计算?2.3 谁都在使用并行计算?科学界和工程界:工业界和商业界:全球应用:
- BinLogBinLog是记录所有数据库表结构变更(例如create、alter table)以及表数据修改(insert、update、d
- 今天开发时,使用axios返回的response中data有多个数据:如果是获取cn里的数据的,可以用:response.data.cn但是
- 从 webpack book 的 Loading Assets 一章中延申出来。改善前端项目体验中,很重要的点就是静态资源的优化。它是由于浏
- 前言 上一篇文章,我们讲解了图像处理中的阈值函数,这一篇文章我们来做膨胀和腐蚀函数。膨胀与腐蚀 说概念可能很难解释,我们来看图,首先是原图:
- 英文版见:http://dflying.dflying.net/.../98_web_standard_and_aspnet__part1_
- UTF-8匹配: 在javascript中,要判断字符串是中文是很简单的。比如: var str = "php编程";
- 用 Python 关机你肯定听过或者实践过,那么用 Python 开机呢?这是一个神奇的方法,教你如何用 Python 来开机。GitHub
- 从 Google 的一个细节说起:整个虚线框都是“Next”的可点击区域。看似不经意,却直接提升了细节的可用性。其它页码也巧妙地和上面的字母