摘要:
灰度图像均值平滑 图像平滑用于去除图像中的噪声。均值平滑,就是将每个像素的灰度值用其领域的平均值代替。该算法简单,速度快,但不能完全消除椒盐噪声。 平滑模板:111111111// 均值平滑// 1. pImageData 图像数据// 2. nWidth 图像宽度// 3. nHeight 图像高度// 4. nWidthStep 图像行大小bool SmoothBlur(unsigned char *pImageData, int nWidth, int nHeight, int nWidthStep){ int i = 0; in... 阅读全文
摘要:
灰度图像高斯平滑 图像平滑用于去除图像中的噪声。高斯平滑,就是将每个像素的灰度值用其领域的加权平均值代替。该算法简单,能够有效去除高斯噪声。 平滑模板:121242121// 高斯平滑// 1. pImageData 图像数据// 2. nWidth 图像宽度// 3. nHeight 图像高度// 4. nWidthStep 图像行大小bool SmoothGauss(unsigned char *pImageData, int nWidth, int nHeight, int nWidthStep){ int i = 0; int ... 阅读全文
摘要:
灰度图像中值滤波 中值滤波是一种非线性型号处理方法,将每个像素的灰度值用其领域的中值代替。中值是指领域内奇数个数据按大小排序后处于中心位置的那个数。中值滤波能够在去除椒盐噪声的同时保持边缘清晰。 中值滤波是一个比较耗时的算法,为了提高速度,在程序设计时,并不需要对领域内所有点排序,只需要找到中值即可,因此这里只对前5个点进行了排序。// 中值滤波// 1. pImageData 图像数据// 2. nWidth 图像宽度// 3. nHeight 图像高度// 4. nWidthStep 图像行大小bool SmoothMedian(unsigne... 阅读全文
摘要:
边缘检测-Laplace 算子 Laplace 算子可以卷积模板表示:0101-41010// Laplace 算子// 1. pImageData 图像数据// 2. nWidth 图像宽度// 3. nHeight 图像高度// 4. nWidthStep 图像行大小bool Laplace(unsigned char *pImageData, int nWidth, int nHeight, int nWidthStep){ int i = 0; int j = 0; int nValue = 0; unsigned c... 阅读全文
摘要:
边缘检测-Prewitt 算子 Prewitt 算子采用以下算子分别计算一阶 x 方向和 y 方向的图像差分: -101-101-101-1-1-1000111#include <math.h>// Prewitt 算子// 1. pImageData 图像数据// 2. nWidth 图像宽度// 3. nHeight 图像高度// 4. nWidthStep 图像行大小bool Prewitt(unsigned char *pImageData, int nWidth, int nHeight, int nWidthStep){ int i... 阅读全文
摘要:
灰度图像二值化-大津法 大津法又称最大类间方差法。对图像,记t为前景与背景的分割阈值,前景点数占图像比例为w0, 平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1。图像的总平均灰度为:u=w0*u0+w1*u1。从最小灰度值到最大灰度值遍历t,当t使得值g=w0*(u0-u)2+w1*(u1-u)2 最大时t即为分割的最佳阈值。阈值t分割出的前景和背景两部分构成了整幅图像,而前景取值u0,概率为w0,背景取值u1,概率为w1,总均值为u,根据方差的定义即得该式。因方差是灰度分布均匀性的一种度量,方差值越大,说明构成图像的两部分差别越大,当部分目标错分为背景或部分背景错分为... 阅读全文
摘要:
二值图像轮廓提取 二值图像轮廓提取只需要挖空内部像素点即可。亮点的8个相邻像素点全部为亮点,则该点为内部点,反之为轮廓点。将所有内部点置为背景点,完成轮廓提取。// 轮廓提取// 1. pImageData 图像数据// 2. nWidth 图像宽度// 3. nHeight 图像高度// 4. nWidthStep 图像行大小bool FindContours(unsigned char *pImageData, int nWidth, int nHeight, int nWidthStep){ int i = 0; int j = 0... 阅读全文
摘要:
二值图像轮廓跟踪 二值图像轮廓跟踪用于提取二值图像中的目标区域,以便对目标区域做进一步处理,如:区域填充,计算轮廓长度、面积、重心,特征提取和图像识别等。我们可以采用链码和线段表两种不同的方法来描述轮廓。链码方式描述轮廓需要记录轮廓的起点和轮廓上每一点相对于前一点的链码值列表。以8-领域链码为例,首先按照从左至右,从上至下的顺序查找轮廓起点;再按照右、右下、下、左下的顺序查找第二个轮廓点;然后按照右、右下、下、左下、左、左上、上、上右的顺序查找其它轮廓点,直到找到轮廓起点为止。 由于事先无法确定轮廓点数量,无法事先分配合适的内存空间,因此可以使用vector来动态管理内存,从而... 阅读全文
摘要:
链码表转换为线段表 链码表和线段表都可以描述轮廓,通过轮廓跟踪得到链码表,链码表可以很容易计算出轮廓长度,但轮廓填充,计算面积、重心等使用线段表会更加容易。为了后续处理的方便,往往需要将链码表转换为线段表。线段表只需要记录每条线段的两个端点坐标,中间点全部舍弃。链码表上的点如果位于线段的中间则舍弃,如果位于线段的某一个端点则保留,如果位于线段的两个端点(即线段长度为1)则需要插入一个端点,最后按照垂直方向和水平方向排序。 在程序中判断链码表上的点在线段上的位置关系比较麻烦,且位置关系只有64种,因此采用查表法简单高效,不失为极佳方案。同样,事先无法确定线段数量,可以使用vector来动态管理. 阅读全文
摘要:
计算轮廓矩形边界与重心 轮廓矩形边界即轮廓的左边界、上边界、右边界和下边界。采用线段表可以方便求得,直接求线段端点在水平方向和垂直方向的最小值和最大值即可。需要注意一个概念上的区别,轮廓矩形边界不等于轮廓的最小外接四边形。 轮廓重心同样采用线段表进行计算,分别计算各线段在水平方向和垂直方向上的加权平均,其权重为线段长度。#include <vector>typedef std::vector<POINT> ptLineTable;// 轮廓矩形边界// 1. LineTable 线段表bool ContourRect(ptLineTable LineTable, REC 阅读全文
摘要:
计算轮廓长度与面积 采用链码表计算轮廓的长度,链码值为奇数时,长度为sqrt(2),否则,长度为1。统计奇数链码值数量,非奇数链码值数目为链码长度减去奇数链码值数量。 采用线段表计算轮廓的面积,只需要将所有线段长度求和即可。#include <math.h>#include <vector>typedef std::vector<int> ivChainCode;typedef std::vector<POINT> ptLineTable;// 轮廓长度// 1. ChainCode 链码表double ContourLength(ivChain 阅读全文
摘要:
图像轮廓缺陷修补 通过简单的二值化和边缘提取可以得到封闭的图像轮廓。但大多数边缘提取算子得到的轮廓都可能存在缺陷,即轮廓不封闭。如:Cannyl算子,通过调节两个阈值可以有效提取目标轮廓,但并不保证轮廓的封闭性,因此往往需要对轮廓进行进一步处理。可以使用闭运算等形态学操作来对轮廓进行处理,但作为像素点级别的形态学操作往往不能满足要求,如:两条轮廓线相距仅为一个像素,在进行闭运算操作时会使这两条轮廓粘连在一起。 图像轮廓修补仅需要对轮廓端点进行处理,而不是轮廓上的每一个点。对轮廓端点的定义为:对于轮廓上的任意一点,如果满足其8领域按顺时针或逆时针方向像素值变化次数为0次或者2次,... 阅读全文
摘要:
图像轮廓凹陷修补 轮廓凸外形,可以认为是一种不带限制条件的简单凹陷修补。考虑更为普遍的情况,目标对象总体上呈凸外形,而局部存在轻微凹陷。对于这类目标对象,如果存在非常严重的凹陷,通常是由于某种干扰因素造成的部分轮廓未被检测出来所致。对于此类情况的轮廓修复,其实就是一种带条件的凹陷修补。 轮廓的凹陷程度可以用凹陷深度与凹陷跨度之比来描述。当凹陷程度不小于某个给定阈值时,对轮廓进行凹陷修补。#include "cxcore.h"#include "cv.h"#pragma comment(lib, "cxcore.lib")#pragma 阅读全文
摘要:
图像内轮廓填充 图像内轮廓填充通常称为孔洞填充,主要用于目标提取。不带任何条件的内轮廓填充,在目标密度很大时,可能导致错误填充。一种典型情况,当多个目标粘连,并且形成环状时,简单的内轮廓填充会将环状内部背景部分误认为目标空洞进行错误填充。这种错误对于目标分割和提取是非常致命的。 如果将内轮廓面积作为限制条件进行填充,就可以很好解决上述问题。通常内轮廓面积应该不大于目标的最大面积。#include "cxcore.h"#include "cv.h"#pragma comment(lib, "cxcore.lib")#pragma com 阅读全文
摘要:
获取目标对象中心 目标对象中心不等同于连通区域中心,一个连通区域内可能包括多个粘连目标对象。获取目标对象中心要比获取连通区域中心更为复杂,因为需要解决粘连部分的分割问题。 对二值图进行距离变换后,目标对象中心处的像素值具备局部最大特性。换而言之,在距离图像中的局部最大值中包含了全部的中心点。对局部最大值点的定义为:对于任何一个非零点,如果其像素值不小于其8领域的像素值,则该点为局部最大值点。 在局部最大值点中包含中心点和非中心点,如果能够确定中心点和非中心点的判别依据,那么就可以从中找出全部的中心点。在同一连通域中,任意两个局部最大值点之间距离小于某个阈值时,其中像素值较小的一个局部最大... 阅读全文
摘要:
计算灰度共生矩阵 共生矩阵用两个位置的象素的联合概率密度来定义,它不仅反映亮度的分布特性,也反映具有同样亮度或接近亮度的象素之间的位置分布特性,是有关图象亮度变化的二阶统计特征。它是定义一组纹理特征的基础。 灰度共生矩阵能反映出图象灰度关于方向、相邻间隔、变化幅度的综合信息。设f(x,y)为一幅二维数字图象,其大小为M×N,灰度级别为Ng,则满足一定空间关系的灰度共生矩阵为: P(i,j)=#{(x1,y1),(x2,y2)∈M×N|f(x1,y1)=i,f(x2,y2)=j} 其中#(x)表示集合x中的元素个数,显然P为Ng×Ng的矩阵,若(x1,y1)与(x2 阅读全文