人脸清晰度评价指标

参考链接:

https://blog.csdn.net/Real_Myth/article/details/50827940

https://blog.csdn.net/gaoyi221119/article/details/103782288


训练方法:svm
数据集:80-100人,1w+张眼睛ROI区域
准确度:0.98
特征:梯度(Sobel算子计算不同角度的梯度)、tenengrad函数(也是sobel计算梯度)、灰度值sort
其他尝试特征:Brenner梯度函数、SMD2(灰度方差乘积)、峰度(kurtosis)、频率谱(frequency)


实现步骤:先截取眼睛ROI区域,然后针对roi进行特征提取,再把特征放到svm进行训练和预测。

1.截取眼睛ROI区域图片 

import glob
from PIL import Image
import os
import numpy as np
import xlrd
import xlutils.copy
import dlib
import cv2
from PIL import Image
import numpy as np
import time
import imutils


def get_roi(img,arr):
    image=np.copy(img)

    # roi1--眼睛
    left_point1 = (arr[17][0], arr[17][1])
    left_point2 = (arr[21][0], arr[28][1])

    left_w=left_point2[0] - left_point1[0]
    left_h=left_point2[1] - left_point1[1]


    # # roi2--眉毛
    # left_point1 = (arr[18][0], arr[19][1]-30)
    # left_point2 = (arr[21][0], arr[17][1])

    # left_w=left_point2[0] - left_point1[0]
    # left_h=left_point2[1] - left_point1[1]

    crop_left = image[left_point1[1]:left_point1[1]+left_h, left_point1[0]:left_point1[0]+left_w]
    # crop_right = image[right_point1[1]:right_point1[1]+right_h, right_point1[0]:right_point1[0]+right_w]

    return crop_left
   
def face_detect(pic):
    detector = dlib.get_frontal_face_detector()
    predictor = dlib.shape_predictor('class/shape_predictor_68_face_landmarks.dat')
    img = np.copy(pic)
    # img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

    # 人脸数rects
    points = []
    rects = detector(img, 1)
    if len(rects)!=1:
        print("face detection fail!")
        
    else:
        landmarks = np.matrix([[p.x, p.y] for p in predictor(img, rects[0]).parts()])
        for idx, point in enumerate(landmarks):
            x = point[0, 0]
            y = point[0, 1]
            points.append([x, y])
        
            # 画图和点
            cv2.circle(img, (x,y), 9, (0, 255, 0), thickness=-1, lineType=cv2.FILLED)
            cv2.putText(img, str(idx), (x,y), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 0, 255), 2,cv2.LINE_AA)

    return img, np.array(points)



n=0
path = "img/0/"
save="img/1/"
for root,dirs,files in os.walk(path):
    for file in files:
        if file.endswith('jpg'):
            file_name=root+"/"+file
            n+=1
            # 人脸检测,获取坐标点
            pic=cv2.imread(file_name)
            img_face,point=face_detect(pic)   #人脸检测
            
            if len(point)!=0:
                print(n,file,point.shape)
                # 1.获取眼睛roi
                crop_left=get_roi(pic,point)
                cv2.imwrite(save+file,crop_left)

2. 计算特征1_tenengrad1

Step1:截取眼睛roi  (dlib库)

Step2:进行肤色归一化(先选定一张图作为标准,然后与其对比rgb,再加上两者平均差距,实现肤色归一化)

Step3:转灰度图,计算tenengrad1指标的值

import glob
from PIL import Image
import os
import numpy as np
import xlrd
import xlutils.copy
import dlib
import cv2
from PIL import Image
import numpy as np
import time
import imutils
import matplotlib.pyplot as plt
import shutil

# 3.tenengrad
def tenengrad1(img, ksize=3):
    Gx = cv2.Sobel(img, ddepth=cv2.CV_64F, dx=1, dy=0, ksize=ksize)
    Gy = cv2.Sobel(img, ddepth=cv2.CV_64F, dx=0, dy=1, ksize=ksize)
    FM = Gx*Gx + Gy*Gy
    mn = cv2.mean(FM)[0]

    # # 方法2
    # mn=0
    # w, h = FM.shape
    # for i in range(w):
    #     for j in range(h):
    #         mn+=math.sqrt(FM[i,j])
    
    if np.isnan(mn):
        return np.nanmean(FM)
    return mn

