Python+Opencv寻找图像中最亮的区域

目录

    • 一、场景需求解读
    • 二、算法原理简介
    • 三、算法代码实现
    • 四、代码运行步骤
    • 五、算法效果展示和分析
    • 六、思维扩展
    • 参考资料
    • 注意事项

一、场景需求解读

  在有些现实场景中,我们需要去使用算法自动的寻找到图片中的最亮的区域,这个区域是我们感兴趣的目标所在的位置,比较典型的是一个应用是视网膜图像图像中视网膜所在的位置比较亮,而其它地方比较暗,我们更加关注视网膜所在的区域,因而需要使用算法自动的寻找到这个区域,然后针对这个区域进行处理和分析。下图展示了一个样例图片。
Python+Opencv寻找图像中最亮的区域_第1张图片

二、算法原理简介

  要检测出图像中最亮的区域,我们可以直接使用opencv中自带的函数(minVal, maxVal, minLoc, maxLoc) = cv2.minMaxLoc(gray),该函数是用来获取图像中的最大值和最小值 所在的位置,而图像中的最大值其实就是最亮的像素点,图像中的最小值其实就是最暗的像素点,该函数的输入参数是一张灰度图像,该函数会返回最大值、最小值、最大值所在位置和最小值所在位置等,我们可以根据获得的位置信息绘制结果。

三、算法代码实现

# coding=utf-8
# 导入python包
import numpy as np
import argparse
import cv2

# 构建并解析参数
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寻找到图像中最亮和最暗的点
(minVal, maxVal, minLoc, maxLoc) = cv2.minMaxLoc(gray)
# 在图像中绘制结果
cv2.circle(image, maxLoc, 5, (255, 0, 0), 2)

# 应用高斯模糊进行预处理
gray = cv2.GaussianBlur(gray, (args["radius"], args["radius"]), 0)
(minVal, maxVal, minLoc, maxLoc) = cv2.minMaxLoc(gray)
image1 = orig.copy()
cv2.circle(image1, maxLoc, args["radius"], (255, 0, 0), 2)

# 显示结果
result = np.hstack([orig, image, image1])
cv2.imwrite("region5.png", result)
cv2.imshow("Robust", result)
cv2.waitKey(0)

四、代码运行步骤

  • 步骤1-打开一个cmd界面;
  • 步骤2-cd /d xxx 切换到代码所在的绝对路径中,xxx表示代码所在的具体路径
  • 步骤3-python find_region.py -i img5.png -r 59 运行代码,-i表示设置测试图片,-r表示设置显示的半径大小。

五、算法效果展示和分析


  上图展示了该算法的运行结果。每一行表示一个测试案例,第1列表示的是输入的原图,第2列表示的是原始的输出结果,即直接使用cv2.minMaxLoc函数的结果,这个函数可以输出图像中最亮的点和最暗的点所在的具体位置和对应的值,但是它容易受到噪声的干扰,第2行第2列输出了错误的结果;第3列表示的是预处理之后的结果,即首先使用高斯函数进行去噪处理,然后再使用cv2.minMaxLoc函数的效果,通过观察图中的结果,我们可以发现改进后的效果更佳明显,准确的检测到了图像中最亮的区域,满足了我们的要求。需要注意的是,用户需要根据输入图片的大小去调节–radius参数的值,该值必须为奇数。

六、思维扩展

  对于本文的这个任务而言,其实还可以用其它的思路很好的实现,一个可行的思路是使用图像二值化+寻找图像中的最大轮廓来实现,主要的原始是因为眼球和其它区域之间具有较大的颜色差异,可以通过设置一个合适的阈值来讲它们区分开来,然后在这个二值图像中寻找最大的轮廓就可以找到我们的目标,寻找最大轮廓的目的是因为图像中会含有一些其它的噪声,比如其它区域中比较小的亮区域,具体的代码实现就留给聪明的你来实现啦。

参考资料

[1] 参考链接

注意事项

[1] 该博客是本人原创博客,如果您对该博客感兴趣,想要转载该博客,请与我联系(qq邮箱:[email protected]),我会在第一时间回复大家,谢谢大家的关注.
[2] 由于个人能力有限,该博客可能存在很多的问题,希望大家能够提出改进意见。
[3] 如果您在阅读本博客时遇到不理解的地方,希望您可以联系我,我会及时的回复您,和您交流想法和意见,谢谢。
[4] 本文测试的图片可以通过该链接进行下载。网盘链接-提取码:lvah。
[5] 本人业余时间承接各种本科毕设设计和各种小项目,包括图像处理(数据挖掘、机器学习、深度学习等)、matlab仿真、python算法及仿真等,有需要的请加QQ:1575262785详聊!!!

你可能感兴趣的:(opencv,python)