Opencv高级图像处理

Opencv高级图像处理

图像坐标

在这里插入图片描述

row=height=Point.y
col=width=Point.x

二值化

import cv2  
import numpy as np  

# 打开图像  
image_path = 'your_image_path.jpg'  # 图片路径  
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)  # 以灰度模式读取图像  

# 检查图像是否正确读取  
if image is None:  
    print(f"Could not open or find the image: {
     
     image_path}")  
    exit(0)  

# 选择二值化方法,这里使用简单的阈值法  
# 你可以调整阈值(127, 255)来得到不同的效果  
# 第一个参数是源图像,第二个参数是用于分类像素的阈值,  
# 第三个参数是赋予超过阈值的像素的新值,第四个参数是二值化的类型  
ret, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)  

# 保存处理后的图像  
output_path = 'binary_image.jpg'  # 保存路径
cv2.imwrite(output_path, binary_image)

滤波

高斯滤波

blurred = cv2.GaussianBlur(image, (11, 11), 0)

中值滤波

result = cv2.medianBlur(image, 3)

开闭运算

op_open = cv2.morphologyEx(blurred_raw, cv2.MORPH_OPEN, k) # 开运算
op_close = cv2.morphologyEx(blurred_raw, cv2.MORPH_CLOSE, k) # 闭运算

检测

霍夫圆检测

函数 cv2.HoughCircles()

参数 含义
image 原始图像
method 目前只支持cv2.HOUGH_GRADIENT
dp 图像解析的反向比例。1为原始大小,2为原始大小的一半
minDist 圆心之间的最小距离。过小会增加圆的误判,过大会丢失存在的圆
param1(maxval) Canny检测器的高阈值,用于检测边缘点的阈值,大于此值才被检测出来。
param2(minval) 检测阶段圆心的累加器阈值(thresh)。越小的话,会增加不存在的圆;越大的话,则检测到的圆就更加接近完美的圆形,检测到圆所需要的最小边缘点数,边缘点数小于此值则舍弃。
minRadius 检测的最小圆的半径
maxRadius 检测的最大圆的半径
# 霍夫圆检测
circles = cv2.HoughCircles(image=raw, cv2.HOUGH_GRADIENT, dp=1, minDist=20, param1=150, param2=100,minRadius=0, maxRadius=0)

# 绘制检测圆
if circles is not None:
    print(f"检测到圆的个数:{
     
     len(circles)}")
    # print(f"{circles}")
    circles = np.round(circles[0, :]).astype("int")
    for (x, y, r) in circles:
        cv2.circle(image, (x, y), r, (0, 255, 0), 1)
else:
    print("未检测到圆")

边缘检测

Canny边缘检测
  • 目的:Canny边缘检测算法的目的是识别图像中的一维边缘。该算法通过多步骤过程检测图像中的边缘,包括平滑图像以减少噪声、计算图像梯度以找到潜在的边缘点、应用非极大值抑制(NMS)以获得细边缘,以及使用双阈值算法和边缘连接通过滞后阈值处理确定最终边缘。
  • 输出:Canny算法输出的是一个二值图像,其中边缘上的像素为白色(或1),其余像素为黑色(或0)。

在这里插入图片描述

edges = cv2.Canny(blurred_raw, threshold1=10, threshold2=70)
# edges 是检测之后的图像

原理:参考链接:知乎文章

findContours
  • 目的findContours函数的目的是从二值图像中提取轮廓线。轮廓可以被视为连续的点(沿着边界)组成的曲线,适用于形状分析和对象检测和识别。
  • 工作方式findContours通过追踪二值图像中的白色(或前景)部分的边缘来查找轮廓。这通常是在应用了阈值处理或边缘检测之后进行。
  • 输出:该函数返回两个主要的输出:轮廓本身(一个点的列表,这些点连续地定义了边界)和每个轮廓的层级信息(表示轮廓之间的父子关系)。
# 边缘检测
ret, thresh = cv2.threshold(src=blurred_image, thresh=60, maxval=255, type=0)
contours, hierarchy = cv2.findContours(image=thresh, mode=cv2.RETR_TREE, method=cv2.CHAIN_APPROX_SIMPLE)

# image,单通道图像矩阵,可以是灰度图,但更常用的是二值图像,一般是经过Canny、拉普拉斯等边缘检测算子处理过的二值图像

# 绘制边缘
image = cv2.drawContours(image=image, contours=contours, contourIdx=-1, color=(0, 255, 0), thickness=3)
区别
  • 应用场景:Canny边缘检测主要用于边缘识别,适合于图像中边缘的检测和跟踪。而findContours用于提取轮廓信息,适用于更高级的形状分析和对象识别。
  • 输出类型:Canny边缘检测输出一个二值图像,其中包含检测到的边缘。findContours则返回轮廓点的集合,这些点可以用来描述对象的形状。
  • 后续处理:Canny检测出的边缘通常用作其他图像处理操作的预处理步骤,比如轮廓提取。findContours通常是形状分析或对象识别流程中的一步,它依赖于边缘检测的结果。

简而言之,Canny边缘检测专注于识别图像中的边缘,而findContours则用于基于这些边缘或其他图像特征提取和分析轮廓。在许多实际应用中,这两个步骤经常连续使用:首

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sun_Raiser

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值