形态学-梯度运算:
图形学中的梯度概念实际上表示的是像素值变化迅速的地方,而图像中的边界恰恰是像素值变化迅速的地方。因此梯度运算就是求出图像中的边界。
因为对图像进行膨胀操作会使得边界处的白色区域增多,对图像进行腐蚀操作会使得边界处的白色区域减少,因此使用膨胀后的图片减去腐蚀后的图片,就会得到图像的白色边界。
cv::Mat image = cv::imread("/home/cenmmy/CLionProjects/opencv_learning/assets/tly_threshold.jpg", cv::IMREAD_GRAYSCALE);
cv::Mat img1 = {};
cv::Mat img2 = {};
cv::Mat kernel = cv::Mat(3, 3, CV_8UC1);
cv::erode(image, img1, kernel);
cv::dilate(image, img2, kernel);
cv::imshow("tidu", img2 - img1);
cv::waitKey(0);
形态学-礼帽和黑帽:
我们知道对图像的开运算去除了图像中的小的白色的部分,而且开运算是先进行腐蚀操作然后进行膨胀操作,这个过程主要是在边界处进行操作,在这个操作过程中会和原图像中有所不同,所以原图像减去开运算会得到边界。同理,闭操作后的图像减去原图像,会得到边界。
cv::Mat image = cv::imread("/home/cenmmy/CLionProjects/opencv_learning/assets/tly_threshold.jpg", cv::IMREAD_GRAYSCALE);
cv::Mat kernel = cv::Mat(3, 3, CV_8UC1);
cv::Mat img1 = {};
cv::Mat img2 = {};
cv::morphologyEx(image, img1, cv::MORPH_OPEN, kernel);
cv::morphologyEx(image, img2, cv::MORPH_CLOSE, kernel);
cv::imshow("tidu", img2 - image);
cv::imshow("tidu2", image - img1);
cv::waitKey(0)
礼帽
黑帽
图像梯度-Sobel算子:
Sobel 算子提供了两个核矩阵分别计算x方向上的梯度和y方向上的梯度。这两个核矩阵如下图所示:
利用公式一或者公式二计算每个像素上的像素值,下面公式的绝对值和平方会处理求得的负数,例如在求x方向的梯度的时候,白色在左边,这时右边减去左边就会得到负数:
公式一
公式二
imgproc.hpp 头文件提供了Sobel函数通过Sobel算子计算图像梯度。这个函数接收九个参数,前两个参数分别是输入和输出图像,第三个参数图像的深度,也就是一个像素点所需要的位数,第四个和第五个参数表示是否计算x方向上的梯度和y方向上的梯度。第六个参数表示Sobel核的大小,第七个参数代表缩放比例,第八个参数表示增量常量,用于加在目标图像的像素点上,第九个参数表示边界的类型。
cv::Mat image = cv::imread("/home/cenmmy/CLionProjects/opencv_learning/assets/tly_threshold.jpg", cv::IMREAD_GRAYSCALE);
cv::Mat img1 = {};
cv::Mat img2 = {};
cv::Sobel(image, img1, CV_8UC1, 1, 0);
cv::Sobel(image, img2, CV_8UC1, 0, 1);
cv::imshow("sobel_x", img1);
cv::imshow("sobel_y", img2);
cv::waitKey(0);
x方向梯度
y方向梯度
两个方向上的梯度相加
图像梯度-Scharr算子:
Scharr算子:
imgproc.hpp 头文件提供了Scharr函数用于计算Scharr梯度,这个函数的参数和Sobel一样。
cv::Mat image = cv::imread("/home/cenmmy/CLionProjects/opencv_learning/assets/tly_threshold.jpg", cv::IMREAD_GRAYSCALE);
cv::Mat img1 = {};
cv::Mat img2 = {};
cv::Scharr(image, img1, CV_8UC1, 1, 0);
cv::Scharr(image, img2, CV_8UC1, 0, 1);
cv::imshow("scharr_x", img1);
cv::imshow("scharr_y", img2);
cv::imshow("scharr", img1 + img2);
cv::waitKey(0);
Scharr x方向梯度
Scharr y 方向梯度
Scharr x y方向融合
图像梯度-Laplacian算子:
Laplacian算子:
imgproc.hpp头文件提供了Laplacian函数,这个函数接收七个参数,相比前两个函数少了dx, dy这两个参数。
cv::Mat image = cv::imread("/home/cenmmy/CLionProjects/opencv_learning/assets/tly_threshold.jpg", cv::IMREAD_GRAYSCALE);
cv::Mat img1 = {};
cv::Laplacian(image, img1, CV_8UC1, 1);
cv::imshow("laplacian", img1);
cv::waitKey(0);