Roberts算子图像清晰度评价
1、算法简介
Roberts算子由两个3x3的矩阵组成,分别用于检测水平和垂直方向的边缘。这两个矩阵分别是:
1.水平方向(Gx):
[1amp;0 0amp;−1]
2.垂直方向(Gy):
[0amp;1 −1amp;0]
2.应用Roberts算子:
对图像中的每个像素,将上述两个算子分别与该像素及其周围的像素进行卷积操作,卷积操作的结果给出了该像素在水平和垂直方向上的梯度分量
3.计算梯度幅度:
1.对于每个像素,计算水平和垂直梯度分量的平方和,然后取平方根,得到梯度幅度:
gradient_magnitude=Gx2+Gy2
2.梯度幅度表示了图像在该像素的边缘强度
4.归一化幅度:
梯度幅度会被归一化到0-255的范围内,以便于处理和可视化
评估图像清晰度:
1.清晰度指标:图像的清晰度可以通过计算图像中所有像素的梯度幅度平均值进行评估,梯度幅度搞得区域通常表示图像的边缘或细节,因此梯度幅度平均值越高,图像越清晰。
2.阈值分割:设置一个阈值,将梯度幅度高于阈值的区域视为清晰,低于阈值的区域视为模糊
代码展示:
1、导入库:
import cv2 #OpenCV库,用于图像处理
import numpy as np #用于数值计算的库
from PIL import Image #(Python imaging Library 用于图像处理)
import os #用于文件和目录操作
2、设置基础路径:
base_path = r'图像文件路径' #变量设置了包含图像的文件夹路径
3、定义load_image_as_grayscale函数:
接收一个图像路径,使用PIL库加载图像,并将其转换为灰度图像。
然后将图像转换为Numpy数组,并归一化到0-1范围
def load_image_as_grayscale(img_path):
#使用PIL加载图像
image = Image.open(img_path).convert('L') #转换为灰度图像
img = np.array(image,dtype=np.unit8)
img = img.astype(np.float32) / 255.0
return img
4、定义roberts函数:
def roberts_gradient(image):
#定义roberts算子
kernel_x = np.array([[1,0],[0,-1]],dtype=np.float32) #计算对角线方向梯度
kernel_y = np.array([[0,1],[-1,0]],dtype=np.float32) #计算另一个对角线方向梯度
#使用filter2D函数应用Roberts算子
gx = cv2.filter2D(image,-1,kernel_x)
gy = cv2.filter2D(image,-1,kernel_y)
#计算梯度幅度
gradient_magnitude = np.sqrt(gx**2 + gy**2)
#归一化到0-255
gradient_magnitude = (gradient_magnitude - np.min(gradient_magnitude)) * 255 / (np.max(gradient_magnitude) - np.min(gradient_magnitude))
gradient_magnitude = np.unit8(np.clip(gradient_magnitude,0,255))
return gradient_magnitude
5、初始化列表
results_roberts_gradient = [] #储存roberts_gradient值的列表
6、遍历文件夹中的图像
for filename in os.listdir(base_path):
if filename.endswith('.jpg'): #或者其他你需要的图片格式
img_path = os.path.join(base_path,filename)
img = load_image_as_grayscale(img_path)
roberts_gradient_score = roberts_gradient(img) #使用roberts_gradient函数计算roberts_gradient值
prient("file name = {} result = {}".format(filename, np.mean(roberts_gradient_sccore))) #打印平均梯度值作为示例
results_roberts_gradient.append((filename, np.mean(roberts_gradient_score))) #假设我们使用梯度的平均值作为清晰度分数,并添加到列表中
results_roberts_gradient.sort(key=lambda x: x[1],reverse = True) #假设roberts_gradient值越高,图像越清晰
7、计算每个图像的roberts梯度
threshold = np.mean([result[1] for result in results_roberts_gradient])
clear_images = [result for result in results_roberts_gradient if result[1] >= threshold]
unclear_images = [result for result in results_roberts_gradient if result[1] < threshold]
8、排序和分类图像
根据roberts梯度平均值对结果列表进行排序,分别打印清晰和不清晰图像的文件名和梯度值
print("\n清晰图像:")
for filename, score in clear_images:
print(f"File:{filename},Score:{score}")
print("\n 不清晰图像:")
for filename ,score in unclear_images:
print(f"File:{filename},Score:{score})