opencv2-第五章-图像处理2

本文主要介绍了OpenCV2中的图像形态学处理,重点讲解了膨胀和腐蚀操作,包括它们的原理、作用及如何在代码中实现。通过膨胀可以扩展图像的高亮区域,而腐蚀则能减小区域并消除细小凸起。同时,文章还提到了开运算、闭运算、形态学梯度、礼帽和黑帽等更高级的形态学操作及其应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

opencv2-第五章-图像处理

(1)图像形态学

opencv为进行图像的形态学变换提供了快速、方便的函数。基本的形态转换是膨胀与腐蚀,它们能实现多种功能:例如消除噪声、分割出独立的图像元素以及在图像中连接相邻的元素。形态学也常被用于寻找图像中的明显的极大值区域或极小值区域以及求出图像的梯度。


(2)膨胀与腐蚀

膨胀是指将一些图像(或图像中的一部分区域,为A)与核(为B)进行卷积。核可以是任何的形状或大小,它拥有一个单独定义出来的参考点。多数情况下,核是一个小的中间带有参考点的实心正方形或圆盘。核可以视为模板或掩码,膨胀是求局部最大值的操作。核B与图像卷积,即计算核B覆盖的区域的像素点最大值,并把这个最大值赋值给参考点指定的像素。这样就会使图像中的高亮区域逐渐增长,这样的增长就是“膨胀操作”的初衷。


腐蚀是膨胀的反操作。腐蚀操作要计算核区域像素的最小值。腐蚀可以通过下面的算法生成一个新的图像:当核B与图像卷积时,计算被B覆盖区域的最小像素值,并把这个值放到参考点上。


一般来说,膨胀扩展了区域A,而腐蚀缩小了区域A。此外,膨胀可以填补凹洞,腐蚀能够消除细的凸起。当然,准确的效果将取决于核,但当使用凸核时前面的说法一般是对的。



//-----------------------------------【main( )函数】--------------------------------------------
// 描述:控制台应用程序的入口函数,我们的程序从这里开始
//-----------------------------------------------------------------------------------------------
int main(   )
{
//载入原图  
Mat image = imread("1.jpg");
//创建窗口  
namedWindow("【原图】膨胀操作");
namedWindow("【效果图】膨胀操作");
//显示原图
imshow("【原图】膨胀操作", image);
//进行膨胀操作 
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
Mat out;
dilate(image, out, element);
//显示效果图 
imshow("【效果图】膨胀操作", out);
waitKey(0); 
return 0;
}


滤波核B:

//! shape of the structuring element
enum { MORPH_RECT=0, MORPH_CROSS=1, MORPH_ELLIPSE=2 };
这个应该是核的元素的个数,有0,1,2这三中情况。


//! returns structuring element of the specified shape and size
CV_EXPORTS_W Mat getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1));

核大小和类型的定义。


膨胀函数:

//! dilates the image (applies the local maximum operator)
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() );


腐蚀函数:

//! erodes the image (applies the local minimum operator)
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() );


膨胀效果:



腐蚀效果:



(4)自定义核

可以创建自定义的核,这样的核由getStructuringElement函数创建。

形态核与卷积核不同,不需要任何的数值填充核。当核在图像上移动时,核的元素只需要简单标明应该在那个范围里计算最大值或最小值。参考点指定核与源图像的位置关系,同时也锁定了计算结果在目标图像中的设置。


(5)更通用的形态学

在处理布尔图像和图像掩码时,基本的腐蚀和膨胀操作通常是足够的。然而,在处理灰度或彩色图像时,往往需要一些额外的操作。更通用的morphologyEx()函数提供了更多有用的操作。


(6)开运算和闭运算

开运算通常可以用来统计二值图像中的区域数。若以将显微镜载玻片上观察到的细胞图像作了阈值处理,可以使用开运算将相邻的细胞分离开来,然后再计算图像中的区域(细胞)数目。在闭运算的情况下,我们首先将其膨胀然后在腐蚀。在大多数好的连通区域分析算法中,都会用到闭运算来去除噪声引起的区域。对于连通区域分析,通常先采用腐蚀或闭运算来消除纯粹由噪声引起的部分,然后用开运算来连接邻近的区域。(注意,虽然使用开运算或闭运算的结果与使用腐蚀和膨胀的结果类似,但这两个新的操作能更精确地保存源图像连接的区域。)


开运算和闭运算操作几乎都是“保留区域”形式的:最显著的效果是,闭运算消除了低于其邻近点的孤立点,而开运算是消除高于其邻近点的孤立点。


(7)形态学梯度

公式:

gradient(src)=dilate(src)-erode(src)

对二值图像进行这一操作可以将团块(blob)的边缘突出出来。

观察对灰度图像的处理结果,可以获知形态学梯度操作能描述图像亮度变化的剧烈程度;这就是为什么把其称为“形态学梯度”的原因。当我们想突出高亮区域的外围时,通常可以使用形态学梯度,这样我们可以把高亮的看成一个整体(或物体的一整部分)。因为从原区域的膨胀中减去了原区域的收缩,所以留下了完整的外围边缘。这与计算梯度有所不同,梯度一般不能获得物体的外围边缘。


(8)礼帽和黑帽

这些操作分别用于分离比邻近的点亮或暗的一些斑块。当试图孤立的部分相当于其邻近的部分有亮度变化时,就可以用这些方法。例如常用于处理有机组织或细胞的显微镜图像。这是两个操作都是基本的操作组合。定义如下:

tophat(src)=src-open(src)

blackhat(src)=close(src)-src

可以看出,礼帽操作从A中减去了A的开运算。开运算带来的结果是放大裂缝或局部低亮度区域,因此,从A中减去open(A)可以突出比A周围的区域更明亮的区域,并跟核的大小相关;相反地,黑帽操作突出比A的周围的区域黑暗的区域。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值