在openCV中,canny运算符的低阈值和高阈值是强制性的:
cvCanny(input,output,thresh1,thresh2)
Run Code Online (Sandbox Code Playgroud)
在Matlab中,有一个自动计算的选项:
edge(input,'canny')
Run Code Online (Sandbox Code Playgroud)
我已经研究了Matlab的边缘代码,这实际上并不是直接自动计算的.
您是否了解canny运算符的任何实现以及opencv的自动阈值计算?
谢谢
我试图在python中使用OpenCV进行一些图像分析,但我认为图像本身会非常棘手,而且之前我从未做过这样的事情,所以我想说出我的逻辑,也许会得到一些想法/实用代码实现我想做的事情,在我投入大量时间走错路之前.
这个帖子非常接近我想要达到的目标,在我看来,使用的图像应该比我的更难分析.我会对那些彩色斑点的大小感兴趣,而不是它们与左上角的距离.我也一直在关注这段代码,虽然我对参考对象并不特别感兴趣(仅以像素为单位的尺寸就足够了,之后可以转换).
这是输入图像:
你正在看的是冰晶,我想找到每个冰晶的平均大小.每个界限都有相当明确的定义,所以概念上这是我的方法,如果这是错误的方法,我想听听任何建议或意见:
在这一点上,似乎我可以做出选择.我可以对图像进行二值化,并测量高于阈值的斑点(即斑点为白色时的最大值像素),或者通过更完整地关闭和填充轮廓来继续边缘检测.虽然看了那个教程,轮廓似乎很复杂,虽然我可以让代码在我的图像上运行,但它并没有正确地检测到晶体(不出所料).我也不确定在二值化之前我是否应该进行变换?
假设我可以完成所有工作,我认为合理的测量将是最小封闭框或椭圆的最长轴.
我还没有完全解决所有的阈值,因此有些晶体被遗漏了,但由于它们被平均化,所以目前这并没有出现大问题.
该脚本在处理图像时会存储处理后的图像,所以我也希望最终的输出图像类似于链接的SO线程中的"标记的blob"图像,但每个blob都可以注释其尺寸.
这是一个(不完整的)理想化输出的样子,每个晶体都被识别,注释和测量(当我走得那么远时,我非常确定我可以解决测量).
根据评论,分水岭算法看起来非常接近实现我所追求的目标.这里的问题是,分配算法所需的标记区域非常困难(http://docs.opencv.org/3.2.0/d3/db4/tutorial_py_watershed.html).
我不认为这是通过二值化过程可以通过阈值解决的问题,因为谷物的表观颜色变化远大于该线程中的玩具示例.
这是我玩过的其他一些测试图像.它的表现比我预期的更小的水晶要好得多,显然很多可以通过我尚未尝试的阈值来完成.
这里是1,左上角到右下角对应于Alex在下面的步骤输出的图像.
这是第二个更大的晶体.
您会注意到这些颜色往往更均匀,但更难辨别边缘.我发现有点令人惊讶的是边缘泛滥对某些图像有点过于热心,我原本认为对于具有非常微小晶体的图像尤其如此,但实际上它似乎有更多的效果在较大的那些.从我们的实际显微镜可能有很大的空间来改善输入图像的质量,但是编程可以从系统中获得的"松弛"越多,我们的生活就越容易!
我有一个盒子,从前面透明,我将相机放在前面的透明面板上捕捉内部的图像,大多数时候盒子是空的,但是假设有人在这个盒子里面放了一个物体,那么我必须只从捕获的图像中提取此对象.
(我的真正目的是识别放置在盒子内的物体,但第一步是提取物体,然后提取特征以生成训练模型,现在我只专注于从图像中提取物体)
我是OpenCV的新手,并且在Python中使用它,我找到了一些可以帮助我的OpenCV函数.
背景减法的代码如下,即使短距离也不能正常工作
cap = cv2.VideoCapture(0)
fgbg = cv2.createBackgroundSubtractorMOG2()
fgbg2 = cv2.createBackgroundSubtractorKNN()
while True:
ret, frame = cap.read()
cv2.namedWindow('Real', cv2.WINDOW_NORMAL)
cv2.namedWindow('MOG2', cv2.WINDOW_NORMAL)
cv2.namedWindow('KNN', cv2.WINDOW_NORMAL)
cv2.namedWindow('MOG2_ERODE', cv2.WINDOW_NORMAL)
cv2.namedWindow('KNN_ERODE', cv2.WINDOW_NORMAL)
cv2.imshow('Real', frame)
fgmask = fgbg.apply(frame)
fgmask2 = fgbg2.apply(frame)
kernel = np.ones((3,3), np.uint8)
fgmask_erode = cv2.erode(fgmask,kernel,iterations = 1)
fgmask2_erode = cv2.erode(fgmask2,kernel,iterations = 1)
cv2.imshow('MOG2',fgmask)
cv2.imshow('KNN',fgmask2)
cv2.imshow('MOG2_ERODE',fgmask_erode)
cv2.imshow('KNN_ERODE',fgmask2_erode)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)
任何人都可以请帮助这个主题,以及如何修改上面的代码只是使用这两个图像,当我尝试我得到空白图像.提前致谢
来自相机的样本图像如下:(我使用800万像素相机,这就是为什么图像尺寸很大,我减小了尺寸,然后在这里上传)
目标:使软件库(如Tesseract)能够从下图中读取TMP HW工作.
我试图找到"连接点"的方法,可以说,使用OpenCV,但我不确定它是否可行.我有不同颜色的虚线图片,如下图所示,然后我将其转换为灰度图片然后应用canny来查找边缘.我尝试过模糊,精细,侵蚀和扩张的东西,但是唉,作为这个东西的新手,看起来我似乎没有找到一种方法来使这些字母"整体"与边缘.
虽然它似乎使用OpenCV,但是可以创建非常容易识别的字母而不是那么多"噪音"(我认为,如果重要的话,也可以找到一种方法来纠正方向),不知何故在点之间创建边缘以进行OCR图书馆工作似乎更好.有小费吗?
作为参考,我找到了如何使用Python/Opencv和Canny Edge Image 连接二进制图像中的虚线-例如去除噪声.
<编辑:选择的语言,但任何语言的例子等可能会去.如果重要的话,我很可能会在.NET上工作.