标签: hough-transform

删除分段线(OpenCV、Python)

鉴于以下代码:

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)

我可以实现此(源)图像中的水平线:

源文件

这是结果:

结果

如何删除红色的行?我想要实现的是删除这些行,使图像更干净并可供另一个进程使用。代码取自此处

python opencv hough-transform

2
推荐指数
1
解决办法
7972
查看次数

使用 Hughlines 变换进行角点检测

我需要检测给定图像上纸张的角点。它始终是整个图片的裁剪部分,仅包含一个角。我的想法是通过模糊和 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 来完成此类任务

python opencv hough-transform

2
推荐指数
1
解决办法
2887
查看次数

霍夫线检测到太多线

我正在尝试使用 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)

python opencv image-processing hough-transform

2
推荐指数
1
解决办法
5160
查看次数

来自霍夫变换坐标的有效线

我正在使用霍夫变换(极坐标).我想从霍夫变换的坐标计算一条线的矢量表示.

我当前的实现循环遍历图像中从(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%肯定有更好的方法来计算这个,但是,我似乎无法弄明白.任何帮助将不胜感激!

computer-vision hough-transform

1
推荐指数
1
解决办法
653
查看次数

霍夫变换:将极坐标转换回笛卡尔坐标,但仍无法绘制它们

所以我已经自己实现了霍夫变换的每个部分,除了实际绘制线条回原始图像.

我可以设置我喜欢的数据数组.

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 image-processing hough-transform

1
推荐指数
1
解决办法
3157
查看次数

通过Hough变换进行圆检测

我正在编写一个matlab代码,它接收照片并检测圆形对象.使用一些过滤器后,我得到了下面的图像.

在此输入图像描述

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

还可以使用Hough变换在下面的图像中检测相同的对象吗?

在此输入图像描述

圆形物体的边缘似乎是人眼,但我不确定背景是否可以通过Hough变换完全从图像中消除.

matlab image-processing hough-transform

1
推荐指数
1
解决办法
7604
查看次数

如何使用OpenCV houghlines计算屏幕截图中的标签数量?

我试图使用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

1
推荐指数
1
解决办法
180
查看次数

使用霍夫线变换的最长线检测

我想使用Hough变换检测图像中的最长行.

输入图像

在此输入图像描述

预期产出

在此输入图像描述

目前的输出

在此输入图像描述

我们可以看到它检测到错误的行.

在下面的代码中,我应该查找错误吗?

虽然有一个问题.如果我将阈值从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)

c# image-processing hough-transform

1
推荐指数
1
解决办法
565
查看次数

使用houghCircles(OpenCV)检测小圆圈

我正在尝试使用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)

请,我应该如何更改参数?

python opencv image-processing hough-transform

0
推荐指数
1
解决办法
5560
查看次数