博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图像处理之形态学梯度计算
阅读量:5974 次
发布时间:2019-06-19

本文共 2849 字,大约阅读时间需要 9 分钟。

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

源代码基于OpenCV实现,原因是太懒了,不想再用Java从头写了!

一:概念介绍

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

基本梯度

基本梯度是用膨胀后的图像减去腐蚀后的图像得到差值图像,称为梯度图像也是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方向

演示代码如下:

#include 
#include
#include
using namespace std;using namespace cv;int main(int argc, char** argv) { Mat src, gray_src, dst; src = imread("D:/vcprojects/images/carlines.png"); if (!src.data) { printf("could not load image...\n"); return -1; } char input_title[] = "input image"; char output_title[] = "Basic Gradient Image"; namedWindow(input_title, CV_WINDOW_AUTOSIZE); namedWindow(output_title, CV_WINDOW_AUTOSIZE); imshow(input_title, src); cvtColor(src, gray_src, CV_BGR2GRAY); // calculate basic gradient same as morphologyEx() in opencv Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1)); Mat erode_ouput, dilate_output; erode(gray_src, erode_ouput, kernel, Point(-1, -1)); dilate(gray_src, dilate_output, kernel, Point(-1, -1)); // calculate basic gradient subtract(dilate_output, erode_ouput, dst, Mat()); imshow(output_title, dst); // calculate internal gradient Mat internalGradientImg; subtract(gray_src, erode_ouput, internalGradientImg, Mat()); imshow("Internal Gradient", internalGradientImg); // calculate external gradient Mat externalGradientImg; subtract(dilate_output, gray_src, externalGradientImg, Mat()); imshow("External Gradient", externalGradientImg); // directional gradient Mat hse = getStructuringElement(MORPH_RECT, Size(src.cols/16, 1), Point(-1, -1)); Mat vse = getStructuringElement(MORPH_RECT, Size(1, src.rows/16), Point(-1, -1)); Mat erode_direct, dilate_direct; Mat binImg, xdirectImg, ydirectImg; // 二值化方法 threshold(gray_src, binImg, 0, 255, CV_THRESH_OTSU | CV_THRESH_BINARY); // X direction erode(binImg, erode_direct, hse, Point(-1, -1)); dilate(binImg, dilate_direct, hse, Point(-1, -1)); subtract(dilate_direct, erode_direct, xdirectImg, Mat()); imshow("X directional gradient", xdirectImg); // Y direction erode(binImg, erode_direct, vse, Point(-1, -1)); dilate(binImg, dilate_direct, vse, Point(-1, -1)); subtract(dilate_direct, erode_direct, ydirectImg, Mat()); imshow("Y directional gradient", ydirectImg); waitKey(0); return 0;}
欢迎加入图像处理学习群,里面高手林立!
你可能感兴趣的文章
实验三
查看>>
openssh for windows
查看>>
PostgreSQL cheatSheet
查看>>
ASP.NET Core 2 学习笔记(三)中间件
查看>>
转:Mosquitto用户认证配置
查看>>
SpringBoot上传文件到本服务器 目录与jar包同级
查看>>
python开发_difflib字符串比较
查看>>
被解放的姜戈01 初试天涯
查看>>
三极管工作区在Spectre中的表示
查看>>
HT for Web的HTML5树组件延迟加载技术实现
查看>>
ASP.NET MVC 3 Razor Nested foreach with if statements
查看>>
【Mysql】命令行
查看>>
Asterisk 安装与配置
查看>>
利用日志记录所有LINQ的增,删,改解决方案
查看>>
实例讲解PostSharp(一)
查看>>
graylog 客户端的安装配置
查看>>
CentOS6.4_X86_64 安装Drupal-7.31必须成功版!
查看>>
驱动学习之驱动和应用的接口
查看>>
hbase region split源码分析
查看>>
MySQL备份之分库分表备份脚本
查看>>