使用opencv相关函数确定图片中的直线问题

目录
  • 使用opencv相关函数确定图片中的直线
  • OpenCV:直线检测

使用opencv相关函数确定图片中的直线

#pip install opencv-python==4.4.0.42 opencv-contrib-python==4.4.0.42

import cv2
import numpy as np
from matplotlib import pyplot as plt

import matplotlib.image as mpimg
import matplotlib as mpl
from PIL import Image
mpl.rcParams['figure.dpi'] = 200

#加载图像
img = cv2.imread('test.png')
plt.axis('off')
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
#灰度图像
img1 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#cornerHarris要求img是flaot32位
img1 = np.float32(img1)
#Harris角点检测函数
#  • img - 数据类型为 float32 的输入图像。
#  • blockSize - 角点检测中要考虑的领域大小。
#  • ksize - Sobel 求导中使用的窗口大小
#  • k - Harris 角点检测方程中的自由参数,取值参数为 [0,04,0.06].
dst = cv2.cornerHarris(img1,10,3,0.04)
plt.axis('off')
plt.imshow(dst, cmap='gray')
plt.show()
#膨胀
dst = cv2.dilate(dst,None)
plt.axis('off')
plt.imshow(dst, cmap='gray')
plt.show()
#显示经过处理后的图片
threshold = 0.01*dst.max()
img[dst>threshold]=[255,0,0]
#[255,0,0] - 点的颜色:蓝色, [0,255,0] - 绿色, [0,0,255] - 红色,
#[0,0,0] -白色, [255,255,255] - 黑色
plt.axis('off')
plt.imshow(img, cmap='gray')
plt.show()

#使用另一种角点检测函数
corners = cv2.goodFeaturesToTrack(gray, 6, 0.01, 5)
corners = np.int0(corners)
for i in corners:
    x, y = i.ravel()
    cv2.circle(img, (x, y), 5, [0,0,0], -1)
plt.axis('off')
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()

#直线检测

img = cv2.imread("road.jpeg")
plt.axis('off')
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()

#canny 方法检测边缘 返回二值图像
edges = cv2.Canny(gray, 150, 300)
plt.axis('off')
plt.imshow(edges, cmap='gray')
plt.show()
#HoughLinesP方法判断哪些边缘是直线

lines = cv2.HoughLinesP(edges, rho=1.0,theta=np.pi/180,threshold=20,minLineLength=30,maxLineGap=10)
line_img = np.zeros((img.shape[0], img.shape[1], 3), dtype=np.uint8)
line_color = [0, 255, 0]
line_thickness = 2
dot_color = [0, 255, 0]
dot_size = 3

#讲检测的直线叠加到原图
for line in lines:
    for x1, y1, x2, y2 in line:
        cv2.line(line_img, (x1, y1), (x2, y2), line_color, line_thickness)
        cv2.circle(line_img, (x1, y1), dot_size, dot_color, -1)
        cv2.circle(line_img, (x2, y2), dot_size, dot_color, -1)
final = cv2.addWeighted(img, 0.8, line_img, 1.0, 0.0)
plt.axis('off')
plt.imshow(cv2.cvtColor(final, cv2.COLOR_BGR2RGB))
plt.show()
 

OpenCV:直线检测

主要介绍OpenCV自带的直线检测函数HoughLines()的用法,这个函数的第一个参数是一个二值化图像,所以在进行霍夫变换之前要首先进行二值化,或者进行Canny 边缘检测。第二和第三个值分别代表β 和 θ 的精确度。

第四个参数是阈值,只有累加其中的值高于阈值时才被认为是一条直线,也可以把它看成能检测到的直线的最短长度(以像素点为单位)。返回值就是(β; θ)。β 的单位是像素,θ的单位是弧度。

看代码

#直线检测
#使用霍夫直线变换做直线检测,前提条件:边缘检测已经完成
import cv2 as cv
import numpy as np
import matplotlib.pylab as plt

#标准霍夫线变换
def line_detection(image):
    gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)
    edges = cv.Canny(gray, 50, 150, apertureSize=3)  #apertureSize参数默认其实就是3
    cv.imshow("edges", edges)
    lines = cv.HoughLines(edges, 1, np.pi/180, 80)
    for line in lines:
        rho, theta = line[0]  #line[0]存储的是点到直线的极径和极角,其中极角是弧度表示的。
        a = np.cos(theta)   #theta是弧度
        b = np.sin(theta)
        x0 = a * rho    #代表x = r * cos(theta)
        y0 = b * rho    #代表y = r * sin(theta)
        x1 = int(x0 + 1000 * (-b)) #计算直线起点横坐标
        y1 = int(y0 + 1000 * a)    #计算起始起点纵坐标
        x2 = int(x0 - 1000 * (-b)) #计算直线终点横坐标
        y2 = int(y0 - 1000 * a)    #计算直线终点纵坐标    注:这里的数值1000给出了画出的线段长度范围大小,数值越小,画出的线段越短,数值越大,画出的线段越长
        cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)    #点的坐标必须是元组,不能是列表。
    cv.imshow("image-lines", image)

