霍夫变换可用于从图像中提取线条.它也可以用来提取曲线 - 这有点困难,因为更高维度的Hough变换是资源消耗.我想知道如何将Hough变换限制为2阶投票空间的3阶曲线,即x ^ {3} + ax ^ {2} + bx + c?
任何人都知道任何好的网站解释这个(似乎找不到任何).或者在这里解释如果没有一个:).
我是openCV的新手,但我想创建虹膜识别程序.虽然带网络摄像头的系统可以检测到眼睛,但是它不能检测到圆形虹膜.我正在使用Hough Circle Transformation.但是如果图像中的光圈不够圆,系统就无法检测到它.有什么解决方案吗?
使用的算法是霍夫圆变换.
IplImage *capturedImg = cvLoadImage("circle.jpg",1);
IplImage *grayscaleImg = cvCreateImage(cvGetSize(capturedImg), 8, 1);
cvCvtColor(capturedImg, grayscaleImg, CV_BGR2GRAY);
// Gaussian filter for less noise
cvSmooth(grayscaleImg, grayscaleImg, CV_GAUSSIAN,9, 9 );
//Detect the circles in the image
CvSeq* circles = cvHoughCircles(grayscaleImg,
storage,
CV_HOUGH_GRADIENT,
2,
grayscaleImg->height/4,
200,
100 );
for (i = 0; i < circles->total; i++)
{
float* p = (float*)cvGetSeqElem( circles, i );
cvCircle( capturedImg, cvPoint(cvRound(p[0]),cvRound(p[1])),
3, CV_RGB(0,255,0), -1, 8, 0 );
cvCircle( capturedImg, cvPoint(cvRound(p[0]),cvRound(p[1])),
cvRound(p[2]), CV_RGB(0,0,255), 3, 8, 0 );
} …
Run Code Online (Sandbox Code Playgroud) c++ opencv image-processing hough-transform iris-recognition
我正在使用HoughCircles实时检测球,但在我的灰度图像流上运行Canny并不能创建所有边缘.为了解决这个问题,我将rgb图像拆分为单独的通道,在每个通道上执行Canny,然后使用按位或将边合并在一起.这非常有效,但是如果我将该边缘图像提供给HoughCircles,它将在边缘图像上再次执行Canny.有没有办法防止这种情况,或者放弃我正在执行的rgb拆分Canny检测,同时仍能捕获所有边缘?
我为hough转换编写了代码,效果很好.我也可以裁剪一张脸的眼睛位置.现在我想通过应用Hough变换(cvHoughCircle)来检测裁剪图像的光圈.但是,当我尝试此过程时,系统无法在图像上找到任何圆圈.
也许,原因是,图像中有噪音,但我不认为这是原因.那么,我该如何检测虹膜呢?我有二进制阈值的代码也许我可以使用它,但我不知道怎么办?
如果有人帮助我真的很感激.谢谢 :)
opencv image-processing computer-vision eye-tracking hough-transform
我有一个通过在 Opencv 中调用霍夫变换函数产生的线向量,需要将它们转换回图像坐标。我从Opencv的官方文档中找到了这段示例代码,但我不明白。请问有人解释一下吗?
for( size_t i = 0; i < lines->size(); i++ )
{
float rho = lines->at(i)[0]; //[0] is rho
float theta = lines->at(i)[1]; //[1] is theta
double a = cos(theta), b = sin(theta);
double x0 = a*rho, y0 = b*rho;
cv::Point pt1(cvRound(x0 + 1000*(-b)),
cvRound(y0 + 1000*(a)));
cv::Point pt2(cvRound(x0 - 1000*(-b)),
cvRound(y0 - 1000*(a)));
line( *mat, pt1, pt2, Scalar(255,0,0), 1, 8 );
}
Run Code Online (Sandbox Code Playgroud)
1000在做这条线是什么?
pt1(cvRound(x0 + 1000*(-b)), cvRound(y0 + 1000*(a)))
Run Code Online (Sandbox Code Playgroud)
此外,为什么 pt2 有负 y 线?例如,如果我的第一行是 (rho, theta) 格式的 …
我在OpenCV中使用HoughLinesP函数.在阅读了这里的文档之后,我对两个参数"threshold"和"minLineLength"的必要性感到困惑.文件说:
threshold - 累加器阈值参数.只返回获得足够票数(>阈值)的那些行.
minLineLength - 最小行长度.短于此的线段被拒绝.
他们中的一个不是多余的吗?一行得到的投票数是否等于它包含的像素数?鉴于"minLineLength"指定要拒绝哪些行,"阈值"的用途是什么?我在这里错过了一些东西.将予以澄清澄清.
所以我试图在棋盘上获得hough线,但算法只能检测到一条线.我正在使用python 2.7和opencv 3.0.这是代码:
def applyHoughLineTransform():
image1 = cv2.imread('pictures/board1.png',0)
image2 = cv2.imread('pictures/board2.png',0)
image3 = cv2.imread('pictures/board3.png')
image4 = cv2.imread('pictures/board4.png')
lines1 = cv2.HoughLines(image1,1,math.pi/180.0,5)
lines2 = cv2.HoughLines(image2,1,math.pi/180.0,5)
lines1 = lines1[0]
lines2 = lines2[0]
for rho,theta in lines1:
print ('Rho and theta:',rho,theta)
a = np.cos(theta)
b = np.sin(theta)
x0 = a*rho
y0 = b*rho
x1 = int(x0 + 1000*(-b))
y1 = int(y0 + 1000*(a))
x2 = int(x0 - 1000*(-b))
y2 = int(y0 - 1000*(a))
print (x1,y1)
print (x2,y2)
cv2.line(image3,(x1,y1),(x2,y2),(0,0,255),2)
for rho,theta in lines2:
a = …
Run Code Online (Sandbox Code Playgroud) 我有苹果片浸泡在碘溶液中的照片。目标是将苹果分成各个感兴趣的区域并评估每个区域的淀粉含量。这是一个学校项目,所以我的目标是测试不同的分割方法,客观地找到最佳解决方案,无论是单一技术还是多种技术的组合。
问题是到目前为止我只接近一种方法。该方法正在使用 HoughCircles。我最初计划使用分水岭方法、形态学操作或简单的阈值。当我无法修改它们中的任何一个来工作时,这个计划失败了。
原始图像看起来与此类似,苹果的深浅不一
我尝试使用带有 HSV 值的 cv2.inRange 删除背景托盘,但它不适用于较深的苹果。
这就是 HoughCircles 在原始图像上产生的结果,应用了灰度和中值模糊,还尝试了托盘的蒙版。
任何关于下一步去哪里的建议或方向将不胜感激。如果有帮助,我可以提供我正在使用的代码。
谢谢!
编辑 1:添加一些代码并澄清问题
感谢您的回复。我真正的问题是,这种情况下还有其他适合的分割方法吗?我想尝试几种不同的方法并比较大量照片的结果。我接下来要尝试的是使用 k-means 分割。此外,我将在下面添加一些代码以显示到目前为止我已经尝试过的内容。
HSV 颜色过滤
import cv2
import numpy as np
# Load image
image = cv2.imread('ApplePic.jpg')
# Set minimum and max HSV values to display
lower = np.array([0, 0, 0])
upper = np.array([105, 200, 255])
# Create HSV Image and threshold into a range.
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, lower, upper)
maskedImage = cv2.bitwise_and(image, image, mask=mask)
# Show Image
cv2.imshow('HSV Mask', …
Run Code Online (Sandbox Code Playgroud) python opencv computer-vision image-segmentation hough-transform
我的目标是从显微镜准确测量孔的直径。工作流程是:拍摄图像、拟合过程、拟合、以像素为单位将半径转换为毫米、写入 csv
这是用于测量孔直径的图像处理脚本的输出。我遇到了一个问题,我的圆拟合似乎优先匹配轮廓而不是最小二乘法之类的方法。
我或者在这样的事情中平均了许多拟合:
我的问题是我喜欢快速扫描以确保圆形适合。权衡是我拥有的合身越多,合身就越真实,我拥有的越少,就越容易确保数字正确。我的圈子并不总是像这个圈子那样漂亮和圆,所以这对我很重要。
如果您能看一下并告诉我如何在 5 个圆的数量级上执行更多的最小二乘法,这是我的脚本拟合圆。我不想使用最小圆检测,因为流体正在流过这个孔,所以我希望它更像一个水力直径——谢谢!
(thresh, blackAndWhiteImage0) = cv2.threshold(img0, 100, 255, cv2.THRESH_BINARY) #make black + white
median0 = cv2.medianBlur(blackAndWhiteImage0, 151) #get rid of noise
circles0 = cv2.HoughCircles(median0,cv2.HOUGH_GRADIENT,1,minDist=5,param1= 25, param2=10, minRadius=min_radius_small,maxRadius=max_radius_small) #fit circles to image
Run Code Online (Sandbox Code Playgroud) 我有这张林线作物的图像。我需要找到作物对齐的大致方向。我试图获取图像的霍夫线,然后找到角度分布的模式。
我一直在关注本关于裁剪线的教程,但是在该教程中,裁剪线很稀疏。这里它们是密集的,经过灰度、模糊和使用精明的边缘检测后,这就是我得到的
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('drive/MyDrive/tree/sample.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
gauss = cv2.GaussianBlur(gray, (3,3), 3)
plt.figure(figsize=(15,15))
plt.subplot(1,2,1)
plt.imshow(gauss)
gscale = cv2.Canny(gauss, 80, 140)
plt.subplot(1,2,2)
plt.imshow(gscale)
plt.show()
Run Code Online (Sandbox Code Playgroud)
(左侧未经canny处理的模糊图像,左侧经过canny预处理的图像)
之后,我按照教程将预处理后的图像“骨架化”
size = np.size(gscale)
skel = np.zeros(gscale.shape, np.uint8)
ret, gscale = cv2.threshold(gscale, 128, 255,0)
element = cv2.getStructuringElement(cv2.MORPH_CROSS, (3,3))
done = False
while not done:
eroded = cv2.erode(gscale, element)
temp = cv2.dilate(eroded, element)
temp = cv2.subtract(gscale, temp)
skel = cv2.bitwise_or(skel, temp)
gscale = …
Run Code Online (Sandbox Code Playgroud)