你说什么都对

  • 首页
  • 技术
  • 工具分享
  1. 首页
  2. 技术
  3. Python
  4. 正文

使用python-opencv在图像中查找最亮点

2022年11月3日 134点热度 0人点赞 0条评论

Python,OpenCV找出图像中的最亮点

这篇博客将向您展示如何使用Python和OpenCV查找图像中的最亮点,以及应用单行预处理代码——高斯模糊以改善效果。

1. 原理

查找Python和OpenCV找到图像的最亮点,主要利用 cv2.minMaxLoc 方法。

使用cv2.minMaxLoc 找到的实际上不是一个区域——它只是整个图像中最亮的单个像素。

cv2.minMaxLoc找到的是整个图像中单个最亮的像素。 因此使用极易受到噪音的干扰。在正常情况下不会出现明亮像素的区域(在这种情况下,是视神经中枢以外的区域),单个明亮像素会大大降低检测的结果。

相反,最好检查图像的区域而不是单个像素。因为检查区域时可以让所有区域平均平衡,而不易受到噪音影响。

2. 优化

那么,如何在不显式检查图像的每个区域的情况下模仿这种“区域”效果呢?

  • 查找图像中最亮点的敏感方法是使用cv2.minMaxLoc,称其敏感的原因是该方法极易受噪音干扰(其他区域明亮的像素),可以通过预处理步骤应用 高斯模糊 解决。
  • 应用高斯模糊可以对给定半径内的像素进行平均,从而丢弃单个明亮像素。使鲁棒性方法正常工作的一个重要方面是正确设置半径尺寸。
  • 合理的设置高斯模糊半径值非常的重要,正确的设置半径尺寸能很好的保证该方法的鲁棒性;
  • 如果设置半径尺寸太小,将无法找到更大,更亮的图像区域。但是如果设置尺寸过大,那么将检测到太大的区域,而错过了较小的区域,从而导致结果不及预期。

3. 效果图

原始效果 VS 高斯优化后效果图

有噪音干扰时,原始效果 VS 高斯优化后图

原始效果左图 cv2.minMaxLoc 找到的只是最亮的像素点,所以很容易受高频噪音影响。优化是应用高斯模糊;

原始效果 VS 高斯优化后图

4. 源码

# USAGE
# python bright.py --image retina.png --radius 41
# python bright.py --image images/retina-noise.png --radius 41

# 导入必要的包
import numpy as np # 数值处理
import argparse # 命令行参数
import cv2 #绑定openCV

# 构建命令行参数并解析
# --image 照片路径
#  --radius 整数,应用于图像的高斯模糊的半径,必须是技术
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", help = "path to the image file")
ap.add_argument("-r", "--radius", type = int,
                help = "radius of Gaussian blur; must be odd")
args = vars(ap.parse_args())

# 加载图像,复制图像并转换为灰度图
image = cv2.imread(args["image"])
orig = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 查找图像中最亮点的敏感方法是使用cv2.minMaxLoc,称其敏感的原因是该方法极易受噪音干扰,可以通过预处理步骤应用高斯模糊解决。
# 寻找最小、最大像素强度所在的(x,y)
(minVal, maxVal, minLoc, maxLoc) = cv2.minMaxLoc(gray)
# 在最大像素上绘制空心蓝色圆圈
cv2.circle(image, maxLoc, 5, (255, 0, 0), 2)

# 展示该方法的结果
cv2.imshow("Naive", image)

# 使用cv2.minMaxLoc,如果不进行任何预处理,可能会非常容易受到噪音干扰。
# 相反,最好先对图像应用高斯模糊以去除高频噪声。这样,即使像素值非常大(同样由于噪声)也将被其邻居平均。
# 在图像上应用高斯模糊消除高频噪声,然后寻找最亮的像素
# 高斯模糊的半径取决于实际应用和要解决的问题;
gray = cv2.GaussianBlur(gray, (args["radius"], args["radius"]), 0)
(minVal, maxVal, minLoc, maxLoc) = cv2.minMaxLoc(gray)
image = orig.copy()
cv2.circle(image, maxLoc, args["radius"], (255, 0, 0), 2)

# 展示效果显著提升后的方法结果
cv2.imshow("Robust", image)
cv2.waitKey(0)

参考

  • https://www.pyimagesearch.com/2014/09/29/finding-brightest-spot-image-using-python-opencv/
标签: Python
最后更新:2023年2月7日

老虎猪

健康、快乐、品质生活

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

最近评论
最新 热点 随机
最新 热点 随机
Jenkins部署 在OneNote里使用markdown语法-OneMark 群晖使用花生壳搭建WordPress bootstrap table 图标显示解决 bootstrap div 居中显示 Django根据字段自动从dict中获取值
群晖使用花生壳搭建WordPress 自动化测试框架 Jenkins部署 动态自适应的NavBar - Django Win10配置PHP开发环境 Ubuntu Change apt source to mirror.aliyun.com

COPYRIGHT © 2022 你说什么都对. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

浙公网安备 33022602000616号