def get_rgb(img):
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    size = img.shape
    width = size[0]
    height = size[1]
    list_b = []
    list_g = []
    list_r = []
    for i in range(0, width):  # 遍历所有长度的点
        for j in range(0, height):  # 遍历所有宽度的点
            if gray[i,j]>=40 and gray[i,j]<=230:
                list_b.append(img[i, j][0])
                list_g.append(img[i, j][1])
                list_r.append(img[i, j][2])

    avg_b = np.mean(list_b)
    avg_g = np.mean(list_g)
    avg_r = np.mean(list_r)
    return avg_b, avg_g, avg_r

def change_rgb(img,dif_b,dif_g,dif_r):
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    size = img.shape
    width = size[0]
    height = size[1]
    list_b = []
    list_g = []
    list_r = []

    for i in range(0, width):  # 遍历所有长度的点
        for j in range(0, height):  # 遍历所有宽度的点
            # if gray[i, j] > 5 and gray[i, j] < 230:  # 排除白色的点
            b=img[i, j][0]
            g=img[i, j][1]
            r=img[i, j][2]
            new_b = b+dif_b
            new_g = g+dif_g
            new_r = r+dif_r

            if new_b>=256 or new_b<=0:
                img[i, j][0]=b
            else:
                img[i, j][0]=new_b

            if new_g>=256 or new_g<=0:
                img[i, j][1]=g
            else:
                img[i,j][1]=new_g
            if new_r>=256 or new_r<=0:
                img[i, j][2]=r
            else:
                img[i, j][2]=new_r
    return img

def get_roi(img,arr):
    image=np.copy(img)

    # roi1--眼睛
    left_point1 = (arr[17][0], arr[17][1])
    left_point2 = (arr[21][0], arr[28][1])
    right_point1 = (arr[22][0], arr[22][1])
    right_point2 = (arr[26][0], arr[28][1])

    left_w=left_point2[0] - left_point1[0]
    left_h=left_point2[1] - left_point1[1]
    right_w=right_point2[0] - right_point1[0]
    right_h=right_point2[1] - right_point1[1]

    crop_left = image[left_point1[1]:left_point1[1]+left_h, left_point1[0]:left_point1[0]+left_w]
    crop_right = image[right_point1[1]:right_point1[1]+right_h, right_point1[0]:right_point1[0]+right_w]

    return crop_left,crop_right
   
def face_detect(pic):
    detector = dlib.get_frontal_face_detector()
    predictor = dlib.shape_predictor('class/shape_predictor_68_face_landmarks.dat')
    img = np.copy(pic)
    # img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

    # 人脸数rects
    points = []
    rects = detector(img, 1)
    if len(rects)!=1:
        print("face detection fail!")
        
    else:
        landmarks = np.matrix([[p.x, p.y] for p in predictor(img, rects[0]).parts()])
        for idx, point in enumerate(landmarks):
            x = point[0, 0]
            y = point[0, 1]
            points.append([x, y])
        
            # 画图和点
            cv2.circle(img, (x,y), 9, (0, 255, 0), thickness=-1, lineType=cv2.FILLED)
            cv2.putText(img, str(idx), (x,y), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 0, 255), 2,cv2.LINE_AA)

    return img, np.array(points)


x=[]
y=[]
n=0
path = "img/data2/class/7/"
for root,dirs,files in os.walk(path):
    for file in files:
        if file.endswith('jpg'):
            file_name=root+"/"+file
            n+=1

            # 3.计算tenengrad1
            img=cv2.imread(file_name)
            gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
            fm3=tenengrad1(gray)
            print(file,fm3)

            # save_name="img/data2/0/"+str(int(fm3))+"_"+file
            # shutil.copy(path+file,save_name)

            x.append(n)
            y.append(fm3)

# #画图
# # plt.subplots(1, 1)
# plt.rcParams['font.sans-serif'] = ['SimHei']#可以plt绘图过程中中文无法显示的问题
# plt.plot(x,y,linewidth = '2', label = "--", linestyle='-', marker=' ')    #画图

#     # plt.savefig(save+file.split(".")[0]+".png")
# # plt.legend(loc='upper left')#显示图例,如果注释改行,即使设置了图例仍然不显示
# plt.show()

3.计算特征2_梯度(常规梯度)

import cv2
import numpy as np
from PIL import Image
import os
import shutil
import matplotlib.pyplot as plt

def del_back(gray,sobelx):
    w=gray.shape[0]
    h=gray.shape[1]

    data=[]
    a=[]
    b=[]
    for i in range(w):
        for j in range(h):
            if gray[i,j]>30 and sobelx[i,j]<250:
                data.append(sobelx[i,j])

    return data

