鉴于以下代码:
import numpy as np
import cv2
gray = cv2.imread('image.png')
edges = cv2.Canny(gray,50,150,apertureSize = 3)
cv2.imwrite('edges-50-150.jpg',edges)
minLineLength=100
lines = cv2.HoughLinesP(image=edges,rho=1,theta=np.pi/180, threshold=100,lines=np.array([]), minLineLength=minLineLength,maxLineGap=80)
a,b,c = lines.shape
for i in range(a):
cv2.line(gray, (lines[i][0][0], lines[i][0][1]), (lines[i][0][2], lines[i][0][3]), (0, 0, 255), 1, cv2.LINE_AA)
cv2.imwrite('houghlines.jpg', gray)
cv2.imshow('img', gray)
cv2.waitKey(0)
Run Code Online (Sandbox Code Playgroud)
我可以实现此(源)图像中的水平线:
这是结果:
如何删除红色的行?我想要实现的是删除这些行,使图像更干净并可供另一个进程使用。代码取自此处。
我需要检测给定图像上纸张的角点。它始终是整个图片的裁剪部分,仅包含一个角。我的想法是通过模糊和 Canny 边缘检测来转换图像以获得轮廓,然后应用 Houghlines 来获取角点坐标。
然而,我遇到了一些问题,实际上通过霍夫线一致而精确地检测到任何东西,我已经不知道这可能是什么原因了。
我尝试过使用阈值处理而不是 Canny,但由于适用图像存在许多变化,它不会起作用。我缩小了整个图像,以便更容易看到纸张的边缘,但仍然没有任何改进。增加线条阈值会使纸张内容中的线条消失,但同时边缘线有时会消失
输入

边缘

结果

