文章目录
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
则用于基于这些边缘或其他图像特征提取和分析轮廓。在许多实际应用中,这两个步骤经常连续使用:首