图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。在OpenCV中,图像形态学操作通过一系列的数学运算来实现,如腐蚀、膨胀、开运算、闭运算等。这些操作在图像处理、计算机视觉和模式识别等领域有着广泛的应用。
边缘检测:是图形图像处理、计算机视觉和机器视觉中的一个基本工具,通常用于特征提取和特征检测,旨在检测一张数字图像中有明显变化的边缘或者不连续的区域
边缘检测的基本原理是基于图像中局部区域与周围区域之间的灰度变化。当图像中存在灰度变化时,这种变化通常被视为边缘。在实际应用中,梯度可以通过不同的算法来计算,如Sobel算子、Prewitt算子等。这些算法通过应用特定的卷积核(或模板)到图像上,来计算每个像素点的梯度。
import cv2
# 读取图片
monkey = cv2.imread('monkey.jpg', cv2.IMREAD_GRAYSCALE)
# 使用Sobel算子检测x方向的边缘,结果以64位浮点数存储
monkey_x_64 = cv2.Sobel(monkey, cv2.CV_64F, dx=1, dy=0)
# 将64位浮点数结果转换为8位无符号整数,便于显示
monkey_x_full = cv2.convertScaleAbs(monkey_x_64)
# 使用Sobel算子检测y方向的边缘,结果以64位浮点数存储
monkey_y_64 = cv2.Sobel(monkey, cv2.CV_64F, dx=0, dy=1)
# 将64位浮点数结果转换为8位无符号整数,便于显示
monkey_y_full = cv2.convertScaleAbs(monkey_y_64)
# 将x和y方向的边缘图像加权合并
monkey_xy_full = cv2.addWeighted(monkey_x_full, 0.5, monkey_y_full, 0.5, 0) # 这里我调整了权重为0.5和0.5,您可以根据需要调整
# 显示合并后的边缘图像
cv2.imshow("monkey_xy", monkey_xy_full)
# 等待按键操作
cv2.waitKey(0)
# 关闭所有OpenCV窗口
cv2.destroyAllWindows()
前后对比
import cv2
# 读取图片,注意文件名更正为 monkey.jpg
monkey = cv2.imread('monkey.jpg', cv2.IMREAD_GRAYSCALE)
# 显示原始灰度图片
cv2.imshow('Original Monkey', monkey)
cv2.waitKey(0)
# 使用Canny边缘检测算法
monkey_canny = cv2.Canny(monkey, 50, 100)
# 显示Canny边缘检测结果,注意窗口命名以避免混淆
cv2.imshow('Canny Edges', monkey_canny)
cv2.waitKey(0)
# 关闭所有OpenCV窗口
cv2.destroyAllWindows()
前后对比
import cv2
# 读取图片,注意文件名更正为 monkey.jpg
monkey = cv2.imread('monkey.jpg', cv2.IMREAD_GRAYSCALE)
# 应用Laplacian算子检测边缘
monkey_lap = cv2.Laplacian(monkey, cv2.CV_64F)
monkey_lap_full = cv2.convertScaleAbs(monkey_lap)
# 显示Laplacian边缘检测结果
cv2.imshow('Laplacian Edges', monkey_lap_full)
cv2.waitKey(0)
除了上述算法外,还有Prewitt算子、Roberts算子、Scharr算子等多种边缘检测算法可供选择。这些算法各有优缺点,在实际应用中需要根据具体需求和图像特点选择合适的算法。