【 imgproc 模块. 图像处理】腐蚀与膨胀(Eroding and Dilating)
发布日期:2021-08-11 02:51:17 浏览次数:1 分类:技术文章

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

一、形态学操作

  • 简单来讲,形态学操作就是基于形状的一系列图像处理操作。通过将结构元素 作用于输入图像来产生输出图像。

  • 最基本的形态学操作有两种:腐蚀与膨胀(Erosion 与 Dilation)。 主要应用有:

    • 消除噪声
    • 分割(isolate)独立的图像元素,以及连接(join)相邻的元素。
    • 寻找图像中的明显的极大值区域或极小值区域。
  • 教程中主要通过以下图像讨论膨胀与腐蚀操作(注:图像中的字母为黑色,背景为白色,而不是一般意义的背景为黑色,前景为白色):

    Original image

二、膨胀

 

  • 此操作将图像 A 与任意形状的内核 (B),通常为正方形或圆形,进行卷积。

  • 内核 B 有一个可定义的 锚点, 通常定义为内核中心点。

  • 进行膨胀操作时,将内核 B 划过图像,将内核 B 覆盖区域的最大相素值提取,并代替锚点位置的相素。显然,这一最大化操作将会导致图像中的亮区开始”扩展” (因此有了术语膨胀 dilation )。对上图采用膨胀操作我们得到:

    Dilation result - Theory example

 

背景(白色)膨胀,而黑色字母缩小了。如果对图像取反,再膨胀,字母就会变大(膨胀)。

    API:

@param src input image; the number of channels can be arbitrary, but the depth should be one ofCV_8U, CV_16U, CV_16S, CV_32F or CV_64F.@param dst output image of the same size and type as src.@param kernel structuring element used for dilation; if elemenat=Mat(), a 3 x 3 rectangularstructuring element is used. Kernel can be created using #getStructuringElement@param anchor position of the anchor within the element; default value (-1, -1) means that theanchor is at the element center.@param iterations number of times dilation is applied.@param borderType pixel extrapolation method, see #BorderTypes@param borderValue border value in case of a constant border@sa  erode, morphologyEx, getStructuringElement */CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, InputArray kernel,
  Point anchor = Point(-1,-1), int iterations = 1,
  int borderType = BORDER_CONSTANT,
  const Scalar& borderValue = morphologyDefaultBorderValue() );

三、腐蚀

 

  • 腐蚀在形态学操作家族里是膨胀操作的孪生姐妹。它提取的是内核覆盖下的相素最小值。

  • 进行腐蚀操作时,将内核 B 划过图像,将内核 B 覆盖区域的最小相素值提取,并代替锚点位置的相素。

  • 以与膨胀相同的图像作为样本,我们使用腐蚀操作。从下面的结果图我们看到亮区(背景)变细,而黑色区域(字母)则变大了。

    Erosion result - Theory example

  API:

@param src input image; the number of channels can be arbitrary, but the depth should be one ofCV_8U, CV_16U, CV_16S, CV_32F or CV_64F.@param dst output image of the same size and type as src.@param kernel structuring element used for erosion; if `element=Mat()`, a `3 x 3` rectangularstructuring element is used. Kernel can be created using #getStructuringElement.@param anchor position of the anchor within the element; default value (-1, -1) means that theanchor is at the element center.@param iterations number of times erosion is applied.@param borderType pixel extrapolation method, see #BorderTypes@param borderValue border value in case of a constant border@sa  dilate, morphologyEx, getStructuringElement */CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel,
 Point anchor = Point(-1,-1), int iterations = 1,
 int borderType = BORDER_CONSTANT,
 const Scalar& borderValue = morphologyDefaultBorderValue() );

四、opencv例程

#include"stdafx.h"#include "opencv2/imgproc/imgproc.hpp"#include "opencv2/highgui/highgui.hpp"#include "highgui.h"#include 
     
      #include 
      
       using namespace cv;/// 全局变量Mat src, erosion_dst, dilation_dst;int erosion_elem = 0;int erosion_size = 0;int dilation_elem = 0;int dilation_size = 0;int const max_elem = 2;int const max_kernel_size = 21;/** Function Headers */void Erosion(int, void*);void Dilation(int, void*);/** @function main */int main(int argc, char** argv){
       
/// Load 图像
src = imread("膨胀腐蚀例图.png"); //载入图片
if (!src.data)  //判断图像数据是否存在
{
return -1;
}
/// 创建显示窗口
namedWindow("Erosion Demo", CV_WINDOW_NORMAL);
namedWindow("Dilation Demo", CV_WINDOW_NORMAL);
cvMoveWindow("Dilation Demo", src.cols, 0);//将显示窗口左上角移动到显示屏上指定的位置
/// 创建腐蚀 Trackbar
/*int createTrackbar(const String& trackbarname, const String& winname,
  int* value, int count,
  TrackbarCallback onChange = 0,
  void* userdata = 0);参数1:滑动条的名称。参数2:窗口的名称,就是说这个创建的滑动条所要依附到哪个窗口上。参数3:表示滑块的位置。在创建时,滑块的初始位置的值就是该指针所指向地址(理解为一个变量)当前的值。参数4:表示滑块可以滑到的最大值位置。滑块的最小值始终为0。参数5:TrackbarCallback类型的onChange,它有默认值为0。这是一个指向回调函数的指针,每次滑块位置改变时,这个函数都会进行回调。并且这个函数的原型必须为  void XXXXX(int, void*);参数6:void*类型的userdata,它也有默认值为0。这个参数是用户传给回调函数的数据,用来处理滑动条的调用。如果使用的第3个参数value实参是全局变量的话,完全可以不用去管这个userdata参数。*/
