图像处理之形态学梯度计算

本文介绍了使用OpenCV进行图像形态学操作中的梯度计算方法,包括基本梯度、内部梯度、外部梯度和方向梯度,并提供了详细的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:概念介绍

形态学操作膨胀与腐蚀图像形态学中最基本的两个形态学操作、常常被组合起来一起使用实现一些复杂的图像形态学操作,计算图像的形态学梯度是形态学重要操作之一是有膨胀和腐蚀基础操作适当的组合形成。可以计算的梯度常见如下四种:

基本梯度

基本梯度是用膨胀后的图像减去腐蚀后的图像得到差值图像,称为梯度图像也是OpenCV中支持的计算形态学梯度的方法,而此方法得到梯度有被称为基本梯度。

内部梯度

是用原图像减去腐蚀之后的图像得到差值图像,称为图像的内部梯度

外部梯度

图像膨胀之后再减去原来的图像得到的差值图像,称为图像的外部梯度。

方向梯度

方向梯度是使用X方向与Y方向的直线作为结构元素之后得到图像梯度,X的结构元素分布膨胀与腐蚀得到图像之后求差值得到称为X方向梯度,用Y方向直线做结构分别膨胀与腐蚀之后得到图像求差值之后称为Y方向梯度。

二:主要API介绍

OpenCV中腐蚀与膨胀操作的API分别为:

erode() // 腐蚀 第一个参数是输入图像、第二个参数是输出图像、第三个参数结构元素、第四个表示锚点位置,默认情况下Point(-1, -1),膨胀跟腐蚀的输入参数一样。

dilate() // 膨胀

使用的结构元素通过如下的API创建:

getStructuringElement()创建结构元素,第一个参数是结构元素形状、第二个参数大小一定要是奇数。

第三个参数表示中心位置,默认Point(-1, -1)

两张图像相减的API如下:

subtract()第一个与第二个参数为输入图像Src1和Src2第三个参数是得到的计算后图像dst

计算公式是Dst = saturate(Src1 - Src2)

 三:运行效果


XY方向


演示代码如下:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <opencv2/opencv.hpp>  
  2. #include <iostream>  
  3. #include <math.h>  
  4.   
  5. using namespace std;  
  6. using namespace cv;  
  7.   
  8. int main(int argc, char** argv) {  
  9.     Mat src, gray_src, dst;  
  10.     src = imread("D:/vcprojects/images/carlines.png");  
  11.     if (!src.data) {  
  12.         printf("could not load image...\n");  
  13.         return -1;  
  14.     }  
  15.     char input_title[] = "input image";  
  16.     char output_title[] = "Basic Gradient Image";  
  17.     namedWindow(input_title, CV_WINDOW_AUTOSIZE);  
  18.     namedWindow(output_title, CV_WINDOW_AUTOSIZE);  
  19.     imshow(input_title, src);  
  20.   
  21.     cvtColor(src, gray_src, CV_BGR2GRAY);  
  22.   
  23.     // calculate basic gradient same as morphologyEx() in opencv  
  24.     Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));  
  25.     Mat erode_ouput, dilate_output;  
  26.     erode(gray_src, erode_ouput, kernel, Point(-1, -1));  
  27.     dilate(gray_src, dilate_output, kernel, Point(-1, -1));  
  28.   
  29.     // calculate basic gradient  
  30.     subtract(dilate_output, erode_ouput, dst, Mat());  
  31.     imshow(output_title, dst);  
  32.   
  33.     // calculate internal gradient  
  34.     Mat internalGradientImg;  
  35.     subtract(gray_src, erode_ouput, internalGradientImg, Mat());  
  36.     imshow("Internal Gradient", internalGradientImg);  
  37.   
  38.     // calculate external gradient  
  39.     Mat externalGradientImg;  
  40.     subtract(dilate_output, gray_src, externalGradientImg, Mat());  
  41.     imshow("External Gradient", externalGradientImg);  
  42.       
  43.     // directional gradient  
  44.     Mat hse = getStructuringElement(MORPH_RECT, Size(src.cols/16, 1), Point(-1, -1));  
  45.     Mat vse = getStructuringElement(MORPH_RECT, Size(1, src.rows/16), Point(-1, -1));  
  46.     Mat erode_direct, dilate_direct;  
  47.     Mat binImg, xdirectImg, ydirectImg;  
  48.   
  49.     // 二值化方法  
  50.     threshold(gray_src, binImg, 0, 255, CV_THRESH_OTSU | CV_THRESH_BINARY);  
  51.   
  52.     // X direction  
  53.     erode(binImg, erode_direct, hse, Point(-1, -1));  
  54.     dilate(binImg, dilate_direct, hse, Point(-1, -1));  
  55.     subtract(dilate_direct, erode_direct, xdirectImg, Mat());  
  56.     imshow("X directional gradient", xdirectImg);  
  57.   
  58.     // Y direction  
  59.     erode(binImg, erode_direct, vse, Point(-1, -1));  
  60.     dilate(binImg, dilate_direct, vse, Point(-1, -1));  
  61.     subtract(dilate_direct, erode_direct, ydirectImg, Mat());  
  62.     imshow("Y directional gradient", ydirectImg);  
  63.   
  64.     waitKey(0);  
  65.     return 0;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值