def get_grad(file_name,angel):
    # 读取图片
    gray = Image.open(file_name).convert('L')

    # 旋转图片
    # angle=[30,60,90,120,150,180]
    gray = gray.rotate(angel)
    gray=np.array(gray)

    # 计算梯度
    sobelx=cv2.Sobel(gray,cv2.CV_64F,dx=1,dy=0)
    sobelx=cv2.convertScaleAbs(sobelx)

    data=del_back(gray,sobelx)
    grad1=np.mean(data)
    grad2=np.var(data)
    
    # cv2.imshow("img2",gray)
    # cv2.waitKey(0)

    return grad1,grad2

x=[]
y=[]
n=0
path="img/1/"
for file in os.listdir(path):
    file_name=path+file
    
    mean=[]
    var=[]
    list=[0]
    # list=[0,30,60,90,120,150]
    for angle in list:
        grad1, grad2=get_grad(file_name,angle)
        mean.append(grad1)
        var.append(grad2)
        print(file,grad1,grad2)

    # dif_mean=max(mean)-min(mean)
    # dif_var=max(var)-min(var)
    # print(file,dif_mean,dif_var)

    # save_name="img/data2/0/"+str(int(grad1))+"_"+file
    # shutil.copy(path+file,save_name)
    # print(save_name)

    n+=1
    x.append(n)
    y.append(grad1)


# #画图
# # plt.subplots(1, 1)
# plt.rcParams['font.sans-serif'] = ['SimHei']#可以plt绘图过程中中文无法显示的问题
# plt.plot(x,y,linewidth = '2', label = file.split(".")[0], linestyle='-', marker=' ')    #画图

#     # plt.savefig(save+file.split(".")[0]+".png")
# # plt.legend(loc='upper left')#显示图例,如果注释改行,即使设置了图例仍然不显示
# plt.show()

4.计算特征3_灰度值sort

Step1:图片转灰度,遍历所有像素点的值

Step2:把所有像素点排序,取1/5000点的值

Step3:若1/5000点的值<20则图片清晰,>30则图片模糊;在20-30之间则进入第二步计算,二次计算返回的值与原值进行对比,若<15则判断模糊,赋值30.5;若>15则判定清晰,赋值19.5。

import numpy as np
import cv2
import os
import matplotlib.pyplot as plt
import shutil

def get_gray(file_name):
	#读取图片,转灰度
	img=cv2.imread(file_name)
	gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

	w=gray.shape[0]
	h=gray.shape[1]
	total=w*h
	# 获取所有像素点的灰度值
	data=[]
	for i in range(w):
		for j in range(h):
			data.append(gray[i,j])

	# 排序,返回0%-99%的点
	data.sort(reverse=False)
	index=int(total*(1/5000))
	value=data[index]

	return value

def dilate(file_name,value):
	#读取图片,转灰度
	img=cv2.imread(file_name)
	img2=np.copy(img)
	gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
	w=gray.shape[0]
	h=gray.shape[1]

	# 二值化
	thrd_img=np.copy(gray)
	for i in range(w):
		for j in range(h):
			if thrd_img[i,j]<=value:
				thrd_img[i,j]=255
			else:
				thrd_img[i,j]=0

	# 执行膨胀
	kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (11, 11))
	dilate = cv2.dilate(thrd_img, kernel)

	# 膨胀—二值化图
	result=dilate-thrd_img

	# 计算膨胀出来的点,在灰度图上的均值
	dilate_data=[]
	for i in range(w):
		for j in range(h):
			if result[i,j]==255:
				dilate_data.append(gray[i,j])
				img2[i,j]=255
	avg=np.mean(dilate_data)

	# cv2.imshow("src",img)			
	# cv2.imshow("thrd_img",thrd_img)
	# cv2.imshow("dilate",dilate)
	# cv2.imshow("result",result)
	# cv2.imshow("img2",img2)
	# cv2.waitKey(0)

	return avg,img

x=[]
y=[]
n=0
path="img/data2/class-roi/"
for file in os.listdir(path):
	file_name=path+file
	# 1.计算灰度sort
	value=get_gray(file_name)
	# print(value)

	avg,img=dilate(file_name,value)   #进行二次计算,膨胀
	dif=avg-value
	
	n+=1
	x.append(n)
	y.append(dif)
	print(file,value,dif)
	
	# save_name="img/data2/sort/"+str(int(dif))+"_"+file
	# shutil.copy(path+file,save_name)

