第二周opencv

一、边缘检测算子

边缘检测算子是用于检测图像中物体边界的工具。边缘通常表示图像中灰度值或颜色发生显著变化的地方。边缘检测有助于识别图像中的物体形状、轮廓和结构。这些算子通过分析图像的灰度或颜色梯度来确定图像中的边缘。

1、Roberts 算子

通过局部差分计算检测边缘线条。常用来处理具有陡峭的低噪声图像,当图像边缘接近于正45度或负45度时,该算法处理效果更理想。其缺点是对边缘的定位不太准确,提取的边缘线条较粗。

python 复制代码
import cv2
import numpy as np
import matplotlib.pyplot as plt

image = cv2.imread("../images/1.png", cv2.IMREAD_GRAYSCALE)
# 1.定义 Roberts 算子的卷积核
roberts_x = np.array([[1, 0], [0, -1]], dtype=np.float32)
roberts_y = np.array([[0, 1], [-1, 0]], dtype=np.float32)
# 2.二维卷积操作
# 使用 filter2D 函数应用 Roberts 算子卷积核
gradient_x = cv2.filter2D(image, cv2.CV_64F, roberts_x)
gradient_y = cv2.filter2D(image, cv2.CV_64F, roberts_y)

# 3.计算梯度幅值
gradient_magnitude = np.sqrt(gradient_x**2 + gradient_y**2)

# 转换结果为8位图像
gradient_magnitude = np.uint8(gradient_magnitude)

# 显示原图、Roberts算子的结果和应用结果
plt.subplot(1, 4, 1)
plt.imshow(image, cmap='gray')
plt.title("Original Image")
plt.axis("off")

plt.subplot(1, 4, 2)
plt.imshow(gradient_x, cmap='gray')
plt.title("Roberts X")
plt.axis("off")

plt.subplot(1, 4, 3)
plt.imshow(gradient_y, cmap='gray')
plt.title("Roberts Y")
plt.axis("off")

plt.subplot(1, 4, 4)
plt.imshow(gradient_magnitude, cmap='gray')
plt.title("Magnitude")
plt.axis("off")

plt.show()

2、Prewitt 算子

利用特定区域内像素灰度值产生的差分实现边缘检测。由于Prewitt算子采用 3×3 模板对区域内的像素值进行计算,而Robert算子的模板为 2××2,故Prewitt算子的边缘检测结果在水平方向和垂直方向均比Robert算子更加明显。Prewitt算子适合用来识别噪声较多、灰度渐变的图像。

python 复制代码
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
img = cv2.imread("../images/1.png", cv2.IMREAD_GRAYSCALE)

# 1.使用Prewitt算子
kernelx = np.array([[1, 0, -1], [1, 0, -1], [1, 0, -1]], dtype=int)
kernely = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]], dtype=int)
# 2.卷积
gradient_x = cv2.filter2D(img, cv2.CV_64F, kernelx)
gradient_y = cv2.filter2D(img, cv2.CV_64F, kernely)
# 3
# 计算梯度幅值
gradient_magnitude = np.sqrt(gradient_x**2 + gradient_y**2)

# 转换结果为8位图像
gradient_magnitude = np.uint8(gradient_magnitude)

# 显示原图、水平梯度、垂直梯度、Prewitt算子的结果
plt.subplot(141), plt.imshow(img, cmap='gray'), plt.title('Original Image'), plt.axis('off')
plt.subplot(142), plt.imshow(gradient_x, cmap='gray'), plt.title('X'), plt.axis('off')
plt.subplot(143), plt.imshow(gradient_y, cmap='gray'), plt.title('Y'), plt.axis('off')
plt.subplot(144), plt.imshow(gradient_magnitude, cmap='gray'), plt.title('Prewitt Operator'), plt.axis('off')
plt.show()

3、Laplace

拉普拉斯算子常用于图像增强领域和边缘提取。它通过灰度差分计算邻域内的像素。如果中心像素灰度高,提升中心像素的灰度;反之,降低中心像素的灰度。

python 复制代码
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
img = cv2.imread('../images/1.png', cv2.IMREAD_GRAYSCALE)

# 使用拉普拉斯算子
laplacian = cv2.Laplacian(img, cv2.CV_64F)

# 转换结果为8位图像
laplacian = np.uint8(np.absolute(laplacian))

# 显示原图和拉普拉斯算子的结果
plt.subplot(121), plt.imshow(img, cmap='gray'), plt.title('Original Image'), plt.axis('off')
plt.subplot(122), plt.imshow(laplacian, cmap='gray'), plt.title('Laplacian Operator'), plt.axis('off')
plt.show()

4、Canny算子

Canny基本步骤:

1.去噪:应用高斯滤波来平滑图像

2.计算图像的梯度,在水平和垂直方向上找到图像的边缘

3.非极大值抑制:保留梯度方向上的局部极大值,细化边缘

4.确定边缘。使用双阈值算法确定最终的边缘信息

python 复制代码
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
image = cv2.imread('../images/1.png', cv2.IMREAD_GRAYSCALE)

# 使用Canny算子进行边缘检测
edges = cv2.Canny(image, 50, 150)  # 50和150是Canny算子的两个阈值

# 显示原始图像和边缘检测结果
plt.subplot(121), plt.imshow(image, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])

plt.subplot(122), plt.imshow(edges, cmap='gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])

plt.show()

5、四种算子的比较

相关推荐
phoenix@Capricornus5 分钟前
样本与样本值
人工智能·机器学习·概率论
讲师-汪春波6 分钟前
【无标题】
人工智能
RockHopper202515 分钟前
利用数字孪生技术打造智能工厂的“情境认知”能力
人工智能·智能制造·数字孪生·智能工厂
喵叔哟28 分钟前
8. 从0到上线:.NET 8 + ML.NET LTR 智能类目匹配实战--规则回退与可解释性:四层策略如何兜底
人工智能·深度学习·.net
微软技术栈29 分钟前
Microsoft AI Genius | 用智能 Microsoft Copilot 副驾驶® 构建高韧性 DevOps 流程
人工智能·microsoft·copilot
茶杯67541 分钟前
GraphRAG产品赋能企业智能升级:创邻科技知寰Hybrid RAG的四大核心应用场景深度解析
人工智能·科技·graphrag产品
少林and叔叔43 分钟前
基于yolov5.7.0的人工智能算法的下载、开发环境搭建(pycharm)与运行测试
人工智能·pytorch·python·yolo·目标检测·pycharm
kuan_li_lyg1 小时前
笛卡尔坐标机器人控制的虚拟前向动力学模型
人工智能·stm32·机器人·机械臂·动力学·运动学·导纳控制
合作小小程序员小小店1 小时前
旧版本附近停车场推荐系统demo,基于python+flask+协同推荐(基于用户信息推荐),开发语言python,数据库mysql,
人工智能·python·flask·sklearn·推荐算法
却道天凉_好个秋1 小时前
OpenCV(十四):绘制直线
人工智能·opencv·计算机视觉