目录
上期回顾
上一次的图像清晰度评价没有成功,主要的原因是那几张图像清晰度评价函数都实际都采用了梯度求解,不同的场景灰度的明暗不同,梯度可能会很大,无法得到一个界定值来判定图像的清晰度,所以这次我打算只对动态模糊的图像进行判断,是否是动态模糊图像。
采用Laplace算子的原因
根据我之前的一个调研,在清晰度评价函数当中,我决定采用Laplace算子,因为它所得到的梯度值较小,容易获得一个模糊判断区间,而其他的几种所获得的梯度值较大,相应的误差范围也将更高,而且在opencv当中就集成了Laplace算子,很轻松就能调用,并得到一个很好的结果。
实现的效果
本次将会使用一组模糊图像和一组标准图像获得模糊判定区间(a,b),我们知道梯度值越大,图像越清晰,所以当我们进行测试一张图像时,它所返回的梯度值小于a,则可以说明它是一个模糊的图像,当返回的梯度值大于b时,则可以说明它是一个清晰的图像,而当返回的梯度值落在了a与b之间,我们也将其放在模糊图像当中。
图片素材
我自己采用的是手机拍摄的照片,分辨率都是1280*960,请注意图像的尺寸与场景会影响返回的梯度值,但我们通常采集的数据都是由相机拍摄,尺寸相同,工业上采用道路裂缝检测的场景基本类似,所以有研究的意义。
代码的展示与讲解
-
import cv2
-
import os
-
-
def
getPhotopath(
paths):
-
imgfile = []
-
file_list=os.listdir(paths)
-
for i
in file_list:
-
newph=os.path.join(paths,i)
-
imgfile.append(newph)
-
return imgfile
-
-
def
getImgVar(
image):
-
imggray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
-
imageVar = cv2.Laplacian(imggray, cv2.CV_64F).var()
-
return imageVar
-
-
def
getTest(
imgfile):
-
c = []
-
for i
in imgfile:
-
# print(i)
-
img=cv2.imread(i)
-
image=getImgVar(img)
-
# print(image)
-
c.append(
float(
f"{image:.3f}"))
-
if
'test'
in imgfile[
0]:
#对测试集数据进行反转
-
c.sort(reverse=
True)
-
else:
-
c.sort()
-
return c
-
-
def
getThr():
-
a=getTest(imgfile1)
-
b=getTest(imgfile2)
-
thr=(a[
0],b[
0])
-
# print(thr)
-
return thr
-
-
path1=
"./test"
#测试的数据集文件夹位置
-
path2=
"./Standards"
#标准图的数据文件夹位置
-
#获取文件下的名称
-
imgfile1=getPhotopath(path1)
-
imgfile2=getPhotopath(path2)
-
-
#获得阈值
-
minThr,maxThr=getThr()
-
print(minThr,maxThr)
-
-
def
vagueJudge(
image):
-
img = cv2.imread(image)
-
imgVar = getImgVar(img)
-
if imgVar>maxThr:
-
cv2.putText(img,
f"Not Vague{imgVar:.2f}", (
12,
70), cv2.FONT_HERSHEY_PLAIN,
3,
-
(
255,
0,
0),
3)
-
else:
-
cv2.putText(img,
f"Vague{imgVar:.2f}", (
12,
70), cv2.FONT_HERSHEY_PLAIN,
3,
-
(
255,
0,
0),
3)
-
cv2.imshow(
"img",img)
-
k=cv2.waitKey(
0) &
0xFF
-
image=
"./Standards/001.jpg"
#需要进行测试的图片
-
vagueJudge(image)
- getPhotopath函数:获得文件夹下各个图片路径,输入模糊图片的文件夹,输入标准图像的文件夹,存入列表当中。
- getImgVar函数:返回图像梯度值。
- getTest函数:对每个图像进行了梯度值计算后,存入列表当中,对模糊图像的进行列表序列翻转。
- def getThr函数:获得模糊判定区间(a,b)。
- vagueJudge函数:对新输入的图像进行模糊判定,只要小于b,就判定为模糊。
效果展示
由于我不想在拍摄新的图片,这里就采用./test文件和./Standards文件的图片。
控制台打印的模糊判定区间:
4.327 65.401
image="./Standards/001.jpg"
image="./test/01.jpg"
项目资源
所有资源上传在了GitHub上。
转载:https://blog.csdn.net/m0_62919535/article/details/128061017
查看评论