#画图
# plt.subplots(1, 1)
plt.rcParams['font.sans-serif'] = ['SimHei']#可以plt绘图过程中中文无法显示的问题
plt.plot(x,y,linewidth = '2', label = "ss", linestyle='-', marker=' ')    #画图

	# plt.savefig(save+file.split(".")[0]+".png")
# plt.legend(loc='upper left')#显示图例,如果注释改行,即使设置了图例仍然不显示
plt.show()

备注:其他尝试方法

import cv2
import numpy as np
import math
import time
import os
from skimage import filters
from scipy import stats
import pandas as pd
import matplotlib.pyplot as plt

# 1.Brenner 梯度函数
def brenner(img):
    shape = np.shape(img)
    out = 0
    for x in range(0, shape[0]-2):
    	for y in range(0, shape[1]):
            out+=(int(img[x+2,y])-int(img[x,y]))**2
    return out

# 2.SMD2(灰度方差乘积)
def SMD2(img):
	shape = np.shape(img)
	out = 0
	for x in range(0, shape[0]-1):
	    for y in range(0, shape[1]-1):
	        out+=math.fabs(int(img[x,y]) - int(img[x+1,y])) * math.fabs(int(img[x,y] - int(img[x,y+1])))
	return out

# 3.tenengrad
def tenengrad1(img, ksize=3):
    Gx = cv2.Sobel(img, ddepth=cv2.CV_64F, dx=1, dy=0, ksize=ksize)
    Gy = cv2.Sobel(img, ddepth=cv2.CV_64F, dx=0, dy=1, ksize=ksize)
    FM = Gx*Gx + Gy*Gy
    mn = cv2.mean(FM)[0]

    # # 方法2
    # mn=0
    # w, h = FM.shape
    # for i in range(w):
    #     for j in range(h):
    #         mn+=math.sqrt(FM[i,j])
    
    if np.isnan(mn):
        return np.nanmean(FM)
    return mn

def tenengrad2(img):
    f = np.matrix(img)

    tmp = filters.sobel(f)
    source=np.sum(tmp**2)
    source=np.sqrt(source)

    return source

# 5.Kurtosis 梯度函数
def kurtosis(img):
    shape = np.shape(img)
    N=shape[0]*shape[1]   #N个点

    data=[]
    for x in range(0, shape[0]):
        for y in range(0, shape[1]):
            data.append(int(img[x,y]))

    avg=sum(data)/N
    s4=np.std(data)**4   #标准差(4次方)

    data2=[]
    for x in range(0, shape[0]):
        for y in range(0, shape[1]):
            data2.append(abs((img[x,y]-avg))**4)
            
    out1=sum(data2)/N
    out=out1/s4-3
    
    kurtosis = stats.kurtosis(data)
    # print(kurtosis)
    
    return kurtosis

def frequency(img):
    # 转换傅里叶
    f = np.fft.fft2(img)
    fshift = np.fft.fftshift(f)
    result = 20*np.log(np.abs(fshift))
    # print(result.shape)


    num=15   #画圆圈数量
    x0=int(result.shape[0]/2)   #中心点x
    y0=int(result.shape[1]/2)   #中心点y
    r0=int(min(x0,y0)/num)   #每次半径的涨幅


    x=[]
    y=[]
    for i in range(1,num):
        r=r0*i   #半径
        data=[]
        #每隔angle度,算一次坐标点
        for angle in range(0,360,36):
            x1 = int(x0 + r * np.cos(angle * np.pi / 180))
            y1 = int(y0 + r * np.sin(angle * np.pi / 180))
            data.append(result[x1,y1])   #极坐标的傅里叶值

        avg=int(np.mean(data))    #极坐标的均值
        x.append(r)
        y.append(avg)

    x = np.array(x)
    xx = pd.DataFrame({"k": x})
    yy = pd.Series(y)
    res = pd.ols(y=yy, x=xx)


    # #建立对象
    # fig = plt.figure(figsize=(8,6))
    # ax = fig.add_subplot()
    #
    # #画图
    # plt.plot(x,y,'o-',label=u"线条")    #画图
    # plt.show()
    
    return  res.beta[0]


