python3+opencv 使用灰度直方圖來(lái)判斷圖片的亮暗操作
1.如何讓計(jì)算機(jī)自動(dòng)判斷一張圖是否偏暗?或是判斷一張圖是否是處于夜晚?我們可以先把圖片轉(zhuǎn)換為灰度圖,然后根據(jù)灰度值的分布來(lái)判斷,如:


我們可以從上圖看到,晚上的圖片的灰度值是集中在前段的,如0~30多左右,我們?cè)倏匆粡埍容^明亮的圖片:

明亮的圖片的灰度直方圖是比較靠后的.
因此要判斷圖片的亮暗,只需要統(tǒng)計(jì)偏暗的像素個(gè)數(shù),再除以圖片像素的總個(gè)數(shù),得到百分比p即可,至于p大于多少即判斷為暗,則可以由你自己設(shè)置.下面給出代碼,此代碼可以在裝滿圖片的目錄里選出偏暗的圖片,然后把這些圖片保存下來(lái).
2.代碼:
import cv2;
import numpy as np;
import matplotlib.pyplot as plt;
import os;
import sys;
def func(img,pic_path,pic):
#把圖片轉(zhuǎn)換為灰度圖
gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY);
#獲取灰度圖矩陣的行數(shù)和列數(shù)
r,c = gray_img.shape[:2];
dark_sum=0; #偏暗的像素 初始化為0個(gè)
dark_prop=0; #偏暗像素所占比例初始化為0
piexs_sum=r*c; #整個(gè)弧度圖的像素個(gè)數(shù)為r*c
#遍歷灰度圖的所有像素
for row in gray_img:
for colum in row:
if colum<40: #人為設(shè)置的超參數(shù),表示0~39的灰度值為暗
dark_sum+=1;
dark_prop=dark_sum/(piexs_sum);
print("dark_sum:"+str(dark_sum));
print("piexs_sum:"+str(piexs_sum));
print("dark_prop=dark_sum/piexs_sum:"+str(dark_prop));
if dark_prop >=0.75: #人為設(shè)置的超參數(shù):表示若偏暗像素所占比例超過(guò)0.78,則這張圖被認(rèn)為整體環(huán)境黑暗的圖片
print(pic_path+" is dark!");
cv2.imwrite("../DarkPicDir/"+pic,img);#把被認(rèn)為黑暗的圖片保存
else:
print(pic_path+" is bright!")
#hist(pic_path); #若要查看圖片的灰度值分布情況,可以這個(gè)注釋解除
#用于顯示圖片的灰度直方圖
def hist(pic_path):
img=cv2.imread(pic_path,0);
hist = cv2.calcHist([img],[0],None,[256],[0,256])
plt.subplot(121)
plt.imshow(img,'gray')
plt.xticks([])
plt.yticks([])
plt.title("Original")
plt.subplot(122)
plt.hist(img.ravel(),256,[0,256])
plt.show()
#讀取給定目錄的所有圖片
def readAllPictures(pics_path):
if not os.path.exists(pics_path):
print("路徑錯(cuò)誤,路徑不存在!")
return;
allPics = [];
pics = os.listdir(pics_path);
for pic in pics:
pic_path = os.path.join(pics_path,pic);
if os.path.isfile(pic_path):
allPics.append(pic_path);
img=cv2.imread(pic_path);
func(img,pic_path,pic);
return allPics;
#創(chuàng)建用于存放黑暗圖片的目錄
def createDarkDir():
DarkDirPath = "../DarkPicDir";
isExists = os.path.exists(DarkDirPath);
if not isExists:
os.makedirs(DarkDirPath);
print("dark pics dir is created successfully!");
return True;
else:
return False;
if __name__ =='__main__':
pics_path = sys.argv[1];#獲取所給圖片目錄
createDarkDir();
allPics=readAllPictures(pics_path);
運(yùn)行命令: python3 cal.py 圖片集的路徑名
(其中cal.py 是python代碼的文件名)
運(yùn)行結(jié)果:

然后進(jìn)入裝黑暗圖片的目錄里,就會(huì)看到從空目錄變成裝有黑暗圖片:

以上這篇python3+opencv 使用灰度直方圖來(lái)判斷圖片的亮暗操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- python3讀取圖片并灰度化圖片的四種方法(OpenCV、PIL.Image、TensorFlow方法)總結(jié)
- python opencv將圖片轉(zhuǎn)為灰度圖的方法示例
- python-OpenCV 實(shí)現(xiàn)將數(shù)組轉(zhuǎn)換成灰度圖和彩圖
- OpenCV圖像處理之常見(jiàn)的圖像灰度變換
- OpenCV灰度化之后圖片為綠色的解決
- Python OpenCV 彩色與灰度圖像的轉(zhuǎn)換實(shí)現(xiàn)
- Opencv實(shí)現(xiàn)圖像灰度線性變換
- python?opencv實(shí)現(xiàn)灰度圖和彩色圖的互相轉(zhuǎn)換
相關(guān)文章
Python如何操作docker redis過(guò)程解析
這篇文章主要介紹了Python如何操作docker redis過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
Django權(quán)限機(jī)制實(shí)現(xiàn)代碼詳解
這篇文章主要介紹了Django權(quán)限機(jī)制實(shí)現(xiàn)代碼詳解,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
Python檢查判斷一個(gè)數(shù)是不是另一個(gè)數(shù)的整數(shù)次冪實(shí)例深究
在數(shù)學(xué)和計(jì)算中,確定一個(gè)數(shù)是否為另一個(gè)數(shù)的整數(shù)次冪是一個(gè)常見(jiàn)而重要的問(wèn)題,例如,我們可能需要判斷一個(gè)數(shù)是否是某個(gè)數(shù)的平方、立方或其他冪次,本文將探討在Python中如何實(shí)現(xiàn)這一功能,通過(guò)數(shù)學(xué)方法和算法檢查一個(gè)數(shù)是否是另一個(gè)數(shù)的整數(shù)次冪2023-12-12
python導(dǎo)出requirements.txt的幾種方法以及環(huán)境配置詳細(xì)流程
這篇文章主要給大家介紹了關(guān)于python導(dǎo)出requirements.txt的幾種方法以及環(huán)境配置詳細(xì)流程,requirements.txt 文件是一個(gè)文本文件,用于列出你的Python項(xiàng)目所依賴的軟件包及其版本,需要的朋友可以參考下2023-11-11
tensorflow建立一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)的方法
本篇文章主要介紹了tensorflow建立一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02