要重现的代码
import cv2
import numpy as np
img = cv2.imread('inv_0001-01.1_0_corner.jpg')
resized = cv2.resize(img, (250,250), interpolation = cv2.INTER_AREA)
gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)
kernel_size = 5
blur_gray = cv2.GaussianBlur(gray,(kernel_size, kernel_size),0)
edges = cv2.Canny(blur_gray,50,150,apertureSize = 3)
cv2.imshow('edges', edges)
cv2.waitKey()
min_line_length = 50
max_line_gap = 20
lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 5, np.array([]), min_line_length, max_line_gap)
for line in lines:
for x1,y1,x2,y2 in line:
cv2.line(resized,(x1,y1),(x2,y2),(255,0,0),5)
cv2.imshow('hough', resized)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)
我的首选结果是给定图像中纸角的坐标,但在这篇文章中,我宁愿寻求一些帮助来理解如何使用 Houglines 来完成此类任务
我正在尝试使用 opencv 中的霍夫线从织物图像中提取垂直线。我应用对比度增强来增强线条,并应用双边过滤来尝试去除其他织物纹理。但是,在应用粗糙线时,代码会检测整个图像上的线条。我尝试使用霍夫的参数,但结果是相同的。
应用直方图均衡和双边滤波器后的输入图像:
这是应用霍夫线后的图像,红色代表检测到的线。显示霍夫检测的输出:
我可以尝试的另一种方法是什么,以便霍夫不会开始将微小的织物图案也检测为线条?
这是我的代码:
`
img1= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img2 = cv2.equalizeHist(img1)
img3 = cv2.equalizeHist(img2)
img4 = cv2.equalizeHist(img3)
img5 = cv2.bilateralFilter(img4, 9, 75,75)
cv2.imshow("threshold",img5)
edges = cv2.Canny(img4,50,127,apertureSize = 3)
lines= cv2.HoughLines(edges, 1, math.pi/180.0, 200, np.array([]), 0, 0)
a,b,c = lines.shape
for i in range(a):
rho = lines[i][0][0]
theta = lines[i][0][1]
a = math.cos(theta)
b = math.sin(theta)
x0, y0 = a*rho, b*rho
pt1 = ( int(x0+1000*(-b)), int(y0+1000*(a)) )
pt2 = ( int(x0-1000*(-b)), int(y0-1000*(a)) )
cv2.line(img, pt1, pt2, (0, 0, 255), …Run Code Online (Sandbox Code Playgroud) 我正在使用霍夫变换(极坐标).我想从霍夫变换的坐标计算一条线的矢量表示.
我当前的实现循环遍历图像中从(0,0)到(M,N)的所有像素坐标,其中M和N是图像的大小.当循环遍历空间时,计算此值:
//角度和rho是霍夫空间的极坐标.
tmp =(int)((i*cos(angle))+(j*sin(angle)));
其中tmp -rho == 0,是该行的一部分,所以我跟踪该位置.当循环到达图像的末尾(i,j)==(M,N)时,循环再次从相反方向(M,N)到(0,0)完成.
第一个(tmp-rho == 0)从左到右,第二个(tmp-rho == 0)从右到左是该线的坐标.然后我减去那些像素坐标以得到霍夫空间中的线的矢量.
这是非常低效(慢),我100%肯定有更好的方法来计算这个,但是,我似乎无法弄明白.任何帮助将不胜感激!
所以我已经自己实现了霍夫变换的每个部分,除了实际绘制线条回原始图像.
我可以设置我喜欢的数据数组.
points | theta | rho
-------|-------|----
[246,0] -90 -246
[128,0] -90 -128
[9,0] -90 -9
[0,9] 0 9
[0,128] 0 128
[0,246] 0 246
Run Code Online (Sandbox Code Playgroud)
这些点是从极坐标中的峰转换而来的点.所以现在我需要绘制所有这六条线并且我没有运气.
编辑
所以我尝试根据建议更改我的代码.这就是我提出的.
function help(img, outfile, peaks, rho, theta)
imshow(img);
x0 = 1;
xend = size(img,2);
peaks_len=length(peaks);
for i=1:peaks_len
peak=peaks(i,:);
r_ind=peak(1);
t_ind=peak(2);
r=rho(r_ind);
th=theta(t_ind);
%display([r,th,peak]);
%// if a vertical line, then draw a vertical line centered at x = r
% display([r, th]);
if (th == 0)
display('th=0');
display([1, size(img,1)]); …Run Code Online (Sandbox Code Playgroud) 我正在编写一个matlab代码,它接收照片并检测圆形对象.使用一些过滤器后,我得到了下面的图像.

为了检测圆形物体(它不是一个完美的圆形),我尝试应用Hough变换传递不同的半径和阈值,但它无法正确检测.为什么会这样?是关于物体的形状还是图像的背景?
还可以使用Hough变换在下面的图像中检测相同的对象吗?

圆形物体的边缘似乎是人眼,但我不确定背景是否可以通过Hough变换完全从图像中消除.
我试图使用OpenCV计算屏幕截图中的标签数量.我首先裁剪我的图像以限制镀铬标签.然后我使用边缘检测,Canny算法来查找chrome中的边缘.然后我使用Houghlines查找选项卡的数量,但我没有通过Houghlines获得所需的输出.下面是我的代码和输出.
import cv2
import numpy as np
import math
from matplotlib import pyplot as plt
img = cv2.imread('1.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,200,apertureSize = 3)
cv2.imwrite('result.png',edges)
lines = cv2.HoughLines(edges,1,np.pi/180,50)
for rho,theta in lines[0]:
slope = 180*theta*1.0/np.pi
if slope > 110 and slope <148: # for identifying chrome tab angle (right slope line of each tab)
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 = …Run Code Online (Sandbox Code Playgroud) python opencv image-processing edge-detection hough-transform
输入图像
预期产出
目前的输出
我们可以看到它检测到错误的行.
在下面的代码中,我应该查找错误吗?
虽然有一个问题.如果我将阈值从50增加到150,源代码似乎会产生正确的输出.但是,对我来说,这没有任何意义,因为增加的阈值意味着排除低投票线.
.
源代码
HoughLineTransform.cs
public class Line
{
public Point Start { get; set; }
public Point End { get; set; }
public int Length
{
get
{
return (int)Math.Sqrt(Math.Pow(End.X - Start.X, 2) + Math.Pow(End.Y - Start.Y, 2)); ;
}
}
public Line()
{
}
public Line(Point start, Point end)
{
Start = start;
End = end;
}
}
public class HoughLineTransform
{
public HoughMap Accumulator { get; set; } …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用houghcircles()检测此裁剪图像中的小圆圈。我尝试更改其参数,但是当我将param2增加到50以上时,它会出错,而当其值小于100时,maxRadius也将出错。现在它可以运行,但性能不佳这是原始图像:

这是我的代码:
from imutils.perspective import four_point_transform
from imutils import contours
import numpy as np
import argparse
import imutils
import cv2
im = cv2.imread('crop.png')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray, 200, 255,cv2.THRESH_BINARY)
cimg = cv2.cvtColor(thresh,cv2.COLOR_GRAY2BGR)
c = cv2.HoughCircles(thresh, cv2.HOUGH_GRADIENT, 0.5, 41, param1=70,
param2=30, minRadius=10,maxRadius=175)
c = np.uint16(np.around(c))
for i in c[0,:]:
# draw the outer circle
cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
# draw the center of the circle
cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
cv2.namedWindow('img',cv2.WINDOW_NORMAL)
cv2.resizeWindow('img', 800,800)
cv2.imshow('img',cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)
请,我应该如何更改参数?