createTrackbar("Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Erosion Demo",
&erosion_elem, max_elem,
Erosion);
createTrackbar("Kernel size:\n 2n +1", "Erosion Demo",
&erosion_size, max_kernel_size,
Erosion);
/// 创建膨胀 Trackbar
createTrackbar("Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Dilation Demo",
&dilation_elem, max_elem,
Dilation);
createTrackbar("Kernel size:\n 2n +1", "Dilation Demo",
&dilation_size, max_kernel_size,
Dilation);
/// Default start
Erosion(0, 0);
Dilation(0, 0);
waitKey(0);
return 0;}/**  @function Erosion  */void Erosion(int, void*){
int erosion_type;
if (erosion_elem == 0) { erosion_type = MORPH_RECT; }
else if (erosion_elem == 1) { erosion_type = MORPH_CROSS; }
else if (erosion_elem == 2) { erosion_type = MORPH_ELLIPSE; }
Mat element = getStructuringElement(erosion_type,
Size(2 * erosion_size + 1, 2 * erosion_size + 1),
Point(erosion_size, erosion_size));
/// 腐蚀操作
erode(src, erosion_dst, element);
imshow("Erosion Demo", erosion_dst);}/** @function Dilation */void Dilation(int, void*){
int dilation_type;
if (dilation_elem == 0) { dilation_type = MORPH_RECT; }
else if (dilation_elem == 1) { dilation_type = MORPH_CROSS; }
else if (dilation_elem == 2) { dilation_type = MORPH_ELLIPSE; }
Mat element = getStructuringElement(dilation_type,
Size(2 * dilation_size + 1, 2 * dilation_size + 1),
Point(dilation_size, dilation_size));
/*这个函数的第一个参数表示内核的形状,有三种形状可以选择。
矩形:MORPH_RECT;
交叉形:MORPH_CORSS;
椭圆形:MORPH_ELLIPSE;
第二和第三个参数分别是内核的尺寸以及锚点的位置。一般在调用erode以及dilate函数之前,先定义一个Mat类型的变量来获得getStructuringElement函数的返回值。对于锚点的位置,有默认值Point(-1,-1),表示锚点位于中心点。element形状唯一依赖锚点位置,其他情况下,锚点只是影响了形态学运算结果的偏移。
*/
///膨胀操作
dilate(src, dilation_dst, element);
imshow("Dilation Demo", dilation_dst);}

 

转载于:https://www.cnblogs.com/Vince-Wu/p/10071431.html

转载地址:https://blog.csdn.net/weixin_30609287/article/details/98617824 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:17-09-29模拟赛
下一篇:Android中MenuInflater实例

发表评论

最新留言

感谢大佬
[***.200.74.241]2022年05月27日 16时30分54秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章

linux cron实例,cron,linux定时实施工具详解及实例 2021-10-23
linux不识别usb,求助:USB无法识别 2021-10-23
ipad上linux终端,将 iPad 看作一个终端。 2021-10-23
linux 查看网卡压力,一种Linux系统下自动化测试网卡压力的方法与流程 2021-10-23
linux 内核 清中断,linux内核--中断和中断处理(一) 2021-10-23
细粒度权限控制 linux,利用docker插件实现细粒度权限控制 2021-10-23
linux 进程init,Linux基础命令---init进程 2021-10-23
linux 主机名修改日志,Linux:修改主机名【Centos7】 2021-10-23
linux sh文件case,Linux下shell中case命令详解(常规的break、无条件继续和有条件继续)... 2021-10-23
php计算qqbkn,QQ 加密算法最新版 _tk,bkn算法 2021-10-23
oracle remapschema,EXPDP/IMPDP中的REMAP_SCHEMA的问题 2021-10-23
php form 提交数组,thinkphp里 表单提交数组的问题 2021-10-23
php 其他页面代码的html,二种php生成html页面实现代码 2021-10-23
php ajax提交报异常,ajax提交 报异常 Request method 'POST' not supported 2021-10-23
tektronix matlab,Overview - Using MATLAB Software with Tektronix Instruments - MATLAB 2021-10-23
php 上级控制下级权限,业务单据上下级权限控制实现 2021-10-23
php updatexml,php操作XML增删查改 2021-10-23
mysql-sqlclient,SQL客户端管理工具(SQuirreL SQL Client)下载_SQL客户端管理工具(SQuirreL SQL Client)官方下载-太平洋下载中心... 2021-10-23
fsk调制解调实验报告 matlab,FSK调制解调MATLAB源代码 2021-10-23
php生成最近七天日期和时间设置,PHP获取本周所有日期或者最近七天所有日期的方法... 2021-10-23