#统计概率霍夫线变换
def line_detect_possible_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)
    edges = cv.Canny(gray, 50, 150, apertureSize=3)  # apertureSize参数默认其实就是3
    lines = cv.HoughLinesP(edges, 1, np.pi / 180, 60, minLineLength=60, maxLineGap=5)
    for line in lines:
        x1, y1, x2, y2 = line[0]
        cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
    cv.imshow("line_detect_possible_demo",image)

src = cv.imread(r'..\edge.jpg')
print(src.shape)
cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE)
cv.imshow('input_image', src)
line_detection(src)
src = cv.imread(r'..\edge.jpg') #调用上一个函数后,会把传入的src数组改变,所以调用下一个函数时,要重新读取图片
line_detect_possible_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

看效果

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 利用Opencv中Houghline方法实现直线检测

    利用Opencv中的Houghline方法进行直线检测-python语言 这是给Python部落翻译的文章,请在这里看原文. 在图像处理中,霍夫变换用来检测任意能够用数学公式表达的形状,即使这个形状被破坏或者有点扭曲. 下面我们将看到利用HoughLine算法来阐述霍夫变化进行直线检测的原理,把此算法应用到特点图像的边缘检测是可取的.边缘检测方法请参考这篇文章–边缘检测. Houghline算法基础 直线可以表示为y=mx+c,或者以极坐标形式表示为r=xcosθ+ysinθ,其中r是原点到直线

  • Python-OpenCV中的cv2.inpaint()函数的使用

    目录 概念 库函数 实现 代码 概念 修复是图像插值.数字修复算法在图像插值,照片恢复,缩放和超分辨率等方面具有广泛的应用. 大多数人会在家里放一些旧的退化照片,上面有一些黑点,一些笔画等.你有没有想过恢复它?我们不能简单地在绘画工具中擦除它们,因为它将简单地用白色结构替换黑色结构,这是没有用的.在这些情况下,使用称为图像修复的技术.基本思路很简单:用邻近的像素替换那些坏标记,使其看起来像是邻居(取自维基百科),考虑下面显示的图像: 库函数 dst = cv2.inpaint(src,mask,

  • 详解在Python中使用OpenCV进行直线检测

    目录 1.引言 2.霍夫变换 3.举个栗子 3.1读入图像进行灰度化 3.2执行边缘检测 3.3进行霍夫变换 补充 1. 引言 在图像处理中,直线检测是一种常见的算法,它通常获取n个边缘点的集合,并找到通过这些边缘点的直线.其中用于直线检测,最为流行的检测器是基于霍夫变换的直线检测技术. 2. 霍夫变换 霍夫变换是图像处理中的一种特征提取方法,可以识别图像中的几何形状.它将在参数空间内进行投票来决定其物体形状,通过检测累计结果找到一极大值所对应的解,利用此解即可得到一个符合特定形状的参数. 在使

  • 使用opencv相关函数确定图片中的直线问题

    目录 使用opencv相关函数确定图片中的直线 OpenCV:直线检测 使用opencv相关函数确定图片中的直线 #pip install opencv-python==4.4.0.42 opencv-contrib-python==4.4.0.42 import cv2 import numpy as np from matplotlib import pyplot as plt import matplotlib.image as mpimg import matplotlib as mpl

  • OpenCV如何去除图片中的阴影的实现

    一.前言 如果你自己打印过东西,应该有过这种经历.如果用自己拍的图片,在手机上看感觉还是清晰可见,但是一打印出来就是漆黑一片.比如下面这两张图片: 因为左边的图片有大片阴影,所有打印出来的图片不堪入目(因为打印要3毛钱,所以第二张图片只是我用程序模拟的效果). 那有什么办法可以解决吗?答案是肯定的,今天我们就来探讨几个去除阴影的方法. 二.如何去除阴影? 首先为了方便处理,我们通常会对图片进行灰度转换(即将图片转换成只有一个图层的灰色图像). 然后我们分析一下,在上面的图片中有三个主色调,分别是

  • Python下opencv使用hough变换检测直线与圆

    在数字图像中,往往存在着一些特殊形状的几何图形,像检测马路边一条直线,检测人眼的圆形等等,有时我们需要把这些特定图形检测出来,hough变换就是这样一种检测的工具. Hough变换的原理是将特定图形上的点变换到一组参数空间上,根据参数空间点的累计结果找到一个极大值对应的解,那么这个解就对应着要寻找的几何形状的参数(比如说直线,那么就会得到直线的斜率k与常熟b,圆就会得到圆心与半径等等). 关于hough变换,核心以及难点就是关于就是有原始空间到参数空间的变换上.以直线检测为例,假设有一条直线L,

  • python进行OpenCV实战之画图(直线、矩形、圆形)

    前言 在上一节我们通过使用NumPy的数组分割成功的在我们的图像上画了一个绿色的方块,但是如果我们想画一个单一的线条或者圆圈该怎么办呢?NumPy没有提供相关的功能,但是OpenCV提供了相关的函数,在本节就将为大家介绍三个基本的OpenCV画图方法: cv2.line() #1 cv2.rectangle() #2 cv2.circle() #3 1 画直线和矩形 在开始我们用OpenCV画我们的杰作之前,我们需要定义一个画布 import numpy as np #1 import cv2

  • OpenCV如何提取图片中曲线

    简单介绍   在实际的应用中,我们常常需要对图像中的曲线进行描述.处理,这个曲线可以是轮廓,骨架或者其他.可以用deque<Point> 描述曲线,接下来简单介绍下如何从图片中搜索这些曲线并保存.   首先,输入的图片是一张二值图片 (白色为曲线),其中包含的曲线宽度为 1 像素的 (如果曲线不是 1 像素的 先提取其骨架).遍历寻找图像中第一个白色的点,然后从这个点开始延伸寻找曲线.注意,第一个找到的点不一定是曲线的端点,因此应该分别向两边寻找相邻的点,因此deque 会好一些.每找到一个点

  • python opencv实现直线检测并测出倾斜角度(附源码+注释)

    由于学习需要,我想要检测出图片中的直线,并且得到这些直线的角度.于是我在网上搜了好多直线检测的代码,但是没有搜到附有计算直线倾斜角度的代码,所以我花了一点时间,自己写了一份直线检测并测出倾斜角度的代码,希望能够帮助到大家! 注:这份代码只能够检测简单结构图片的直线,复杂结构的图片还需要设置合理的参数 下面展示 源码. import cv2 import numpy as np def line_detect(image): # 将图片转换为HSV hsv = cv2.cvtColor(image

  • OpenCV霍夫变换(Hough Transform)直线检测详解

    霍夫变换(Hough Transform)的主要思想: 一条直线在平面直角坐标系(x-y)中可以用y=ax+b式表示,对于直线上一个确定的点(x0,y0),总符合y0-ax0=b,而它可以表示为参数平面坐标系(a-b)中的一条直线.因此,图像中的一个点对应参数平面的一条直线,同样,图像中的一条直线对应参数平面上的一个点. 基本Hough变换检测直线: 由于同一条直线上的不同点在参数平面中是会经过同一个点的多条线.对图像的所有点作霍夫变换,检测直线就意味着找到对应参数平面中的直线相交最多的点.对这

  • OpenCV停车场车位实时检测项目实践

    目录 1. 写在前面 2. 整体流程梳理 3. 数据预处理 3.1 背景过滤 3.2 Canny边缘检测 3.3 停车场区域提取 3.4 霍夫变换检测直线 3.5 以列为单位,划分停车位 3.6 锁定每个停车位 3.7 为CNN生成预测图片 4. 模型的训练和预测 4.1 模型训练 4.2 模型预测 5. 小结 1. 写在前面 今天整理OpenCV入门的第三个实战小项目,前面的两篇文章整理了信用卡数字识别以及文档OCR扫描, 大部分用到的是OpenCV里面的基础图像预处理技术,比如轮廓检测,边缘

  • opencv3.0识别并提取图形中的矩形的方法

    利用opencv来识别图片中的矩形. 其中遇到的问题主要是识别轮廓时矩形内部的形状导致轮廓不闭合. 1. 对输入灰度图片进行高斯滤波  2. 做灰度直方图,提取阈值,做二值化处理  3. 提取图片轮廓  4. 识别图片中的矩形  5. 提取图片中的矩形 1.对输入灰度图片进行高斯滤波 cv::Mat src = cv::imread("F:\\t13.bmp",CV_BGR2GRAY); cv::Mat hsv; GaussianBlur(src,hsv,cv::Size(5,5),0

随机推荐