1. 程式人生 > 程式設計 >python3+opencv 使用灰度直方圖來判斷圖片的亮暗操作

python3+opencv 使用灰度直方圖來判斷圖片的亮暗操作

1.如何讓計算機自動判斷一張圖是否偏暗?或是判斷一張圖是否是處於夜晚?我們可以先把圖片轉換為灰度圖,然後根據灰度值的分佈來判斷,如:

python3+opencv 使用灰度直方圖來判斷圖片的亮暗操作

python3+opencv 使用灰度直方圖來判斷圖片的亮暗操作

我們可以從上圖看到,晚上的圖片的灰度值是集中在前段的,如0~30多左右,我們再看一張比較明亮的圖片:

python3+opencv 使用灰度直方圖來判斷圖片的亮暗操作

明亮的圖片的灰度直方圖是比較靠後的.

因此要判斷圖片的亮暗,只需要統計偏暗的畫素個數,再除以圖片畫素的總個數,得到百分比p即可,至於p大於多少即判斷為暗,則可以由你自己設定.下面給出程式碼,此程式碼可以在裝滿圖片的目錄裡選出偏暗的圖片,然後把這些圖片儲存下來.

2.程式碼:

import cv2;
import numpy as np;
import matplotlib.pyplot as plt;
import os;
import sys;
 
def func(img,pic_path,pic):
	#把圖片轉換為灰度圖
	gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY);
	#獲取灰度圖矩陣的行數和列數
	r,c = gray_img.shape[:2];
	dark_sum=0;	#偏暗的畫素 初始化為0個
	dark_prop=0;	#偏暗畫素所佔比例初始化為0
	piexs_sum=r*c;	#整個弧度圖的畫素個數為r*c
	
	#遍歷灰度圖的所有畫素
	for row in gray_img:
		for colum in row:
			if colum<40:	#人為設定的超引數,表示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:	#人為設定的超引數:表示若偏暗畫素所佔比例超過0.78,則這張圖被認為整體環境黑暗的圖片
		print(pic_path+" is dark!");
		cv2.imwrite("../DarkPicDir/"+pic,img);#把被認為黑暗的圖片儲存
	else:
		print(pic_path+" is bright!")
	#hist(pic_path); #若要檢視圖片的灰度值分佈情況,可以這個註釋解除
 
#用於顯示圖片的灰度直方圖
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,256])
	plt.show()
	
#讀取給定目錄的所有圖片
def readAllPictures(pics_path):
	if not os.path.exists(pics_path):
		print("路徑錯誤,路徑不存在!")
		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);
	return allPics;
 
#建立用於存放黑暗圖片的目錄
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);

執行命令: python3 cal.py 圖片集的路徑名

(其中cal.py 是python程式碼的檔名)

執行結果:

python3+opencv 使用灰度直方圖來判斷圖片的亮暗操作

然後進入裝黑暗圖片的目錄裡,就會看到從空目錄變成裝有黑暗圖片:

python3+opencv 使用灰度直方圖來判斷圖片的亮暗操作

以上這篇python3+opencv 使用灰度直方圖來判斷圖片的亮暗操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。