十五 open CV 教程 形态学二值化和腐蚀操作

        一、形态学概述


        指一系列处理图像形状特征的图像处理技术。形态学的基本思想是利用一种特殊的结构元(本质上就是卷积核)来测量或提取输入图像中相应的形状或特征,以便进一步进行图像分析和目标识别。
       ”方法基本是对二进制图像进行处理,即黑白图像
        卷积核决定着图像处理后的效果
        形态学常用基本操作有:
        1、膨胀和腐蚀
        2、 开运算
        3、闭运算
        4、顶帽
        5、 黑帽

         二、 图像全局二值化

threshold英 [ˈθreʃhəʊld]   门槛;门口;出入口;起点;开端;开始;阈限
        二值化:将图像的每个像素变成两种值,比如0,255.
  threshold(src, dst,thresh, maxval, type[, dst])

        thresh大黑的多,小白的多

threshold 函数
retval, dst = cv2.threshold( src, thresh, maxval, type )
其中
thresh 表示要设定的阈值
maxval 表示当type 参数为 THRESH_BINARY 或者 THRESH_BINARY_INV 时,需要设定的最大值
type 表示阈值分割的类型(常见的有如下5种)
  cv2.THRESH_BINARY                高于阈值为255,低于阈值值为0
  cv2.THRESH_BINARY_INV        高于阈值为0,低于阈值值为255
  cv2.THRESH_TRUNC                截断,高于thresh,其值变为阈值
  cv2.THRESH_TOZERO              变0,低于阈值的,其值变为0
  cv2.THRESH_TOZERO_INV      超阈值变为0  

        三、自适应阈值二值化


        全局阈值,整幅图像采用同一个数作为阈值。当时这种方法并不适应与所有情况,尤其是当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的每一个小区域计算与其对应的阈值。因此在同一幅图像上的不同区域采用的是不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果。
        adaptiveThreshold(src,dst, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)
这种方法需要我们指定六个参数,
        Adaptive Method-指定计算阈值的方法。
        ADPTIVE THRESH_MEAN_C:阈值取自相邻区域的平均值
        ADPTIVE_THRESH_GAUSSIAN_C:阈值取值相邻区域的加权和,权重为一个高斯窗口。
        Block Size-邻域大小(用来计算阈值的区域大小)。
        C-这就是是一个常数,阈值就等于的平均值或者加权平均值减去这个常数。

       四、OTSU大津阈值处理
OTSU方法可以根据当前图像找到最佳的类间分割阈值。OTSU方法会遍历所有可能的阈值,从而找到最佳的阈值,该方法本质是使得类间方差最大。

注意:在使用 Otsu 方法时,要把阈值设为 0。 此时的函数 cv2.threshold()会自动寻找最优阈值,并将返回该阈值。
t,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
与普通阈值分割的不同之处在于:

参数 type 增加了一个参数值“cv2.THRESH_OTSU”设定的阈值为 0返回值 t 是 Otsu 方法计算得到并使用的最优阈值

        五、腐蚀操作

        腐蚀操作也是用卷积核扫描图像,只不过腐蚀操作的卷积和一般都是1,如果卷积核内所有像素点都是白色,那么锚点即为白色.        

函数支持就地模式,腐蚀操作可以迭加使用多次,在多通道图像的情况下,每个通道独立处理。

函数原型
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() );

参数描述
参数 src 输入图像;通道的数量可以是任意的,但是深度值应该是以下之一:
CV_8U, CV_16U, CV_16S, CV_32F or CV_64F.

参数 dst 和源图像同样大小和类型的输出图像。

参数 kernel 用于腐蚀的结构元素;如果element=Mat(),是一个3 x 3的矩形结构元素. Kernel 可以通过使用getStructuringElement来创建。

参数 anchor 素中的锚点的位置,默认是值(-1,-1),也就是说锚点在元素的中心位置。

参数 iterations 腐蚀的迭代次数。

参数 borderType像素外推方法。参见#BorderTypes, BORDER_WRAP不支持。

参数 borderValue 固定边缘的情况下的边缘值。

参考 dilate, morphologyEx, getStructuringElement

        五、 获取形态学卷积核


        opencv提供了获取卷积核的api.不需要我们手工创建卷积核.
        getStructuringElement(shape, ksize[, anchor])
        shape是指卷积核的形状,注意不是指长宽,是指卷积核中1形成的形状.
        MORPH RECT卷积核中的1是矩形,常用.
        MOBPH_ELLIPSE 椭圆
        MORPH GROSS十字

void myCV::thresholdtest()
{
	//转为灰度图像
	Mat dst, src = imread("05.jpg", IMREAD_GRAYSCALE);
	//全局二值化
	//threshold(src, dst, 127, 255, THRESH_BINARY);
	
	//自适应阈值二值化
	//adaptiveThreshold(src, dst, 125, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 3, 0);
	
	//腐蚀操作,将有黑点的区域全变黑。
	/*Mat kernel = Mat::ones(Size(4, 4), CV_8UC1);
	erode(src, dst, kernel,Point(-1,-1),3);*/

	//获取形态学卷积核,腐蚀操作。
	Mat kernel = getStructuringElement(MORPH_RECT, Size(8, 8));
	erode(src, dst, kernel,Point(-1,-1),1);
	imshow("dst", dst);
}

  • 29
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值