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

15 篇文章 7 订阅

一、场景需求解读

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

二、算法原理简介

  要检测出图像中最亮的区域,我们可以直接使用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] 如果您对AI、自动驾驶、AR、ChatGPT等技术感兴趣,欢迎关注我的微信公众号“AI产品汇”,有问题可以在公众号中私聊我!
[2] 该博客是本人原创博客,如果您对该博客感兴趣,想要转载该博客,请与我联系(qq邮箱:1575262785@qq.com),我会在第一时间回复大家,谢谢大家的关注.
[3] 由于个人能力有限,该博客可能存在很多的问题,希望大家能够提出改进意见。
[4] 如果您在阅读本博客时遇到不理解的地方,希望您可以联系我,我会及时的回复您,和您交流想法和意见,谢谢。
[5] 本文测试的图片可以通过关注微信公众号AI产品汇之后找我索取!
[6] 本人业余时间承接各种本科毕设设计和各种小项目,包括图像处理(数据挖掘、机器学习、深度学习等)、matlab仿真、python算法及仿真等,有需要的请加QQ:1575262785详聊!!!

  • 12
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是我给您的 Python 代码和步骤来实现 Harris 角点检测: - 步骤一:导入所需库 首先,需要导入使用到的库 cv2 和 numpy,代码如下: ``` import cv2 import numpy as np ``` - 步骤二:读取图像并做灰度化处理 使用 OpenCV 的 cv2.imread() 函数读取指定的图像,然后使用 cv2.cvtColor() 函数将其转换为灰度图像,代码如下: ``` img = cv2.imread('input.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ``` - 步骤三:计算 Harris 角点响应函数(R) 接下来,需要计算 Harris 角点响应函数(R),即通过计算图像每个像素点在其周围区域的梯度变化情况,来确定该点是否为角点。代码如下: ``` # 设定窗口大小 win_size = 5 # 计算 Sobel 梯度 dx = cv2.Sobel(gray, cv2.CV_32F, 1, 0, ksize=win_size) dy = cv2.Sobel(gray, cv2.CV_32F, 0, 1, ksize=win_size) # 计算 Harris 响应函数R k = 0.04 R = cv2.cornerHarris(dx, dy, blockSize=win_size, ksize=3, k=k) ``` - 步骤四:寻找角点并绘制 最后,需要根据计算出来的 Harris 响应函数(R)值,寻找图像的角点,并将其用圆形标记出来。代码如下: ``` # 通过设置 R 值阈值确定角点位置 threshold = 0.01 * R.max() corners = np.argwhere(R > threshold) corners = np.float32([corners]) for corner in corners: x, y = corner[0], corner[1] cv2.circle(img, (x, y), 5, (0, 0, 255), -1) # 显示并保存结果 cv2.imshow('Harris Corner Detection', img) cv2.waitKey() cv2.imwrite('output.jpg', img) ``` 至此,我们已经成功使用 Python 编写了 Harris 角点检测算法的代码。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值