028-OpenCV标准霍夫变换、累计概率霍夫变换、霍夫圆变换

话不多说,上代码,看结果。

import cv2  # 导入库
import numpy as np
'''  
    cv2.imread(filename,flags)
# filename为文件名,图片与.py文件在一个文件夹时输入文件名即可
# 不在一个文件夹时输入图片的路径和名字
# flags为图片的颜色类型,默认为1,灰度图像为0
'''
img = cv2.imread('21.jpg')
'''
    cv2.cvtColor()
# 颜色空间转换
# img为要转换的图像,后者为转换的格式
# 颜色空间有很多种,最常见的就是RGB颜色空间
# R红色,G绿色,B蓝色,OpenCV中顺序是BGR!!!!!!!
# [255, 0,0]是蓝色,[0, 255, 0]表示绿色,[0, 0, 255]表示红色
    HSV颜色空间
# 也挺常用的,H是色调,S是饱和度,V是明度,具体百度就行
'''
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
'''
    cv2.GaussianBlur(src,ksize, sigmaX, dst, sigmaY, borderType)
    高斯滤波
# src 要滤波的图像  dst 输出图像 
# ksize(x,y)表示内核大小,x,y可以不同,但是必须为正奇数或者0, 由sigma计算得来  
# sigmaX: 表示高斯函数在X方向上的标准偏差
# sigmaY: 表示高斯函数在Y方向上的标准偏差 
# 若sigmaY=0, 就将它设置为sigmaX; 
# 若sigmaY、sigmaX=0,则由ksize.x和ksize.y计算出来
# borderType 图像像素边界类型,默认就行
'''
img1 = cv2.GaussianBlur(gray, (3, 3), 0)
'''
    cv2.Canny(image, threshold1, threshold2, edges, apertureSize, L2gradient)
# src 输入图像 dst 输出边缘图像
# threshold1: 滞后阈值低阈值(用于边缘连接) threshold2: 滞后阈值高阈值(控制边缘初始段)
# 推荐高低阈值比值在2:1到3:1之间
# apertureSize: 表示Sobel算子孔径大小, 默认值3
# L2gradient: 计算图像梯度幅值的标识
'''
img1 = cv2.Canny(img1, 30, 100)
'''
   cv2.imshow(winname,mat)
# winname为显示的窗口
# mat 需要显示的图像
'''
cv2.imshow('img1', img1)
'''
    cv2.HoughLines(image, rho, theta, threshold, lines, srn, stn, min_theta, max_theta)
    标准霍夫变换  (ρ,θ)
# image 输入图像
# rho 以像素为单位的距离精度ρ, 另一种表述方式是直线搜索时的进步尺寸的单位半径
# theta: 以弧度为单位的角度精度θ, 另一种表述方式是直线搜索时的进步尺寸的角度单位
# threshold 累加平面的阈值参数, 即识别某部分为一条直线时它在累加平面中必须达到的值
# 大于阈值threshold的线段才可以被检测通过并返回到结果中
# (ρ,θ) 
'''
lines = cv2.HoughLines(img1, 1, np.pi/180, 130)
lines1 = lines[:, 0, :]
for rho, theta in lines1[:]:
    x0 = rho * np.cos(theta)
    y0 = rho * np.sin(theta)
    x1 = int(x0 - 100 * np.sin(theta))  # 100是ρ
    y1 = int(y0 + 100 * np.cos(theta))
    x2 = int(x0 + 100 * np.sin(theta))  # 100是ρ
    y2 = int(y0 - 100 * np.cos(theta))
    cv2.line(img, (x1, y1), (x2, y2), (0, 255, 255), 2)
    cv2.circle(img, (x0, y0), 2, (0, 255, 0), -1, cv2.LINE_AA)
cv2.imshow('img2',  img)
'''
    cv2.waitKey(delay)
#  delay为正数时,延时delay毫秒结束
#  想要用按下某个键时退出可用以下方法:
#  if(cv2.waitKey(0)  == ord('q')):
        exit(0)
#别的方法也行,不唯一
'''
if cv2.waitKey(0) & 0xFF == 27:
    exit(0)
'''
    cv2.destroyWindow(winname)
#结束窗口,winname为窗口名
    cv2.destroyAllWindows() 
#结束所有窗口
'''
cv2.destroyAllWindows()

