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详聊!!!

  • 10
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用PythonOpenCV库来进行图像识别数字的任务。下面是一个简单的示例代码,可以帮助你开始: ```python import cv2 import pytesseract def recognize_digits(image_path): # 读取图像 image = cv2.imread(image_path) # 将图像转换为灰度图 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 对图像进行二值化处理 _, threshold = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 寻找图像的轮廓 contours, _ = cv2.findContours(threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) digits = [] # 遍历每个轮廓区域 for contour in contours: # 计算轮廓的边界框 x, y, w, h = cv2.boundingRect(contour) # 过滤掉过小或过大的轮廓区域 if w >= 10 and h >= 20 and cv2.contourArea(contour) >= 100: # 提取轮廓区域进行数字识别 digit_roi = threshold[y:y+h, x:x+w] text = pytesseract.image_to_string(digit_roi, config='--psm 10 --oem 3 -c tessedit_char_whitelist=0123456789') digits.append(text) # 在图像上绘制边界框和识别结果 cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.putText(image, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2) # 显示图像及识别结果 cv2.imshow("Result", image) cv2.waitKey(0) cv2.destroyAllWindows() return digits # 调用函数进行图像数字识别 image_path = 'path/to/your/image.jpg' recognized_digits = recognize_digits(image_path) print(recognized_digits) ``` 这段代码使用OpenCV库读取图像,将其转换为灰度图并进行二值化处理。然后,它会寻找图像的轮廓,并过滤掉过小或过大的轮廓区域。对于符合条件的轮廓区域,它会提取区域并使用Tesseract库进行数字识别。最后,它会在图像上绘制边界框和识别结果,并显示出来。 你需要安装OpenCV和pytesseract库,并且需要下载并安装Tesseract OCR引擎,用于数字识别。你可以从以下链接获取更多关于Tesseract的信息:https://github.com/tesseract-ocr/tesseract 当然,这只是一个简单的示例代码,你可能需要根据自己的具体需求进行进一步的调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值