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