结果如下图。
在这里插入图片描述
接下来是累计概率霍夫变换。


import cv2  # 导入库
import numpy as np

'''  
    cv2.imread(filename,flags)
# filename为文件名,图片与.py文件在一个文件夹时输入文件名即可
# 不在一个文件夹时输入图片的路径和名字
# flags为图片的颜色类型,默认为1,灰度图像为0
'''
img = cv2.imread('21.jpg')
'''
    cv2.cvtColor()
# 颜色空间转换
# img为要转换的图像,后者为转换的格式
# 颜色空间有很多种,最常见的就是RGB颜色空间
# R红色,G绿色,B蓝色,OpenCV中顺序是BGR!!!!!!!
# [255, 0,0]是蓝色,[0, 255, 0]表示绿色,[0, 0, 255]表示红色
    HSV颜色空间
# 也挺常用的,H是色调,S是饱和度,V是明度,具体百度就行
'''
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
'''
    cv2.GaussianBlur(src,ksize, sigmaX, dst, sigmaY, borderType)
    高斯滤波
# src 要滤波的图像  dst 输出图像 
# ksize(x,y)表示内核大小,x,y可以不同,但是必须为正奇数或者0, 由sigma计算得来  
# sigmaX: 表示高斯函数在X方向上的标准偏差
# sigmaY: 表示高斯函数在Y方向上的标准偏差 
# 若sigmaY=0, 就将它设置为sigmaX; 
# 若sigmaY、sigmaX=0,则由ksize.x和ksize.y计算出来
# borderType 图像像素边界类型,默认就行
'''
img1 = cv2.GaussianBlur(gray, (3, 3), 0)
'''
    cv2.Canny(image, threshold1, threshold2, edges, apertureSize, L2gradient)
# src 输入图像 dst 输出边缘图像
# threshold1: 滞后阈值低阈值(用于边缘连接) threshold2: 滞后阈值高阈值(控制边缘初始段)
# 推荐高低阈值比值在2:1到3:1之间
# apertureSize: 表示Sobel算子孔径大小, 默认值3
# L2gradient: 计算图像梯度幅值的标识
'''
img1 = cv2.Canny(img1, 30, 100)
cv2.imshow('img1', img1)
'''
    cv2.HoughLinesP(image, rho, theta, threshold, lines, minLineLength, maxLineGap)
    累计概率霍夫变换  (ρ,θ)
# image 输入图像
# rho 以像素为单位的距离精度ρ, 另一种表述方式是直线搜索时的进步尺寸的单位半径
# theta: 以弧度为单位的角度精度θ, 另一种表述方式是直线搜索时的进步尺寸的角度单位
# threshold 累加平面的阈值参数, 即识别某部分为一条直线时它在累加平面中必须达到的值
# 大于阈值threshold的线段才可以被检测通过并返回到结果中
# minLineLength 默认值0, 表示最低线段的长度, 小于则不显示
# maxLineGap 默认值0, 允许将同一行点与点之间连接起来的最大距离
'''
lines = cv2.HoughLinesP(img1, 1, np.pi/180, 130, minLineLength=5, maxLineGap=100)
lines1 = lines[:, 0, :]
for x1, y1, x2, y2 in lines1[:]:
    cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.imshow('img2',  img)

'''
cv2.waitKey(delay)
#  delay为正数时,延时delay毫秒结束
#  想要用按下某个键时退出可用以下方法:
#  if(cv2.waitKey(0)  == ord('q')):
        exit(0)
#别的方法也行,不唯一
'''
if cv2.waitKey(0) & 0xFF == 27:
    exit(0)
'''
cv2.destroyWindow(winname)
#结束窗口,winname为窗口名
cv2.destroyAllWindows() 
#结束所有窗口
'''
cv2.destroyAllWindows()  # 销毁所有窗口

结果如下图。
在这里插入图片描述
接下来是霍夫圆变换。


