当前位置: 首页 > article >正文

OpenCV 功能函数介绍 (二)

一,梯度处理的sobel算子函数  

功能:

用于计算图像梯度(gradient)的函数

参数:

cv2.Sobel(src, ddepth, dx, dy, ksize=3, scale=1, delta=0, borderType=None)

cv2.Sobel(输入图像 , 应该是灰度化后的图像

                输出图像的所需深度,:-1 来表示与输入图像相同的深度

                 x 方向上的导数阶数,如果你想要计算 x 方向上的梯度,设置这个参数为 1;如果你不关心 x 方向上的梯度,设置这个参数为 0。

                y 方向上的导数阶数,同上

                Sobel 核的大小,最好是1 3 5 7 9

返回值:

梯度化后的图片

应用:

import cv2

# 读取一张图
img = cv2.imread("./shudu.png")

# 使用sobel算子
# 水平梯度
img_sobel = cv2.Sobel(img, -1, 0, 1, ksize=3)
# 垂直梯度
img_sobel_2 = cv2.Sobel(img, -1, 1, 0, ksize=3)

cv2.imshow('image', img)
cv2.imshow('img_sobel', img_sobel)
cv2.imshow('img_sobel_2', img_sobel_2)

cv2.waitKey(0)
 

二,梯度处理Laplacian算子函数

 功能:

用于计算图像的拉普拉斯算子(Laplacian)

参数:

cv2.Laplacian(src, ddepth, ksize=1, scale=1, delta=0, borderType=None)

cv2.Laplacian(输入图像 , 应该是灰度化后的图像

                        输出图像的所需深度,

                         算子的大小,它必须是 1、3、5 或 7 之一

                        

返回值:

处理后的图像

应用:

import cv2

# 读取一张图
img = cv2.imread("./shudu.png")

# 使用拉普拉斯算子
img_lap = cv2.Laplacian(img, -1, ksize=3)

cv2.imshow('image', img)
cv2.imshow('img_lap', img_lap)

cv2.waitKey(0)

三,Canny算子函数

 功能:

用于边缘检测的函数

参数:

cv2.Canny(image, threshold1, threshold2, edges, apertureSize, L2gradient)

cv2.Canny(输入图像,它应该是一个灰度图像

        第一个阈值 , 用于确定边缘的初始点

        第二个阈值, 用于确定边缘的最终点      

返回值:

处理后的图片

应用:

import cv2

img = cv2.imread("./6.png")

# 灰度化
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 二值化
_, img_binary = cv2.threshold(img_gray, 127, 255,
                              cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 进行高斯滤波
img_blur = cv2.GaussianBlur(img_binary, (3,3), 3)

# 边缘检测
img_canny = cv2.Canny(img_blur, 10, 70)

cv2.imshow('img', img)
cv2.imshow('img_canny', img_canny)
cv2.waitKey(0)


四,findContours函数

 功能:

来进行寻找轮廓

参数:

cv2.findContours(image, mode, method, contour, hierarchy, offset.)

cv2.findContours(输入图像,一个二值图像

                              查询轮廓的方式,(

cv2.RETR_EXTERNAL:只检索最外层轮廓。

cv2.RETR_LIST:检索所有轮廓,但不创建任何父子关系。

cv2.RETR_CCOMP:检索所有轮廓,并将它们组织为两层结构,其中顶层是连通域的外边界,底层是孔的内边界。

cv2.RETR_TREE:检索所有轮廓,并重建完整的层次结构。

                                保存轮廓点坐标的方式(

v2.CHAIN_APPROX_NONE:存储所有的轮廓点,不进行任何近似。

cv2.CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角线段,只保留它们的终点。

cv2.CHAIN_APPROX_TC89_L1、cv2.CHAIN_APPROX_TC89_KCOS:应用 Teh-Chin 链式近似算法的一种变体。

                                

                                

                                

返回值:‌

contours‌:轮廓是由点组成的 NumPy 数组。

‌hierarchy‌ : 轮廓的层次结构信息

 
五,drawContours函数

 功能:

用于在图像上绘制轮廓的函数

参数:

cv2.drawContours(image, contours, contourIdx, color, thickness, lineType, hierarchy, maxLevel, offset)

cv2.drawContours(输入图像,

这是一个 Python 列表,  cv2.findContours() 函数返回的 NumPy 数组。

 轮廓列表的索引值,-1表示绘制所有轮廓

 颜色     

 轮廓线条粗细              

返回值:

处理后的图像

应用

import cv2

img = cv2.imread("./6.png")

# 灰度化
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 二值化
_, img_binary = cv2.threshold(img_gray, 127, 255,
                              cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 寻找轮廓
contours, hierarchy = cv2.findContours(img_binary,
                                       cv2.RETR_LIST,   # 查询轮廓的方式
                                       cv2.CHAIN_APPROX_SIMPLE  # 保存轮廓点坐标的方式
                                       )

# 绘制轮廓
img_copy = img.copy()
img_draw = cv2.drawContours(img_copy, # 要绘制轮廓的图像
                            contours, # 轮廓的顶点坐标集 列表
                            -1, # 轮廓列表的索引值,-1表示绘制所有轮廓
                            (0, 0, 255),  # 颜色
                            3   # 轮廓线条粗细
                            )

cv2.imshow('image', img)
cv2.imshow('image_draw', img_draw)
cv2.waitKey(0)

通过修改drawContours 的索引值

如图


六,透视变换函数

功能、参数、返回值

详细请看OpenCV 图片矫正-CSDN博客

应用:通过边缘检测 得到四个点坐标

import cv2
import numpy as np

#输入数据
img = cv2.imread("./ts.png")
img_copy = img.copy()

#高斯滤波

img_blur = cv2.GaussianBlur(img,(3,3),1)

#灰度化
img_gray = cv2.cvtColor(img_blur,cv2.COLOR_BGR2GRAY)

#二值化
_,img_binary = cv2.threshold(img_gray,127,255,
                             cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU
                             )

#寻找轮廓

contours, _ = cv2.findContours(img_binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

for cnt in contours:
    M = cv2.moments(cnt)
    if int(M['m00'])==0:
        continue
    arc_len = cv2.arcLength(cnt,True)

    approx = cv2.approxPolyDP(cnt,float(0.04)*arc_len,
                     True)#返回逼近的多边形点集
    print(approx)

    if len(approx)==3:
        shape = 'triangle'
    elif len(approx) == 4:
        x,y,w,h=cv2.boundingRect(approx)
        ratio = w/h
        if 0.95<=ratio<=1.05:
            shape ="square"
        else:
            shape = 'rectangle'
    elif len(approx) == 5:
        shape = 'pentagon'
    else:
        shape = 'circle'

    cv2.drawContours(img_copy,[cnt],-1,(0,0,0),2)
    cx = int(M['m10'] / M['m00'])
    cy = int(M['m01'] / M['m00'])

    cv2.putText(img_copy,#图片
                shape,#添加文字字符串
                (cx,cy),
                cv2.FONT_HERSHEY_SIMPLEX,
                0.5,
                (255,255,255))

points1 = np.array([[221, 132], [670, 178], [148, 385], [655, 441]],
                   dtype=np.float32)

points2 = np.array([[0, 0], [img.shape[1], 0], [0, img.shape[0]], [img.shape[1], img.shape[0]]],
                   dtype=np.float32)

M = cv2.getPerspectiveTransform(points1, points2)

# 3、透视变换
img_warp = cv2.warpPerspective(img, M, (img.shape[1], img.shape[0]))



cv2.imshow('image',img)
cv2.imshow('image_copy',img_copy)
cv2.imshow('image_warp',img_warp)

cv2.waitKey(0)


七举例轮廓的外接边界框,并对比说明

外接矩形(cv2.boundingRect()

计算轮廓的外接矩形,是一个轴对齐的矩形,不考虑物体的旋转。

最小外接矩形(cv2.minAreaRect()

计算一个最小面积的外接矩形,它不一定与坐标轴对齐,而是可以旋转以最小化矩形面积

import cv2
import numpy as np


img = cv2.imread("./outline.png")
#灰度
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#二值
_,img_binary = cv2.threshold(img_gray,127,255,
                             cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU
                             )

#寻找轮廓
contours,_ = cv2.findContours(img_binary,
                              cv2.RETR_LIST,
                              cv2.CHAIN_APPROX_SIMPLE
                              )

#绘制轮廓
img_draw = img.copy()
cv2.drawContours(img_draw,contours,-1,(0,255,255),2)

#外接最小外接矩形
for i in contours:
    cv2.boundingRect(i)#获取左上坐标(x,y),宽w,高h
    x,y,w,h =cv2.boundingRect(i)
    cv2.rectangle(img_draw,[x,y],[x+w,y+h],(0,255,0),2)
    #二获取三个元素元组(中心坐标,长宽,旋转角度)
    ret =cv2.minAreaRect(i)
    #调用v2.boxPoints(ret)函数获取旋转矩阵的四个顶点
    box  =np.int32(cv2.boxPoints(ret))
    #绘制轮廓
    cv2.drawContours(img_draw,[box],-1,(0,0,255),3)
    # #第三 调用外接圆函数
    # (x,y),radius = cv2.minEnclosingCircle(i)
    # (x,y,radius) = np.int32((x,y,radius))
    # cv2.circle(img_draw,(x,y),radius,(255,0,255),3)


cv2.imshow("img",img)
cv2.imshow("img_draw",img_draw)
cv2.waitKey(0)


http://www.kler.cn/a/441697.html

相关文章:

  • T-SQL语言的数据库编程
  • 【分布式架构设计理论1】架构设计的演进过程
  • Java自定义多队列线程池
  • Python运算符
  • [创业之路-255]:《华为数字化转型之道》-1-主要章节、核心内容、核心思想
  • Python基础学习(六)unittest 框架
  • awk使用详解
  • 【WPF】RenderTargetBitmap的使用
  • 如何让你的 PHP 应用坚不可摧
  • 【网络安全】掌握 Active Directory 攻防审计实操知识点
  • MaskGCT——开源文本转语音模型,可模仿任何人说话声音
  • 宝塔 搭建HOJ 配置域名 反向代理 开启https访问
  • Android使用PorterDuffXfermode的模式PorterDuff.Mode.SRC_OUT实现橡皮擦,Kotlin(1)
  • Flink-Learning全面探索流式处理的卓越框架
  • 【win10+RAGFlow+Ollama】搭建本地大模型助手(教程+源码)
  • CTFHub-ssrf
  • mysql flink cdc 实时数据抓取
  • 大模型QLoRA微调——基于Qwen2-7B的自动化病历摘要生成系统
  • OpenCV与Qt5构建卡尺找直线工具
  • 7.OPEN SQL
  • BIO实战、NIO编程与直接内存、零拷贝深入辨析
  • YOLOv8-ultralytics-8.2.103部分代码阅读笔记-train.py
  • 20221403郑骁恒_商用密码接口实现
  • 鸿蒙-应用内悬浮窗
  • LeetCode 2475 数组中不等三元组的数目
  • 【Linux】shell脚本二