bsw215583320
2025-01-16 8446139d79c366fc2c44d72c2ddb963817a8ce7d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import os
 
import cv2
from scipy.fftpack import fftshift, fft2
import numpy as np
 
 
def variance_of_laplacian(image):
    # 计算输入图像的拉普拉斯响应的方差
    return cv2.Laplacian(image, cv2.CV_64F).var()
 
def frequency_domain_analysis(gray):
 
    # 计算傅里叶变换并移动到中心
    f_transform = fftshift(fft2(gray))
    # 计算频谱幅度
    magnitude_spectrum = 20 * np.log(np.abs(f_transform))
    # 计算高频成分的比例
    high_frequency_magnitude = np.sum(magnitude_spectrum > np.mean(magnitude_spectrum))
    total_magnitude = magnitude_spectrum.size
    ratio = high_frequency_magnitude / total_magnitude
    return ratio
def edge_gradient(gray):
 
    sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3)
    sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3)
    magnitude = np.sqrt(sobelx**2 + sobely**2)
    return np.mean(magnitude)
 
def testOne():
    # 加载图像并转换为灰度图
    image = cv2.imread('H:/images/1/20250114193113.jpg')
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
 
    # 计算图像的清晰度分数
    score = variance_of_laplacian(gray)
    ratio = frequency_domain_analysis(gray)
    edge_gradient_score = edge_gradient(gray)
 
    print("Image clarity score: ", score)
    print("High frequency ratio: ", ratio)
    print("Edge gradient score: ", edge_gradient_score)
 
    # 根据经验设置阈值来判断图像是否模糊
    threshold = 100  # 这个阈值可以根据实际情况调整
    if score < threshold:
        print("The image is considered blurry.")
    else:
        print("The image is considered clear.")
 
 
def batch_score():
    global name, join
    # 读取文件夹下的所有图像分别计算分数
    folder_path = 'H:/images/2'
    for filename in os.listdir(folder_path):
        if filename.endswith('.jpg') or filename.endswith('.png'):
            image_path = os.path.join(folder_path, filename)
            image = cv2.imread(image_path)
            gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
            score = variance_of_laplacian(gray)
            ratio = frequency_domain_analysis(gray)
            edge_gradient_score = edge_gradient(gray)
            # 所有结果保留两位小数
            score = round(score, 2)
            ratio = round(ratio, 2)
            edge_gradient_score = round(edge_gradient_score, 2)
            name = "score=" + str(score) + "ratio=" + str(ratio) + "edge_gradient_score=" + str(
                edge_gradient_score) + ".jpg"
            path_ = folder_path + "/22/"
            # 判断文件夹是否存在,不存在则新建
            if not os.path.exists(path_):
                os.makedirs(path_)
            join = path_ + name
            print(join)
            cv2.imwrite(join, image)
 
 
def cam_score():
    # 调用摄像头计算采集到图像的得分
    camera_index = 2
    print("第二个摄像头索引:" + str(camera_index))
    # 打开摄像头
    capture = cv2.VideoCapture(camera_index, cv2.CAP_DSHOW)
    # 设置分辨率
    capture.set(cv2.CAP_PROP_FRAME_WIDTH, 1921)
    capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 1081)
    # 检查摄像头是否成功打开
    if not capture.isOpened():
        print("无法打开摄像头2")
        exit()
    # 循环读取画面
    while True:
        ret, frame = capture.read()
        if not ret:
            print("无法读取摄像头画面")
            break
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 
        score = variance_of_laplacian(gray)
        # ratio = frequency_domain_analysis(gray)
        # edge_gradient_score = edge_gradient(gray)
        # 将FPS绘制在图像上
        cv2.putText(frame, f"score={str(score)}"
                    , (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA)
        # cv2.putText(frame, f"ratio={str(ratio)}"
        #             , (10, 70), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA)
        # cv2.putText(frame, f"edge_gradient_score={str(edge_gradient_score)}"
        #             , (10, 110), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA)
        # 显示画面
        cv2.imshow("Camera", frame)
        # 检测按键,如果按下q键则退出循环
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    # 关闭摄像头
    capture.release()
    # 关闭所有窗口
    cv2.destroyAllWindows()
 
 
if __name__ == '__main__':
    testOne()
    # batch_score()
    # cam_score()