[blog]基本形态学算法

基本形态学算法

为什么要做基本形态学算法的研究和实现?是因为形态学是一个非常有力,应用 广泛的工具,但同时也是研究不是很清楚的工具。往往一个恰到好处的变换,就能够省下许多的劳动。对此的分类和研究就显得非常有必要,而相关代码的积累,也很有价值。

零、基本概念:

膨胀:白->黑;    dilate

腐蚀:黑->白;  erode

开    : 腐蚀->膨胀 平滑物体轮廓,断开较窄的地方,清除细突;

闭   :膨胀->腐蚀 弥合较窄的间断,填补细长的沟壑;

顶帽 :src-(开运算(src))

底帽 :闭运算(src)-src

一、边界提取

先腐蚀,然后相减。

作为生成算法可能价值不是很大,但是在生成镂空字符的时候,价值就会比较大。

变成以及

//-------------------生成验证码--------------//
void creatCode()
{
    Mat edge;
    Mat code = imread("abcd123.bmp",0);
    threshold(code,code,0,255,THRESH_OTSU);
    threshold(code,code,0,255,THRESH_BINARY_INV);
    dilate(code,code,Mat(1,5,CV_8U));
    erode(code,edge,Mat());
    edge = code - edge;
    imshow("验证码生成",code);
}
//-------------------边界提取----------------//
void getEdge(Mat src)
{
    Mat edge ;
    erode(src,edge,Mat());
    edge = src - edge;
    imshow("边界提取",edge);
}

二、孔洞填充(注意,floodfill是没有教程的)

一个孔洞可以被定义为由前景像素相连接的边界所包围的一个背景区域。关键是标注出区域中的点来。

原文的翻译实在无法理解。我这里做出自己收集到的实现。

opencv中提供了floodfill的例子,应该说功能强大

对于本例,问题在于如何自动化这个过程?

我实现了一个效果,主要是通过反过来找中间的黑点,然后相加。这里属于反过来使用floodfill,效果还是不错的.

NICE!体现形态学的强大能力。如果你用轮廓来找的话,会很麻烦,而且不稳定。但是用形态学,确非常稳定,只有在很特殊的情况下,才可能出现失败的青年高考。

三、联通分量提取

从二值图像中提取联通分量是许多自动图形啊分析应用的核心。除了在对应A中每个连通分量中的一个点的已指的每一个位置我们置为1,其他为0

对于8连通,目前采用的算法是find contours。虽然有一些文档中也提出了一些算法,但是根据我目前的知识结构,还是直接contour的方法最好。

四、【关于细化和骨廓,届时看不懂】

五、顶帽变换和底帽变换

顶帽变换的一个作用是去除光照不均匀

用于连铸的效果非常明显,我相信这样可以把代码质量进一步提高

黑帽

去除背景还是要这样来做

从这点可以看出,它的确是效果要更好一点的。

小结:

形态学变换应该说是很强的,因为它更接近于原始的情况,是不同于轮廓分析的基础工具。在我之前的过程中确实缺乏这方面的使用,这方面的书还要多读多用。

P.S.

在OPENCV中,提供了一揽子的解决方法

int main()

{

Mat src = imread("./image/chars_identify.jpg",0);

Mat srcClone = src.clone();

Mat element = getStructuringElement(MORPH_ELLIPSE,Size(7,3));

morphologyEx(src,srcClone,CV_MOP_TOPHAT,element);

imshow("src",src);

imshow("srcClone",srcClone);

waitKey();

}

分为两个部分,首先生成一个element,然后根据参数的不同,进行形态学变换

/* Morphological operations */

enum

{

CV_MOP_ERODE        =0,

CV_MOP_DILATE       =1,

CV_MOP_OPEN         =2,

CV_MOP_CLOSE        =3,

CV_MOP_GRADIENT     =4,

CV_MOP_TOPHAT       =5,

CV_MOP_BLACKHAT     =6

};

