1、BasicLinearTransforms.cpp 基本线性变换
基本线性变换可以使用 image.convertTo(new_image, -1, alpha, beta) 实现。该程序使用 new_image.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta ) 实现。
注意点:
(1)saturate_cast<uchar> 模板类
(2)坐标x与y对调
(3)通道读取方法
2、Morphology_1.cpp 形态学变换_1 (腐蚀膨胀)
(1)滑动条函数:int createTrackbar(const String& trackbarname, const String& winname,
int* value, int count,
TrackbarCallback onChange = 0,
void* userdata = 0)
参数:滑动条名称,图像框名称,滑动条值,滑动条终点值,回调函数
(2)滑动条命名时可以定义位置类型
(3)腐蚀和膨胀的单词区分:Erosion 腐蚀 ,Dilation 膨胀
(4)腐蚀类型:MORPH_RECT,MORPH_CROSS,MORPH_ELLIPSE
(5)过程:
Mat element = getStructuringElement( dilation_type,
Size( 2*dilation_size + 1, 2*dilation_size+1 ), //核大小
Point( dilation_size, dilation_size ) ); //起点,默认Point(-1,-1)为中心点
dilate( src, dilation_dst, element );
3、Morphology_2.cpp 形态学变换_2 (开闭梯度顶帽黑帽)
(1)开:先腐蚀再膨胀,能够排除小团块物体
(2)闭:先膨胀再腐蚀,能够排除小黑洞
(3)梯度:膨胀图和腐蚀图之差,能够保留物体的边缘轮廓
(4)顶帽:原图与开运算结果图之差
(5)黑帽:闭运算结果图与原图之差
(6)过程:
Mat element = getStructuringElement( morph_elem, Size( 2*morph_size + 1, 2*morph_size+1 ), Point( morph_size, morph_size ) );
morphologyEx( src, dst, operation, element );
4、Morphology_3.cpp 形态学变换_3 (水平、垂直提取)
(1)二值化:void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C)
int adaptiveMethod:在一个邻域内计算阈值所采用的算法,有两个取值,分别为 ADAPTIVE_THRESH_MEAN_C 和 ADAPTIVE_THRESH_GAUSSIAN_C 。
ADAPTIVE_THRESH_MEAN_C的计算方法是计算出领域的平均值再减去第七个参数double C的值
ADAPTIVE_THRESH_GAUSSIAN_C的计算方法是计算出领域的高斯均值再减去第七个参数double C的值
int thresholdType:这是阈值类型,只有两个取值,分别为 THRESH_BINARY 和THRESH_BINARY_INV 具体的请看官方的说明,这里不多做解释
int blockSize:adaptiveThreshold的计算单位是像素的邻域块,邻域块取多大,就由这个值作决定
double C:在对参数int adaptiveMethod的说明中,我已经说了这个参数的作用,从中可以看出,这个参数实际上是一个偏移值调整量
(2)过程:
int horizontalsize = horizontal.cols / 30;Mat horizontalStructure = getStructuringElement(MORPH_RECT, Size(horizontalsize,1));
erode(horizontal, horizontal, horizontalStructure, Point(-1, -1));
dilate(horizontal, horizontal, horizontalStructure, Point(-1, -1));
(3)bitwise_not()图像反转
(4)去边:原图模糊(白底黑图)后与边缘(黑底白边)叠加。
5、Pyramids.cpp 高斯金字塔
图像放大、缩小
6、Smoothing.cpp
参考博客:http://blog.csdn.net/tealex/article/details/51553787
归一化滤波:blur( src, dst, Size( i, i ), Point(-1,-1) ) 线性
高斯滤波:GaussianBlur( src, dst, Size( i, i ), 0, 0 ) 线性,去白噪声
中值滤波:medianBlur ( src, dst, i ) 非线性,去椒盐噪声
双边滤波: bilateralFilter ( src, dst, i, i*2, i/2 ) 非线性,效果好,可以实现保边去噪
滤波器小结
一、低通滤波器(模糊和平滑)
1、均值(线性)
2、高斯(线性) 去白噪声
3、中值(非线性) 去椒盐噪声
二、高通滤波器(可边缘检测)
1、sobel算子(方向)
2、拉普拉斯变换(二阶导数)
三、邻域滤波
1、方框
2、高斯
3、中值
4、双边(非线性) 保边去噪
7、Threshold.cpp 二值化
threshold( src_gray, dst, threshold_value, max_BINARY_value,threshold_type );
Binary:即二值化,将大于阈值的灰度值设为最大灰度值,小于阈值的值设为0。
Binary Inverted:将大于阈值的灰度值设为0,大于阈值的值设为最大灰度值。
Threshold Truncated:将大于阈值的灰度值设为阈值,小于阈值的值保持不变。
Threshold to Zero:将小于阈值的灰度值设为0,大于阈值的值保持不变。
Threshold to Zero Inverted:将大于阈值的灰度值设为0,小于阈值的值保持不变。
8、Threshold_inRange.cpp 实现单通道图像阈值分割
void inRange(InputArray src,InputArray lowerb, InputArray upperb, OutputArray dst)
lowerb为三通道下限:Scalar(low_b,low_g,low_r)
upperb为三通道上限:Scalar(high_b,high_g,high_r)