精华内容
下载资源
问答
  • Python+OpenCV 图像处理直线检测霍夫变换是图像处理中从图像中识别几何形状的基本方法之一, 应用很广泛, 也有很多改进算法. 主要用来从图像中分离出具有某种相同特征的几何形状 (如, 直线, 圆等).python 实现...

    Python+OpenCV 图像处理之直线检测

    霍夫变换是图像处理中从图像中识别几何形状的基本方法之一, 应用很广泛, 也有很多改进算法. 主要用来从图像中分离出具有某种相同特征的几何形状 (如, 直线, 圆等).

    python 实现importcv2

    importnumpyasnp

    # 使用霍夫直线变换做直线检测, 前提条件: 边缘检测已经完成

    __author__="boboa"

    # 标准霍夫线变换

    defline_detection_demo(image):

    gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

    edges=cv2.Canny(gray,50,150,apertureSize=3)

    lines=cv2.HoughLines(edges,1,np.pi/180,200)# 函数将通过步长为 1 的半径和步长为π/180 的角来搜索所有可能的直线

    forlineinlines:

    rho,theta=line[0]# line[0] 存储的是点到直线的极径和极角, 其中极角是弧度表示的

    a=np.cos(theta)# 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))# 直线终点纵坐标

    cv2.line(image,(x1,y1),(x2,y2),(0,0,255),2)

    cv2.imshow("image_lines",image)

    # 统计概率霍夫线变换

    defline_detect_possible_demo(image):

    gray=cv2.cvtColor(image,cv2.COLOR_BGRA2GRAY)

    edges=cv2.Canny(gray,50,150,apertureSize=3)

    # 函数将通过步长为 1 的半径和步长为π/180 的角来搜索所有可能的直线

    lines=cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength=50,maxLineGap=10)

    forlineinlines:

    x1,y1,x2,y2=line[0]

    cv2.line(image,(x1,y1),(x2,y2),(0,0,255),2)

    cv2.imshow("line_detect_possible_demo",image)

    if__name__=="__main__":

    img=cv2.imread("image/lines.jpg")

    cv2.namedWindow("input image",cv2.WINDOW_AUTOSIZE)

    cv2.imshow("input image",img)

    line_detect_possible_demo(img)

    cv2.waitKey(0)

    cv2.destroyAllWindows()

    标准霍夫线变换运行结果

    ab7653affab982b574eb7acc55df2e04.gif

    统计概率霍夫线变换运行结果

    ab7653affab982b574eb7acc55df2e04.gif

    标准霍夫线变换 cv2.HoughLines(image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]]) -> lines

    参数: image - 边缘检测的输出图像, 8 位, 单通道二进制源图像

    rho - 距离步长

    theta - 角度步长

    threshold - 阈值, 只有大于该值的点才有可能被当作极大值, 即至少有多少条正弦曲线交于一点才被认为是直线

    统计概率霍夫线变换 cv2.HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]]) -> lines

    参数: image - 边缘检测的输出图像, 该图像为单通道 8 位二进制图像

    rho - 参数极径

    ab7653affab982b574eb7acc55df2e04.gif以像素值为单位的分辨率, 这里一般使用 1 像素

    theta - 参数极角

    ab7653affab982b574eb7acc55df2e04.gif以弧度为单位的分辨率, 这里使用 1 度

    threshold - 检测一条直线所需最少的曲线交点

    minLineLength - 线的最短长度, 比这个线短的都会被忽略

    maxLineGap - 两条线之间的最大间隔, 如果小于此值, 这两条线就会被看成一条线.

    HoughLinesP, 效果更好, 检测图像中分段的直线 (而不是贯穿整个图像的直线)

    来源: http://www.bubuko.com/infodetail-3106539.html

    展开全文
  • C++ 图像处理中多种直线检测方法!C++ 图像处理中多种直线检测方法!
  • 我的图像处理的一个作业。 1.任务 PCB图的直线提取 2.使用平台 Windows10专业版 VS2015企业版 C++ opencv3.2 3.图像处理的思路 第一部分:图像的前期处理。 二值化、滤波、形态学操作等等 第二部分:直线检测与标记...

    我的图像处理的一个作业。

    1.任务

    PCB图的直线提取
    在这里插入图片描述

    2.使用平台

    Windows10专业版
    VS2015企业版
    C++ opencv3.2

    3.图像处理的思路

    第一部分:图像的前期处理。

    二值化、滤波、形态学操作等等

    第二部分:直线检测与标记

    Hough变换直线检测

    图像预处理的三种尝试

    第一种:灰度二值化后,不做其他处理
    第二种:灰度二值化后,经过形态学操作去掉不感兴趣大块区域(焊盘)
    第三种:灰度二值化后,经过形态学操作(开)提取感兴趣的直线区域

    直线检测-Hough_Line

    平面空间到极坐标空间转换
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    直线检测-Hough_Line API

    cv::HoughLinesP(
    InputArray src, // 输入图像,必须8-bit的灰度图像
    OutputArray lines, // 输出的极坐标来表示直线
    double rho, // 生成极坐标时候的像素扫描步长
    double theta, //生成极坐标时候的角度步长,一般取值CV_PI/180
    int threshold, // 阈值,只有获得足够交点的极坐标点才被看成是直线
    double minLineLength=0;// 最小直线长度
    double maxLineGap=0;// 最大间隔
    )
    
    

    第一种:灰度二值化后,不做其他处理

    1.读入图像
    2.将图像转为灰度
    3.将灰度图像二值化
    4.Hough直线检测
    5.将直线用红线标记
    在这里插入图片描述
    第二种:灰度二值化后,经过形态学操作去掉不感兴趣大块区域

    1.读入图像
    2.将图像转为灰度
    3.将灰度图像二值化
    4.使用较大结构元素腐蚀后膨胀剩下大块区域
    5.使用二值化图像减去大块区域剩下直线等小像素
    6.Hough直线检测
    7.将直线用红线标记
    在这里插入图片描述
    第三种:灰度二值化后,经过形态学操作得到感兴趣的直线区域

    1.读入图像
    2.将图像转为灰度
    3.将灰度图像二值化
    4.使用长水平矩形结构元素做开操作(腐蚀+膨胀)提取水平直线
    5.使用长垂直矩形结构元素做开操作(腐蚀+膨胀)提取垂直直线
    6.两提取图像相加
    6.Hough直线检测
    7.将直线用红线标记
    在这里插入图片描述

    总结

    1.图像处理的方法有很多种,不是唯一,单一的。
    2.图像的预处理是比较关键的,这直接影响着最后的检测结果的好坏。

    附上第三种代码:

    #include <iostream>
    #include <opencv2\opencv.hpp>
    #include <stdio.h>
    using namespace cv;
    using namespace std;
    
    Mat src, gray, dst, binaryImage, morhpImage1 , morhpImage2, kernel;
    int main(int argc, char **argv)
    {
    	src = imread("G:\\大学课程\\图像处理\\homework12\\PCB.bmp");
    	imshow("src image", src);
    
    	cvtColor(src, gray, CV_BGR2GRAY);
    
    	// 二值化
    	threshold(gray, binaryImage, 0, 255, THRESH_BINARY | THRESH_OTSU);
    	imshow("binary image", binaryImage);
    
    	int height = 60;
    	int width = 60;
    
    	// 可以直接使用形态学开闭操作的函数
    	kernel = getStructuringElement(MORPH_RECT, Size(width, 1), Point(-1, -1));
    	erode(binaryImage, morhpImage1, kernel);
    	imshow("erode", morhpImage1);
    
    	kernel = getStructuringElement(MORPH_RECT, Size(width, 1), Point(-1, -1));
    	dilate(morhpImage1, morhpImage1, kernel);
    	imshow("dilate", morhpImage1);
    
    	kernel = getStructuringElement(MORPH_RECT, Size(1, height), Point(-1, -1));
    	erode(binaryImage, morhpImage2, kernel);
    	imshow("erode1", morhpImage2);
    
    	kernel = getStructuringElement(MORPH_RECT, Size(1, height), Point(-1, -1));
    	dilate(morhpImage2, morhpImage2, kernel);
    	imshow("dilate1", morhpImage2);
    	
    	dst = morhpImage1 + morhpImage2;
    	imshow("dst", dst);
    	
    	vector<Vec4i>lines;
    	HoughLinesP(dst, lines, 1, CV_PI / 180.0, 30, 20.0, 0);
    	Mat resultImage = src.clone();
    	Mat retImage = gray.clone();
    	cvtColor(retImage, retImage, COLOR_GRAY2BGR);
    	for (size_t t = 0; t < lines.size(); t++)
    	{
    		Vec4i ln = lines[t];
    		line(resultImage, Point(ln[0], ln[1]), Point(ln[2], ln[3]), Scalar(0, 0, 255), 2, LINE_AA, 0);
    		line(retImage, Point(ln[0], ln[1]), Point(ln[2], ln[3]), Scalar(0, 0, 255), 2, LINE_AA, 0);
    	}
    	imshow("lines", resultImage);
    	imshow("lines1", retImage);
    	waitKey(0);
    
    	return 0;
    }
    
    展开全文
  • 数字图像处理 Hough 变换直线检测 ,matlab 实现 实验八 Hough 变换直线检测 一实验目的 理解Hough变换的原理了解其应用掌握利用Hough变换进行直线检测的处 理过程 及编程方法 二实验内容 利用Hough变换检测直线通常...
  • 编程实现彩色图像直线检测。提示:直线检测是基于边缘点进行的,因此首先需要进行边缘检测,再通过霍夫变换找出大部分边缘点所在的直线。
  • Python+OpenCV图像处理直线检测

    千次阅读 2019-06-28 12:58:00
    霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等)。 python实现 import cv2 import numpy as np...

    霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等)。

    python实现

    import cv2
    import numpy as np
    # 使用霍夫直线变换做直线检测,前提条件:边缘检测已经完成
    
    __author__ = "boboa"
    
    
    # 标准霍夫线变换
    def line_detection_demo(image):
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        edges = cv2.Canny(gray, 50, 150, apertureSize=3)
        lines = cv2.HoughLines(edges, 1, np.pi/180, 200)  # 函数将通过步长为1的半径和步长为π/180的角来搜索所有可能的直线
        for line in lines:
            rho, theta = line[0]  # line[0]存储的是点到直线的极径和极角,其中极角是弧度表示的
            a = np.cos(theta)   # 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))   # 直线终点纵坐标
            cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
        cv2.imshow("image_lines", image)
    
    
    # 统计概率霍夫线变换
    def line_detect_possible_demo(image):
        gray = cv2.cvtColor(image, cv2.COLOR_BGRA2GRAY)
        edges = cv2.Canny(gray, 50, 150, apertureSize=3)
        # 函数将通过步长为1的半径和步长为π/180的角来搜索所有可能的直线
        lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 100, minLineLength=50, maxLineGap=10)
        for line in lines:
            x1, y1, x2, y2 = line[0]
            cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
        cv2.imshow("line_detect_possible_demo", image)
    
    
    if __name__ == "__main__":
        img = cv2.imread("image/lines.jpg")
        cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE)
        cv2.imshow("input image", img)
        line_detect_possible_demo(img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()

    标准霍夫线变换运行结果

    统计概率霍夫线变换运行结果

    标准霍夫线变换cv2.HoughLines(image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]]) -> lines

    参数:image-边缘检测的输出图像,8位,单通道二进制源图像

        rho-距离步长

        theta-角度步长

        threshold-阈值,只有大于该值的点才有可能被当作极大值,即至少有多少条正弦曲线交于一点才被认为是直线

    统计概率霍夫线变换cv2.HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]]) -> lines

    参数:image-边缘检测的输出图像,该图像为单通道8位二进制图像

         rho-参数极径 r 以像素值为单位的分辨率,这里一般使用 1 像素

         theta-参数极角 \theta 以弧度为单位的分辨率,这里使用 1度

         threshold-检测一条直线所需最少的曲线交点

         minLineLength-线的最短长度,比这个线短的都会被忽略

         maxLineGap-两条线之间的最大间隔,如果小于此值,这两条线就会被看成一条线。

    HoughLinesP,效果更好,检测图像中分段的直线(而不是贯穿整个图像的直线)



    转载于:https://www.cnblogs.com/qianxia/p/11101758.html

    展开全文
  • 1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等)。最基本的霍夫变换是...
  • 编程实现彩色图像直线检测。提示:直线检测是基于边缘点进行的,因此首先需要进行边缘检测,再通过霍夫变换找出大部分边缘点所在的直线。 源码 //Prewitt算子 function P=Prewitt imNew=im2double(imread('hf.jpg'...

    实验题目:

    编程实现彩色图像的直线检测。提示:直线检测是基于边缘点进行的,因此首先需要进行边缘检测,再通过霍夫变换找出大部分边缘点所在的直线。

    源码:

    采用Prewitt算子进行边缘检测,其他算子可参考 数字图像处理实验(2).

    //Prewitt算子
    function P=Prewitt
    imNew=im2double(imread('hf.jpg'));
    [M , N, ~]=size(imNew);
    for i=2:M-1
        for j=2:N-1
            Dx=[imNew(i+1,j-1)-imNew(i-1,j-1)]+[imNew(i+1,j)-imNew(i-1,j)]+[imNew(i+1,j+1)-imNew(i-1,j+1)];
            Dy=[imNew(i-1,j+1)-imNew(i-1,j-1)]+[imNew(i,j+1)-imNew(i,j-1)]+[imNew(i+1,j+1)-imNew(i+1,j-1)];
           P(i,j)=sqrt(Dx^2+Dy^2);
        end
    end
    for i=1:M-1
        for j=1:N-1
            if (P(i,j)>0.5)
                P(i,j)=1;
            else P(i,j)=0;
            end
        end
    end
    figure('toolbar','none','menubar','none');
    set (gca,'position',[0.05,0.03,0.90,0.90] );
    imshow(P,[]);
    title('Prewitt边缘检测');  %画出边缘检测后的图像
    end
    
    
    //main.m
    Img=imread('hf.jpg' );%读入彩色图像,注意不能使用灰度图像
    Image=Img;%保留彩色原图
    Img=rgb2gray(Img) ;%将彩色图像转换为灰度图像,
    Img=im2double(Img) ;
    figure;
    imshow (Image);
    title('原图');
    [M, N]=size(Img) ; %得到图像矩阵行数m,列数n
    BM= Prewitt();
    figure;
    imshow(BM) ;
    title('pre算子提取图像边缘');
    
    [M,N]=size(BM);
    for i=2:M-1
        for j=2:N-1
            BP(i, j)=BM(i-1,j-1)+BM(i-1, j)+BM(i-1, j+1)+BM(i,j-1)+BM(i, j)+BM(i, j+1)+BM(i+1, j-1)+BM(i+1, j)+BM(i+1, j+1);
            BP(i, j)=BP(i, j)/9; %LoG 算子提取边缘后,对结果进行均值滤波以去除噪声,为下一步hough变换提取直线作准备
        end
    end
    figure;
    imshow (BP) ;
    title('均值滤波器处理后')
    q=im2uint8(BP) ;
    [M, N]=size(q);
    for i=1:M
        for j=1:N
            if q(i, j)>80; %设置二值化的阈值为80
                q(i, j)=255; %对图像进行二值化处理,使图像边缘更加突出清晰
            else
                q(i, j)=0;
            end
        end
    end
    figure;
    imshow (q) ;
    title('二值化处理后');
    
    %Hough变换检测直线,使用(a, p)参数空间,a∈[0, 180],p∈[0, 2d]
    a=180; %角度的值为0180度
    d=round(sqrt(M^2+N^2)); %图像对角线长度为p的最大值
    s=zeros(a, 2*d); %存储每个(a, p)个数
    z=cell(a, 2*d); %用元胞存储每个被检测的点的坐标
    for i=1:M
        for j=1:N  %遍历图像每个点
            if(q(i, j)==255)  %只检测图像边缘的白点,其余点不检测
                for k=1:a
                    p = round (i*cos (pi*k/180) +j*sin (pi*k/180));%对每个点从1到180度遍历一遍,取得经过该点的所有直线的p值(取整)
                    if(p > 0)	%若p大于0,则将点存储在(d, 2d)空间
                     s (k, d+p)=s (k, d+p)+1;		% (a, p)相应的累加器单元加一
                     z {k, d+p}=[z{k, d+p}, [i, j]' ];			%存储点坐标
                    else
                        ap=abs(p)+1;		%若p小于0,则将点存储在(0,d)空间
                        s(k,ap)=s(k,ap)+1;		%(a, p)相应的累加器单元加一
                        z{k,ap}=[z{k,ap}, [i, j]'];		%存储点坐标.
                    end
                end
            end
        end
    end
    for i=1:a
        for j=1:d*2%检查每个累加器单元中存储数量
            if(s(i,j)>20)%将提取直线的阈值设为70
                point=z{i, j} ;%提取对应点坐标
                for k=1:s(i, j)%对满足阈值条件的累加器单元中(a,p)对应的所有点进行操作
                Image(point(1, k),point(2,k),1)=255; %每个点R分量=255G分量=0B分量=0
                Image(point(1,k),point(2,k), 2)=0;
                Image(point(1,k) ,point(2,k), 3)=0; %结果为在原图上对满足阈值要求的直线上的点赋红色
                end
            end
         end
    end
    figure;
    imshow(Image); 
    title('hough变换提取直线');
    

    实验效果:

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 直线拟合 直线拟合的原理就比较简单了,它是一个最小二乘算法。使得这些点到直线的距离之和最小;考虑到一些本不应该存在的点对直线...直线检测 参考博客: http://blog.csdn.net/thefutureisour/article/detai...
  • 霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等)。最基本的霍夫变换是从...
  • 1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等)。最基本的霍夫变换是...
  • 图像处理之霍夫变换(直线检测算法)

    万次阅读 多人点赞 2012-07-07 14:42:21
    图像处理之霍夫变换(直线检测算法) 霍夫变换是图像变换中的经典手段之一,主要用来从图像中分离出具有某种相同特征的几何 形状(如,直线,圆等)。霍夫变换寻找直线与圆的方法相比与其它方法可以更好的减少噪 声...
  • 霍夫变换是图像处理必然接触到的一个算法,它通过一种投票算法检测具有特定形状的物体,该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换结果,该方法可以进行圆,直线...
  • 直接用霍夫直线检测,效果差; 通过图像形态学操作来寻找直线,霍夫获取位置信息与显示。 #include #include using namespace std; using namespace cv; Mat src,temp_ROI,dst; int threshold_value = 128; void ...
  • opencv图像处理直线检测、圆检测、轮廓发现的基本操作。
  • [Matlab][图像处理][直线检测houghline]车道线检测运行结果源代码联系作者 运行结果 源代码联系作者 QQ 3538518672
  • 图像处理之霍夫变换(直线检测算法)霍夫变换是图像变换中的经典手段之一,主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等)。霍夫变换寻找直线与圆的方法相比与其它方法可以更好的减少噪声干扰。...
  • 工业图像处理实战-直线检测

    千次阅读 2018-12-25 13:42:02
    请听题,请检测如下线段长度,已知dx=0.0215; 第一种方法,CvBoundingRect /* *函数名:cvBoundingRect *输入参数:points:可以是数组,也可以是cvSeq *返回值:CvRect :轮廓的最小包围矩形 */ CvRect ...
  • 看到直线检测,首先想到的就是霍夫线变换,先试一下,看一下效果: Mat img_gray; cvtColor(srcmat,img_gray,CV_BGR2GRAY); Mat img_bin; //int pos = otsu(img_gray); int threshold_value = 100; Canny...
  • 1.直线检测在好多实现应用中能用到到,我之前做过扫描件检测时用直线检测处理判断页面是否水平,还有在辅助驾驶中的车道偏离预警系统也有过应用。 2.我的编程环境是Windows 7 64位,IDE是VS2015,配置了OpenCV3.3...
  • 使用霍夫变换检测直线的matlab程序,可以求出直线的方程
  • 函数cv2.HoughLinesP()是一种概率直线检测,我们知道,原理上讲hough变换是一个耗时耗力的算法,尤其是每一个点计算,即使经过了canny转换了有的时候点的个数依然是庞大的,这个时候我们采取一种概率挑选机制,不是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 809
精华内容 323
关键字:

图像处理直线检测