来自为知笔记(Wiz)

时间: 2024-10-11 23:07:01

[blog]基本形态学算法的相关文章

OPENCV形态学算法-2

一.漫水填充算法 该算法通过一个指定的种子点,来分析整张图片上的像素,并设置像素差异阈值,在阈值类的点,最后变成相同的颜色.该方法通过上下限和连通方式来达到不同的连通效果. 该方法常用与标记和分离图像的一部分,以便于对其做进一步的分析和处理,填充的结果总是连通的区域. API:void floodFill(源图像,掩码,Point 种子点,scaral 染色值,Rect* 重绘区域的最小边界矩形区域,scaral 与种子点颜色的负差最大值,scaral 与种子点颜色的正差最大值,int 操作方式

算法学习---一个博弈问题

引用自matrix67的博客. 让我们来玩一个游戏.下面有五行石子,白色的石子都是我的,黑色的石子都是你的.我们轮流拿走一个自己的石子,并且规定如果一个石子被拿走了,它后面的所有石子都要被扔掉.谁先没有拿的了,谁就输了. ○●●○●●○●●○●○○●○●●○●○○○○●●●○●●●● ..比如说,如果你先走的话,你可以把第四行的第三个石子拿走,按规定第四行将会只剩下前面两个石子: ○●●○●●○●●○ ●○○●○●●○● ○○○○ ●● ● 现在轮到我走了.我可以拿走第二行倒数第二个石子,于是整

形态学图像处理

一.C语言简介程序语句分类 1. 循环: while(表达式) 语句 \\当while()内的表达式为真时,循环执行{}内的语句,直到while()内的表达式为假.跳出循环. do...while语句\\先执行do{}中的语句然后判断while()中的表达式 for语句,for(表达式1;表达式2;表达式3) \\先执行表达式1,然后执行表达式2,如果表达式2的值为真.那么执行{}内的语句,执行完毕后在执行表达式 用break语句提前终止循环 用continue语句结束本次循环 2.选择判断 i

机器视觉算法提纲

图像增强算法(1,2,3,4,5): 对比度增强——空间滤波——彩色变换——多光谱变换——图像运算 几何变换算法(6): 仿射变换原理——投影变换原理——图像变换原理——极坐标变换原理 图像分割算法(7): 阈值分割与亚像素阈值分割——提取图像连通区域 特征提取算法(8): 区域特征——灰度值特征——轮廓特征 形态学算法(9): 区域形态学——灰度值形态学 边缘提取算法(10): 一维边缘提取——二维边缘提取 几何基元的分割与拟合算法(11): 直线拟合——圆拟合——椭圆拟合 摄像机标定算法(1

笔试算法题(39):Trie树(Trie Tree or Prefix Tree)

出题:TRIE树 (Trie Tree or Prefix Tree): 分析: 又称字典树或者前缀树,一种用于快速检索的多叉树结构:英文字母的Trie树为26叉树,数字的Trie树为10叉树:All the descendants of a node have a common prefix of the sequence associated with that node, and the root is associated with the empty sequence. 由于不同的se

每日算法之三十:Valid Sudoku (九宫格)

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

排序算法之计数排序

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

动态规划算法之:最长公共子序列 & 最长公共子串(LCS)

1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题,可以用动态规划来求解.我们采用一个二维矩阵来记录中间的结果.这个二维矩阵怎么构造呢?直接举个例子吧:"bab"和"caba"(当然我们现在一眼就可以看出来最长公共子串是"ba"或"ab") b a b c 0 0 0 a 0 1

《算法导论》读书笔记之动态规划—最长公共子序列 & 最长公共子串(LCS)

From:http://my.oschina.net/leejun2005/blog/117167 1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题,可以用动态规划来求解.我们采用一个二维矩阵来记录中间的结果.这个二维矩阵怎么构造呢?直接举个例子吧:"bab"和"caba"(当然我们现在一眼就可以看出来最长公共子串是