目录
1 概念讲解及用处
Prewitt边缘检测算子是基于微分的边缘检测方法之一。它利用图像中邻近像素之间的灰度变化来检测边缘。具体而言,Prewitt算子使用两个3x3的模板对图像进行卷积操作,分别计算水平和垂直方向上的灰度差异。通过计算两个方向上的灰度差的绝对值之和,可以得到边缘的强度。
Prewitt边缘检测算子可以帮助我们在图像处理任务中准确地提取出物体的边缘信息,为后续的图像分割、目标检测等任务提供支持。
2 函数详解
在OpenCV中,可以使用cv::filter2D函数对图像进行 Prewitt边缘检测。具体函数原型如下:
void cv::filter2D(
InputArray src,
OutputArray dst,
int ddepth,
InputArray kernel,
Point anchor = Point(-1,-1),
double delta = 0,
int borderType = BORDER_DEFAULT
)
参数解释:
src: 输入图像,类型为CV_8U或CV_16U。
dst: 输出图像,与输入图像相同的大小和类型。
ddepth: 输出图像的深度,通常设为-1表示与输入图像相同。
kernel: Roberts算子的卷积核,可以通过创建一个cv::Mat对象来定义。
anchor: 卷积核的锚点位置,默认为(-1, -1)表示位于中心。
delta: 可选的增量值,用于调整输出图像亮度。
borderType: 边界填充方式,默认为BORDER_DEFAULT。
3 Prewitt算子
Prewitt边缘检测算子的数学原理是基于一阶微分的边缘检测。它利用两个模板分别计算水平方向和垂直方向上的灰度差分。
水平方向上的模板:
垂直方向上的模板:
对于输入图像中的每个像素点,分别与两个模板进行卷积操作,计算水平方向和垂直方向上的灰度差分。然后,将两个方向上的灰度差的绝对值之和作为该像素点的边缘强度。
4 用C++编写代码进行实现
下面是使用OpenCV和C++实现Prewitt边缘检测的示例代码:
#include <opencv2/opencv.hpp>
int main()
{
// 读取输入图像
cv::Mat src = cv::imread("input.jpg", cv::IMREAD_GRAYSCALE);
// 创建Prewitt算子的卷积核
cv::Mat kernelX = (cv::Mat_<int>(3, 3) << -1, 0, 1, -1, 0, 1, -1, 0, 1);
cv::Mat kernelY = (cv::Mat_<int>(3, 3) << -1, -1, -1, 0, 0, 0, 1, 1, 1);
// 进行Prewitt边缘检测
cv::Mat dstX, dstY;
cv::filter2D(src, dstX, CV_32F, kernelX);
cv::filter2D(src, dstY, CV_32F, kernelY);
// 计算两个方向上的灰度差的绝对值之和
cv::Mat dst = cv::abs(dstX) + cv::abs(dstY);
// 显示结果图像
cv::imshow("Input", src);
cv::imshow("Prewitt Edge Detection", dst);
cv::waitKey(0);
return 0;
}