OpenCV学习笔记8 OpenCV图像处理模块ImgProc Module. Image Processing(一)

3.1 图像平滑 - Smoothing Images


在OpenCV中可使用多种线性滤波器函数进行图像平滑:

blur均值滤波
GaussianBlur高斯滤波
medianBlur中值滤波
bilateralFilter双边滤波
注:双边滤波是非线性滤波器,去噪的同时防止高斯滤波导致的边缘模糊。在权重中考虑了相邻像素的差。
几种滤波函数典型使用方法如下:
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 );	// 双边滤波
函数参数中Size(i, i) 表示核的大小,即为i行i列的矩阵窗口。一般核的大小都是正奇数。
Point(-1, -1)表示锚点位置,即被计算的像素在核中的位置,即为默认的核的中心像素。
具体描述可查看 referman.pdf。


3.2 腐蚀与膨胀 - Eroding and Dilating

两种基本的形态学操作,腐蚀与膨胀。运用于:
1. 消除噪声
2. 分割图像中独立的元素,连接图像中邻接的元素
3. 寻找图像中明显的凸起或空洞(即一块像素值为极大值或极小值的区域)。
膨胀:核扫过原图像,原图像与核作卷积,取原图像上核覆盖区域的最大像素值像素替代锚点位置对应的原图像的像素。该操作会扩大图像中亮的部分(白色像素值最大)。
腐蚀:同膨胀,但取的是最小像素值像素替代锚点位置对应的原图像的像素。该操作会缩小图像中亮的部分(黑色像素值最小)。
<span style="font-size:14px;">/**  @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 );
}</span>
element参数是腐蚀操作的核,默认为一个 3×3 矩阵。指明核的形状 element 需要使用函数getStructuringElement 。
核有三种形状可选(erosion_type):矩形- MORPH_RECT,十字形- MORPH_CROSS,椭圆形 - MORPH_ELLIPSE。
还可指定核的大小(Size),锚点位置(Point)。然后将element作为实参传递给 erode 函数。

<span style="font-size:14px;font-weight: normal;">/** @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 ) );
  /// 膨胀操作
  dilate( src, dilation_dst, element );
  imshow( "Dilation Demo", dilation_dst );
}</span>
膨胀的操作方式同上类似。

3.3 更多形态学变换

利用腐蚀和膨胀两个基本的形态学操作可以实现更高级的形态学变换。有如下5种:

1. 开运算(Opening): 对图像先腐蚀再膨胀,能排除图像中的亮斑。
2. 闭运算(Closing):对图像先膨胀再腐蚀,能排除图像中的暗斑。
3. 形态梯度(Morphological Gradient):膨胀图减去腐蚀图,能保留物体的边缘轮廓。
4. 顶帽(Top Hat):原图像减去开运算图像。
5. 黑帽(Black Hat):原图像减去闭运算图像。
上述5种高级形态学操作只需要OpenCV提供的函数 morphologyEx 即可全部实现。代码如下:
 /**
  * @函数 Morphology_Operations
  */
void Morphology_Operations( int, void* )
{
  // 由于 MORPH_X的取值范围是: 2,3,4,5 和 6
  int operation = morph_operator + 2;

  Mat element = getStructuringElement( morph_elem, Size( 2*morph_size + 1, 2*morph_size+1 ), Point( morph_size, morph_size ) );

  /// 运行指定形态学操作
  morphologyEx( src, dst, operation, element );
  imshow( window_name, dst );
 }
同前一节,先指明核element的形状,然后调用morphologyEx 函数,形参  operation 有5个选项:
  • Opening: MORPH_OPEN : 2
  • Closing: MORPH_CLOSE: 3
  • Gradient: MORPH_GRADIENT: 4
  • Top Hat: MORPH_TOPHAT: 5
  • Black Hat: MORPH_BLACKHAT: 6
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值