import cv2           # 导入库
import numpy as np
'''  
    cv2.imread(filename,flags)
# filename为文件名,图片与.py文件在一个文件夹时输入文件名即可
# 不在一个文件夹时输入图片的路径和名字
# flags为图片的颜色类型,默认为1,灰度图像为0
'''
img = cv2.imread('19.jpg')
'''
    cv2.cvtColor()
# 颜色空间转换
# img为要转换的图像,后者为转换的格式
# 颜色空间有很多种,最常见的就是RGB颜色空间
# R红色,G绿色,B蓝色,OpenCV中顺序是BGR!!!!!!!
# [255, 0,0]是蓝色,[0, 255, 0]表示绿色,[0, 0, 255]表示红色
    HSV颜色空间
# 也挺常用的,H是色调,S是饱和度,V是明度,具体百度就行
'''
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
'''
    cv2.medianBlur(src, ksize, dst)
    中值滤波 一种非线性滤波, 是用像素点邻域灰度值的中值代替该点的灰度值, 可以去除脉冲噪声和椒盐噪声
# src 要滤波的图像  dst 输出图像
# ksize  int类型的孔径的线性尺寸, 大于1的奇数
'''
img1 = cv2.medianBlur(gray, 7)
'''
   cv2.imshow(winname,mat)
# winname为显示的窗口
# mat 需要显示的图像
'''
cv2.imshow('img1', img1)
'''
    cv2.HoughCircles(image, method, dp, minDist, circles, param1, param2, minRadius, maxRadius)
    霍夫圆变换  (ρ,θ)
# image 输入图像
# method 使用的检测方法, 默认只有一种cv2.HOUGH_GRADIENT
# dp 用来检测圆心的累加器图像的分辨率与输入图像之比的倒数, 且此参数允许创建一个比输入图像分辨率低的累加器。
# 如dp=1, 累加器和输入如下具有相同分辨率; dp=2, 累加器只有输入图像一半大的宽度和高度
# minDist 霍夫变换检测到圆的圆心之间的最小距离,辨两个不同圆
# circles: 经过霍夫变换后检测圆的输出矢量, 每个矢量包含三个元素的浮点矢量(x, y, radius)
# param1 默认值100, 它是第三个参数method设置的对应参数, 表示传递给Canny边缘算子的高阈值, 低阈值是高阈值的一半
# param2 默认值100,它是第三个参数method设置的对应参数,表示检测阶段圆心累加器阈值
# 越小, 则会检测到越多不存在的圆, 越大, 更多真正的圆被检测到
# minRadius/maxRadius: 表示圆半径的最小值/最大值 
'''
circles = cv2.HoughCircles(img1, cv2.HOUGH_GRADIENT, 1, 10, param1=50, param2=20, minRadius=10, maxRadius=15)
circles = np.uint16(np.around(circles))
a, b, c = circles.shape
for i in range(b):
    '''
        cv2.circle(img, center, radius, color, thickness, lineType,shift)
    # 画圆
    # img,被画圆的图像    center,圆心坐标 radius,圆半径
    # color,圆的颜色,BGR颜色  thickness,线的宽度,-1的时候表示填充圆
    # lineType,有三种cv2.LINE_AA、cv2.LINE_4、cv2.LINE_8
    # cv2.LINE_AA抗锯齿,这种类型的线看起来平滑点
    # shift,坐标精确到小数点后第几位
    '''
    cv2.circle(gray, (circles[0][i][0], circles[0][i][1]), circles[0][i][2], (0, 0, 255), 3, cv2.LINE_AA)
    cv2.circle(gray, (circles[0][i][0], circles[0][i][1]), 2, (0, 255, 0), 3, cv2.LINE_AA)  # draw center of circle
'''
   cv2.imshow(winname,mat)
# winname为显示的窗口
# mat 需要显示的图像
'''
cv2.imshow('img2', gray)
'''
    cv2.waitKey(delay)
#  delay为正数时,延时delay毫秒结束
#  想要用按下某个键时退出可用以下方法:
#  if(cv2.waitKey(0)  == ord('q')):
        exit(0)
#别的方法也行,不唯一
'''
if cv2.waitKey(0) & 0xFF == 27:
    exit(0)
'''
    cv2.destroyWindow(winname)
#结束窗口,winname为窗口名
    cv2.destroyAllWindows() 
#结束所有窗口
'''
cv2.destroyAllWindows()

结果如下图。
在这里插入图片描述
就先这样,遇到别的再补充。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值