# 5项指标:SMD2/Brenner/Tenengrad/峰度(kurtosis)/频率谱(frequency)
f1=open('img3/cut/clear_left.txt',"w+")
path='img3/cut/clear/'
for file in os.listdir(path):
    start=time.time()

    img=cv2.imread(path+file)
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
	# print(img.shape,gray.shape)
   
    # fm1=brenner(gray)
    # fm2=SMD2(gray)
    fm3=tenengrad1(gray)
    # fm4=tenengrad2(gray)
    # fm5=kurtosis(gray)
    # fm6=frequency(gray)
    # print(file, "brenner:",fm1,"smd2:",fm2,"tenengrad1:",fm3,"tenengrad2:",fm4,"kurtosis:",fm5,"frequency:",fm6)
    
    end=time.time()-start
    print("耗时:",end)

    f1.write(file+'  '+str(fm3)+'  \n')
    # f1.write(file+'  '+str(fm1)+'  '+str(fm2)+'  '+str(fm3)+'  '+str(fm4)+'  '+str(fm5)+'  '+str(fm6)+'  \n')
f1.close()

肤色归一化:

# -*- coding:utf-8 -*-
import cv2
import numpy as np
import os

def get_rgb(img):
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    size = img.shape
    width = size[0]
    height = size[1]
    list_b = []
    list_g = []
    list_r = []
    for i in range(0, width):  # 遍历所有长度的点
        for j in range(0, height):  # 遍历所有宽度的点
            if gray[i,j]>=40 and gray[i,j]<=230:
                list_b.append(img[i, j][0])
                list_g.append(img[i, j][1])
                list_r.append(img[i, j][2])

    avg_b = np.mean(list_b)
    avg_g = np.mean(list_g)
    avg_r = np.mean(list_r)
    return avg_b, avg_g, avg_r

def change_rgb(img,save_path,dif_b,dif_g,dif_r):
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    size = img.shape
    width = size[0]
    height = size[1]
    list_b = []
    list_g = []
    list_r = []

    for i in range(0, width):  # 遍历所有长度的点
        for j in range(0, height):  # 遍历所有宽度的点
            # if gray[i, j] > 5 and gray[i, j] < 230:  # 排除白色的点
            b=img[i, j][0]
            g=img[i, j][1]
            r=img[i, j][2]
            new_b = b+dif_b
            new_g = g+dif_g
            new_r = r+dif_r

            if new_b>=256 or new_b<=0:
                img[i, j][0]=b
            else:
                img[i, j][0]=new_b

            if new_g>=256 or new_g<=0:
                img[i, j][1]=g
            else:
                img[i,j][1]=new_g
            if new_r>=256 or new_r<=0:
                img[i, j][2]=r
            else:
                img[i, j][2]=new_r
    cv2.imwrite(save_name, img)


# 读取图片,计算bgr
img1 = cv2.imread("img3/0.jpg", cv2.IMREAD_UNCHANGED)
bgr1=get_rgb(img1)
# print(bgr1)
w=500
h=250

n=0
path="img3/cut/blur/"
save_path="img3/cut2/blur/"
for file in os.listdir(path):
    if file.endswith("jpg"):
        file_name=path+file
        img2 = cv2.imread(file_name)
        w1=img2.shape[1]
        h1=img2.shape[0]
        
        n+=1
        img2=cv2.resize(img2,(w,h))
        bgr2 = get_rgb(img2)
        
        # 计算差距
        dif_b = bgr1[0] - bgr2[0]
        dif_g = bgr1[1] - bgr2[1]
        dif_r = bgr1[2] - bgr2[2]
        
        print(n, dif_b, dif_g, dif_r)
        save_name = save_path + file
        change_rgb(img2, save_name, dif_b, dif_g, dif_r)

        # if w1>=w and h1>=h:
        #     n+=1
        #     # img2=img2[0:h,0:w]
        #     img2=cv2.resize(img2,(w,h))
        #     bgr2=get_rgb(img2)

        #     #计算差距
        #     dif_b=bgr1[0]-bgr2[0]
        #     dif_g=bgr1[1]-bgr2[1]
        #     dif_r=bgr1[2]-bgr2[2]

        #     print(n,dif_b,dif_g,dif_r)
        #     save_name=save_path+file
        #     change_rgb(img2,save_name,dif_b,dif_g,dif_r)

灰度值排序:

import numpy as np
import cv2
import os
import matplotlib.pyplot as plt


def get_gray(file_name):
	#读取图片,转灰度
	img=cv2.imread(file_name)
	gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

	w=gray.shape[0]
	h=gray.shape[1]
	total=w*h
	# 获取所有像素点的灰度值
	data=[]
	for i in range(w):
		for j in range(h):
			data.append(gray[i,j])

	# 排序,返回0%-99%的点
	data.sort(reverse=False)
	index=int(total*(1/5000))
	value=data[index]

	return value

