• 图像处理:模糊图像判断


    目录

    上期回顾

    采用Laplace算子的原因

    实现的效果

    图片素材

    代码的展示与讲解

    效果展示

    项目资源


    上期回顾

    上一次的图像清晰度评价没有成功,主要的原因是那几张图像清晰度评价函数都实际都采用了梯度求解,不同的场景灰度的明暗不同,梯度可能会很大,无法得到一个界定值来判定图像的清晰度,所以这次我打算只对动态模糊的图像进行判断,是否是动态模糊图像。

    图像处理:图像清晰度评价

    采用Laplace算子的原因

    根据我之前的一个调研,在清晰度评价函数当中,我决定采用Laplace算子,因为它所得到的梯度值较小,容易获得一个模糊判断区间,而其他的几种所获得的梯度值较大,相应的误差范围也将更高,而且在opencv当中就集成了Laplace算子,很轻松就能调用,并得到一个很好的结果。

    实现的效果

    本次将会使用一组模糊图像和一组标准图像获得模糊判定区间(a,b),我们知道梯度值越大,图像越清晰,所以当我们进行测试一张图像时,它所返回的梯度值小于a,则可以说明它是一个模糊的图像,当返回的梯度值大于b时,则可以说明它是一个清晰的图像,而当返回的梯度值落在了a与b之间,我们也将其放在模糊图像当中。

    图片素材

    我自己采用的是手机拍摄的照片,分辨率都是1280*960,请注意图像的尺寸与场景会影响返回的梯度值,但我们通常采集的数据都是由相机拍摄,尺寸相同,工业上采用道路裂缝检测的场景基本类似,所以有研究的意义。

    代码的展示与讲解

    1. import cv2
    2. import os
    3. def getPhotopath(paths):
    4. imgfile = []
    5. file_list=os.listdir(paths)
    6. for i in file_list:
    7. newph=os.path.join(paths,i)
    8. imgfile.append(newph)
    9. return imgfile
    10. def getImgVar(image):
    11. imggray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    12. imageVar = cv2.Laplacian(imggray, cv2.CV_64F).var()
    13. return imageVar
    14. def getTest(imgfile):
    15. c = []
    16. for i in imgfile:
    17. # print(i)
    18. img=cv2.imread(i)
    19. image=getImgVar(img)
    20. # print(image)
    21. c.append(float(f"{image:.3f}"))
    22. if 'test' in imgfile[0]: #对测试集数据进行反转
    23. c.sort(reverse=True)
    24. else:
    25. c.sort()
    26. return c
    27. def getThr():
    28. a=getTest(imgfile1)
    29. b=getTest(imgfile2)
    30. thr=(a[0],b[0])
    31. # print(thr)
    32. return thr
    33. path1="./test" #测试的数据集文件夹位置
    34. path2="./Standards" #标准图的数据文件夹位置
    35. #获取文件下的名称
    36. imgfile1=getPhotopath(path1)
    37. imgfile2=getPhotopath(path2)
    38. #获得阈值
    39. minThr,maxThr=getThr()
    40. print(minThr,maxThr)
    41. def vagueJudge(image):
    42. img = cv2.imread(image)
    43. imgVar = getImgVar(img)
    44. if imgVar>maxThr:
    45. cv2.putText(img, f"Not Vague{imgVar:.2f}", (12, 70), cv2.FONT_HERSHEY_PLAIN, 3,
    46. (255, 0, 0), 3)
    47. else:
    48. cv2.putText(img, f"Vague{imgVar:.2f}", (12, 70), cv2.FONT_HERSHEY_PLAIN, 3,
    49. (255, 0, 0), 3)
    50. cv2.imshow("img",img)
    51. k=cv2.waitKey(0) & 0xFF
    52. image="./Standards/001.jpg" #需要进行测试的图片
    53. 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:img-processing-techniques/Sharpness_evaluation/Image processing:fuzzy image judgment at main · Auorui/img-processing-techniques (github.com)

    所有资源上传在了GitHub上。 

  • 相关阅读:
    RS232协议、RS485协议
    十五、异常(4)
    如何运用 Kyligence 综合对比餐饮门店的销售能力?
    【音视频】ffplay解析-音视频同步
    vue3 + typescript + vite + naive ui + tailwindcss + jsx 仿苹果桌面系统
    计算机内功内功修炼:信息的表示与和处理
    链表(3):双链表
    C#教程12:结构
    基于STM32实现USB组合设备CDC+MSC正确打开方式
    React antd组件Checkbox.Group单选实现
  • 原文地址:https://blog.csdn.net/m0_62919535/article/details/128061017