【问题标题】:Difficulty in detected ellipses in image难以检测到图像中的椭圆
【发布时间】:2018-12-18 14:14:24
【问题描述】:

我正在尝试检测某些图像中的椭圆。 经过一些功能后,我得到了这个边缘图:

我尝试使用霍夫变换来检测椭圆,但是这种变换的复杂性非常高,所以我的计算机即使在 5 小时后也没有完成运行变换命令(!)。

我也试过做连接组件,得到了这个:

在最后一种情况下,我还尝试继续并二值化图像。

在所有情况下,我都被困在这些步骤中,不知道如何从这里继续。

我的任务是检测图像中的西红柿。我通过尝试检测圆和椭圆并找到每个圆和椭圆的半径(或椭圆情况下的平均半径)来解决这个问题。

编辑:

我为第一种方法添加了我的代码(结果是上面的边缘图):

img = cv2.imread(r'../images/assorted_tomatoes.jpg')

gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

imgAfterLight=lightreduce(img)
imgAfterGamma=gamma_correctiom(imgAfterLight,0.8)

th2 = 255 - cv2.adaptiveThreshold(imgAfterGamma,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,3)
median2 = cv2.medianBlur(th2,3)

其中 median2 是上面在边缘图中显示的结果

以及连接组件的代码:

import scipy
from scipy import ndimage
import matplotlib.pyplot as plt
import cv2
import numpy as np

fname=r'../images/assorted_tomatoes.jpg'
blur_radius = 1.0
threshold = 50

img = scipy.misc.imread(fname) # gray-scale image
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
print(img.shape)

# smooth the image (to remove small objects)
imgf = ndimage.gaussian_filter(gray_img, blur_radius)
threshold = 80

# find connected components
labeled, nr_objects = ndimage.label(imgf > threshold) 

上面标记的结果

另一个编辑:

这是输入图像:

Input

问题是边缘检测后,子区域中有很多不必要的边缘,干扰了边缘映射的平滑

【问题讨论】:

  • 欢迎来到 StackOverflow。请按照您创建此帐户时的建议阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布 MCVE 代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中并重现您描述的问题。
  • 你真的需要提供一个minimal reproducible example(如果你有的话,我肯定会支持这个)
  • 您可能需要退后一步,重新访问您的边缘地图。我不能给你建议如何改进它,因为我不知道你输入的图像是什么样的,但想想看:一旦你对图像进行二值化,你就会丢掉很多信息;您需要确保二值化图像包含后续步骤所需的所有信息。在这种情况下,我很难在那个边缘图中数西红柿,所以你丢掉了重要信息!
  • 我编辑并添加了输入图像。我的问题是当我执行边缘检测器时,我会得到很多不必要的边缘,这些边缘会干扰清晰的边缘图

标签: python opencv image-processing computer-vision scikit-image


【解决方案1】:

在我看来,这似乎是分水岭算法的经典问题。它旨在分割出像西红柿这样的触摸物体。我的示例是在 Matlab 中(我今天在错误的计算机上),但它应该很容易转换为 python。首先像你一样转换成灰度然后反转图像

 I=rgb2gray(img)
 I2=imcomplement(I)

图像会过分分割,因此我们删除了太浅的最小值。这可以通过 h-minima 变换来完成

I3=imhmin(I2,50);

您可能需要使用 50 值,这是抑制浅最小值的高度阈值。现在运行分水岭算法,我们得到以下结果。

L=watershed(I3);

结果并不完美。它需要额外的逻辑来删除一些小区域,但它会给出一个合理的估计。分水岭和 h 最小值包含在 python 的 skimage.morphology 包中。

【讨论】:

  • 如果您能够上传您的示例,我将非常高兴。同时我成功检测到 40 个西红柿 + 2 个误报检测。此外,并非所有检测到的西红柿都被适当大小的圆圈包围,所以我的方法是有限的,并且在圆圈数量和圆圈适当大小之间有很大的权衡
猜你喜欢
  • 2015-04-27
  • 1970-01-01
  • 2011-06-14
  • 2017-07-01
  • 2014-12-23
  • 2014-05-01
  • 2020-08-11
  • 1970-01-01
  • 2014-11-29
相关资源
最近更新 更多