Opencv圖像處理:如何判斷圖片里某個顏色值占的比例
一、功能
這里的需求是,判斷攝像頭有沒有被物體遮擋。這里只考慮用手遮擋---->判斷黑色顏色的范圍。
二、使用OpenCV的Mat格式圖片遍歷圖片
下面代碼里,傳入的圖片的尺寸是640*480,判斷黑色范圍。
/* 在圖片里查找指定顏色的比例 */ int Widget::Mat_color_Find(QImage qimage) { Mat image = QImage2cvMat(qimage);//將圖片加載進(jìn)來 int num = 0;//記錄顏色的像素點(diǎn) float rate;//要計算的百分率 //遍歷圖片的每一個像素點(diǎn) for(int i = 0; i < image.rows;i++) //行數(shù) { for(int j = 0; j <image.cols;j++) //列數(shù) { //對該像素是否為指定顏色進(jìn)行判斷 BGR 像素點(diǎn) //OpenCV 中 MAT類的默認(rèn)三原色通道順序BGR /* 動態(tài)地址訪問像素語法: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]; 對于三通道圖像,每個像素存儲了三個值,分別為藍(lán)色、綠色、紅色通道上的數(shù)值。 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遍歷像素點(diǎn)
/* 在圖片里查找指定顏色的比例 */ int Widget::qimage_color_Find(QImage qimage) { int num = 0;//記錄顏色的像素點(diǎn) float rate;//要計算的百分率 quint8 r,g,b; //遍歷圖片的每一個像素點(diǎn) for(int i = 0; i < qimage.height();i++) //行數(shù) { for(int j = 0; j <qimage.width();j++) //列數(shù) { 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; }
補(bǔ)充知識:判斷一批圖片中含有某中顏色物體的圖片個數(shù)占總圖片的比例
最近在做一個語義分割項目,使用Label工具進(jìn)行了類別的標(biāo)注.然后不同類別生成了不同的顏色,如需要代碼可以參考.后來我想統(tǒng)計一下含有一種類別的圖片和含有兩種類別的圖片占總圖片的比例,下面是我的代碼:
代碼思路:
1)循環(huán)讀取文件夾中的圖片
2)循環(huán)讀取圖片的每一個像素點(diǎn),當(dāng)圖片的像素點(diǎn)和你檢測的物體像素點(diǎn)一致時,對應(yīng)類別加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的個數(shù) number1=0#一種道路類型并且比例小于0.0638的個數(shù) 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值,我將它們作為我的判斷條件 如不你不知道可以在網(wǎng)上查找自己想查看比例的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時的個數(shù) 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圖像處理:如何判斷圖片里某個顏色值占的比例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- Python+OpenCV圖像處理——圖像二值化的實(shí)現(xiàn)
- Opencv圖像處理之詳解掩膜mask
- Python+OpenCV圖像處理——實(shí)現(xiàn)直線檢測
- 詳解python opencv、scikit-image和PIL圖像處理庫比較
- OpenCV圖像處理之常見的圖像灰度變換
- Python+OpenCV數(shù)字圖像處理之ROI區(qū)域的提取
- Opencv圖像處理之輪廓外背景顏色改變
- Python+OpenCV圖像處理—— 色彩空間轉(zhuǎn)換
- Python+OpenCV圖像處理——實(shí)現(xiàn)輪廓發(fā)現(xiàn)
- OpenCV+Qt實(shí)現(xiàn)圖像處理操作
相關(guān)文章
Python實(shí)現(xiàn)的簡單模板引擎功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)的簡單模板引擎功能,結(jié)合具體實(shí)例形式分析了Python模版引擎的定義與使用方法,需要的朋友可以參考下2017-09-09numpy中np.dstack()、np.hstack()、np.vstack()用法
numpy里dstack, hstack, vstack, 都有拼接的作用,本文詳細(xì)的介紹了np.dstack()、np.hstack()、np.vstack()用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03Django之全局使用request.user.username的實(shí)例詳解
這篇文章主要介紹了Django之全局使用request.user.username的實(shí)例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05利用Python如何實(shí)現(xiàn)一個小說網(wǎng)站雛形
這篇文章主要給大家介紹了關(guān)于利用Python如何實(shí)現(xiàn)一個小說網(wǎng)站雛形的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11Python中pillow知識點(diǎn)學(xué)習(xí)
本文給大家通過一篇Python中pillow知識點(diǎn)學(xué)習(xí)的筆記內(nèi)容讓大家對pillow有一個學(xué)習(xí)方向的有一個認(rèn)識,有興趣的朋友學(xué)習(xí)下。2018-04-04Python機(jī)器學(xué)習(xí)利用隨機(jī)森林對特征重要性計算評估
本文是對隨機(jī)森林如何用在特征選擇上做一個簡單的介紹。隨機(jī)森林非常簡單,易于實(shí)現(xiàn),計算開銷也很小,更令人驚奇的是它在分類和回歸上表現(xiàn)出了十分驚人的性能2021-10-10django model去掉unique_together報錯的解決方案
本文給大家分享的是在使用django model去掉unique_together時報錯的解決思路和具體步驟,提供給大家參考下,希望對大家學(xué)習(xí)使用django能夠有所幫助2016-10-10Python實(shí)現(xiàn)的爬取小說爬蟲功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)的爬取小說爬蟲功能,結(jié)合實(shí)例形式分析了Python爬取頂點(diǎn)小說站上的小說爬蟲功能相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-03-03