def dilate(file_name,value):
	#读取图片,转灰度
	img=cv2.imread(file_name)
	gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
	w=gray.shape[0]
	h=gray.shape[1]

	# 二值化
	thrd_img=np.copy(gray)
	for i in range(w):
		for j in range(h):
			if thrd_img[i,j]<=value:
				thrd_img[i,j]=255
			else:
				thrd_img[i,j]=0

	# 执行膨胀
	kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (11, 11))
	dilate = cv2.dilate(thrd_img, kernel)

	# 膨胀—二值化图
	result=dilate-thrd_img

	# 计算膨胀出来的点,在灰度图上的均值
	dilate_data=[]
	for i in range(w):
		for j in range(h):
			if result[i,j]==255:
				dilate_data.append(gray[i,j])
	avg=np.mean(dilate_data)

	# cv2.imshow("src",img)			
	# cv2.imshow("thrd_img",thrd_img)
	# cv2.imshow("dilate",dilate)
	# cv2.imshow("result",result)

	return avg,img

x=[]
y=[]
n=0
path="img3/cut/0/"
save="img_100/eye/clear/0/"
for file in os.listdir(path):
	file_name=path+file
	# 1.计算灰度sort
	value=get_gray(file_name)
	if value<20 or value>30:   #第一次判断阈值:<20清晰,>30模糊
		fm=value
	else:
		avg,img=dilate(file_name,value)   #进行二次计算,膨胀
		dif=avg-value
		print("add:",avg-value)
		# 第二次判断阈值:15,<15模糊,>15清晰
		if dif>15:
			fm=19.5
		else:
			fm=30.5
		# cv2.imwrite(save+file.split(".")[0]+"___old_"+str(value)+"_new_"+str(int(avg))+"_add_"+str(int(avg-value))+".jpg",img)
	
# 	n+=1
# 	x.append(n)
# 	y.append(fm)
	

# #画图
# # plt.subplots(1, 1)
# plt.rcParams['font.sans-serif'] = ['SimHei']#可以plt绘图过程中中文无法显示的问题
# plt.plot(x,y,linewidth = '2', label = file.split(".")[0], linestyle='-', marker=' ')    #画图

# 	# plt.savefig(save+file.split(".")[0]+".png")
# # plt.legend(loc='upper left')#显示图例,如果注释改行,即使设置了图例仍然不显示
# plt.show()

膨胀均值:

import numpy as np
import cv2
import os
import matplotlib.pyplot as plt


def get_gray(file_name):
	#读取图片,转灰度
	img=cv2.imread(file_name)
	gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

	w=gray.shape[0]
	h=gray.shape[1]
	total=w*h
	# 获取所有像素点的灰度值
	data=[]
	for i in range(w):
		for j in range(h):
			data.append(gray[i,j])

	# 排序,返回0%-99%的点
	data.sort(reverse=False)
	index=int(total*(1/5000))
	value=data[index]

	return value

def dilate(file_name,value):
	#读取图片,转灰度
	img=cv2.imread(file_name)
	gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
	w=gray.shape[0]
	h=gray.shape[1]

	# 二值化
	thrd_img=np.copy(gray)
	for i in range(w):
		for j in range(h):
			if thrd_img[i,j]<=value:
				thrd_img[i,j]=255
			else:
				thrd_img[i,j]=0

	# 执行膨胀
	kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (11, 11))
	dilate = cv2.dilate(thrd_img, kernel)

	# 膨胀—二值化图
	result=dilate-thrd_img

	# 计算膨胀出来的点,在灰度图上的均值
	dilate_data=[]
	for i in range(w):
		for j in range(h):
			if result[i,j]==255:
				dilate_data.append(gray[i,j])
	avg=np.mean(dilate_data)

	# cv2.imshow("src",img)			
	# cv2.imshow("thrd_img",thrd_img)
	# cv2.imshow("dilate",dilate)
	# cv2.imshow("result",result)

	return avg,img


a=[]
path="img3/cut/error/clear/"
save="img3/cut/error/clear2/gray/"
for file in os.listdir(path):
	file_name=path+file
	value=get_gray(file_name)
	avg,img=dilate(file_name,value)

	cv2.imwrite(save+file.split(".")[0]+"___old_"+str(value)+"_new_"+str(int(avg))+"_add_"+str(int(avg-value))+".jpg",img)
	print(value,avg,avg-value)

# cv2.waitKey(0)

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值