【问题标题】:Using opencv how to obtain the second brightest region of an image?使用opencv如何获得图像的第二亮区域?
【发布时间】:2016-06-23 00:15:53
【问题描述】:

我目前正在尝试检测两者;青光眼图像的杯子和圆盘。他们使这两个从图像的其余部分中脱颖而出的方式是它们比图像的其余部分更亮。但是杯子比圆盘亮,所以我只能检测到杯子。我要实现的是,把两者都包围起来;杯子和圆盘有两个不同的圆圈。杯子是图像中最亮的,圆盘是第二亮的。我该怎么做?

这是我的代码(只检测杯子并环绕它。我试图检测两者;杯子和圆盘,并用不同的圆圈环绕它们。)

image = cv2.imread(args["image"])
orig = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

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.namedWindow("Test", cv2.WINDOW_NORMAL)
cv2.imshow("Test", image)
cv2.waitKey(0)

我也在尝试在不手动输入半径的情况下这样做。如果您对此有任何想法,请分享。

这是青光眼的示例图片。圆圈中最亮的部分是杯子,周围较大的圆圈是圆盘。

【问题讨论】:

  • 1.尝试根据像素的强度对像素进行分组,例如使用 k-means,您可能会以这种方式找到磁盘。 2. 青光眼的圆盘和其余部分看起来有明显的圆形边缘。您可以先计算边缘图像并在该图像中找到圆圈。
  • @DXM 如何获取边缘图像?我试过了,但我得到了青光眼本身的边缘。
  • 外面全黑了吗?为青光眼计算一个遮罩,您可以尝试在边缘检测之前或之后应用到遮罩。如果你已经尝试过 Canny 边缘检测,你也可以尝试只计算图像的梯度,使用 sobel 或其他算子。

标签: python c++ image opencv image-processing


【解决方案1】:

我在跟踪某些颜色的对象时遇到了类似的问题。我的方法是下一个:

  1. 使用threshold,设法创建一个图像,其中所有内容都是黑色 -> 0,圆盘和杯子都是白色 -> 255
  2. 完成该部分后,使用moments,您可以自动计算radius

In my repository我有一些代码(虽然它是 C++,因为它是一个 ROS 项目),我用它来跟踪一个蓝色对象。

使用阈值和矩的优点是,如果您的图像稍微转动、缩放甚至移动,您仍然可以跟踪所需的对象并计算半径、中心等元素

希望对您有所帮助!

【讨论】:

  • 这听起来是个好主意,但如果我的图像中最亮的部分既不是圆盘也不是杯子怎么办?在那种情况下,阈值可能不起作用,不是吗?
  • 这与亮度无关,您需要隔离该颜色,在这种情况下:黄色。我相信这个解决方案足以解决您的问题。
猜你喜欢
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 2016-10-23
  • 2012-02-23
  • 1970-01-01
  • 2021-09-03
  • 2013-03-14
相关资源
最近更新 更多