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

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

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-参数极径  以像素值为单位的分辨率,这里一般使用 1 像素

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

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

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

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

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

原文地址:https://www.cnblogs.com/qianxia/p/11101758.html

时间: 2024-10-13 09:39:37

Python+OpenCV图像处理之直线检测的相关文章

Python+OpenCV图像处理之圆检测

霍夫变换不仅可以用来检测直线,同样也可以用来检测圆 python实现 import cv2 import numpy as np __author__ = "boboa" def detect_circles_demo(image): dst = cv2.pyrMeanShiftFiltering(image, 10, 100) # 均值偏移滤波 cimage = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY) circles = cv2.HoughCirc

Python+OpenCV图像处理(十四)—— 直线检测

简介: 1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等).最基本的霍夫变换是从黑白图像中检测直线(线段). 2.Hough变换的原理是将特定图形上的点变换到一组参数空间上,根据参数空间点的累计结果找到一个极大值对应的解,那么这个解就对应着要寻找的几何形状的参数(比如说直线,那么就会得到直线的斜率k与常熟b,圆就会得到圆心与半径等等) 3.霍夫线变

Python+OpenCV图像处理(一)——读取显示一张图片

配置好所有环境后,开始利用python+opencv进行图像处理第一步. 读取和显示一张图片: import cv2 as cv src=cv.imread('E:\imageload\example.png') cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE) cv.imshow('input_image', src) cv.waitKey(0) cv.destroyAllWindows() 输出效果: 代码解释: src=cv.imread(

python+opencv图像处理(一)

一.什么是opencv?  Open Source Computer Vision Library.OpenCV于1999年由Intel建立,如今由Willow Garage提供支持.OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.MacOS操作系统上.它轻量级而且高效--由一系列 C 函数和少量C++类构成,同时提供了Python.Ruby.MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法.最新版本是3.1 ,201

Python+OpenCV图像处理(十六)—— 轮廓发现

简介:轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现结果. 代码如下: import cv2 as cv import numpy as np def contours_demo(image): dst = cv.GaussianBlur(image, (3, 3), 0) #高斯模糊去噪 gray = cv.cvtColor(dst, cv.COLOR_RGB2GRAY) ret, binary = cv.threshold(gray, 0, 25

OpenCV——霍夫变换(直线检测、圆检测)

x 1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 #include <math.h> 4 5 using namespace cv; 6 using namespace std; 7 8 9 int main(int argc, char** argv) 10 { 11 Mat src, src_gray, dst; 12 src = imread("test1.jpg"); 13 1

Python+OpenCV图像处理之模板匹配

模板匹配就是在整个图像区域中发现与给定子图像匹配的小块区域 在OpenCV中,提供了相应的函数完成这个操作: matchTemplate 函数:在模板和输入图像之间寻找匹配,获得匹配结果图像 minMaxLoc 函数:在给定的矩阵中寻找最大和最小值,并给出它们的位置 几种常见的模板匹配算法: ①TM_SQDIFF是平方差匹配:TM_SQDIFF_NORMED是标准平方差匹配.利用平方差来进行匹配,最好匹配为0.匹配越差,匹配值越大. ②TM_CCORR是相关性匹配:TM_CCORR_NORMED

Python+OpenCV图像处理之对象测量

OpenCV中经常会测量对象的面积,周长,质心,边界框等 求图形几何矩中心 并求最小外接矩形python实现 import cv2 import numpy as np __author__ = "boboa" def measure_demo(image): gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.T

Python+OpenCV图像处理之开闭操作

开操作:图像形态学的重要操纵之一,基于膨胀与腐蚀操作组合形成的:主要是应用在二值图像分析中,灰度图像亦可 开操作 = 腐蚀+膨胀 ,输入图像 + 结构元素 作用:用来消除小物体.平滑较大物体的边界的同时并不明显改变其面积,提取水平或竖直的线 闭操作:图像形态学的重要操纵之一,基于膨胀与腐蚀操作组合形成的:主要是应用在二值图像分析中,灰度图像亦可 闭操作 = 膨胀+腐蚀 ,输入图像 + 结构元素 作用:用来填充物体内细小空洞.连接邻近物体.平滑其边界的同时并不明显改变其面积 python实现 im