毕业设计-机器视觉opencv图像分割

目录

前言

课题背景和意义

实现技术思路

算法理论介绍

阈值处理

OTSU(大津法)

OTSU求阈值过程

自适应阈值处理

实现效果图样例


前言


    📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。

🚀对毕设有任何疑问都可以问学长哦!

大家好,我是海浪学长,本次分享的课题是

🎯机器视觉opencv图像分割

课题背景和意义

图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤,因此在很多情况下,是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。

阈值处理是指剔除图像内像素值高于阈值或者低于阈值得像素点。例如,设定阈值为127,将图像内所有像素值大于127的像素点的值设为255;将图像内所有像素值小于127的像素点的值设为0。

图像阈值化的目的是要按照灰度级,对像素集合进行一个划分,得到的每个子集形成一个与现实景物相对应的区域,各个区域内部具有一致的属性,而相邻区域不具有这种一致属性。这样的划分可以通过从灰度级出发选取一个或多个阈值来实现。

实现技术思路

算法理论介绍

阈值处理

threshold函数

OpenCV使用threshold函数实现阈值化处理。

double cv::threshold ( InputArray src,                      OutputArray dst,                      double thresh,                      double maxval,                      int type )

参数

  • src — 原图像,8或32位浮点类型的Mat。

  • dst —  输出图像,与原始图像具有相同大小和类型。

  • thresh —  要设定的阈值

  • maxval   — 当type为THRESH_BINARY或者THRESH_BINARY_INV时,设定的最大值

  • type — 阈值分割的类型

    • THRESH_BINARY;二值化阈值处理:灰度值大于阈值的点,将其灰度值设定为最大值,灰度值小于或等于阈值的点,将其灰度值设定为0

    • THRESH_BINARY_INV;反二值化阈值处理:灰度值大于阈值的点,将其灰度值设定为0,灰度值小于或等于阈值的点,将其灰度值设定为最大值

    • THRESH_TRUNC;截断阈值化处理:灰度值大于阈值的点,将其灰度值设定为阈值,灰度值小于或等于阈值的点,其灰度值保持不变

    • THRESH_TOZERO;低阈值零处理:灰度值大于阈值的点,其灰度值保持不变,灰度值小于或等于阈值的点,将其灰度值设定为0

    • THRESH_TOZERO_INV;高阈值零处理:灰度值大于阈值的点,将其灰度值设定为0,灰度值小于或等于阈值的点,其灰度值保持不变

如下表:

OTSU(大津法)

使用threshold进行阈值处理时,需要自定义一个阈值,并以此阈值作为图像阈值处理的依据 。通常情况下对于色彩均衡的图像,直接将阈值设为127即可,但有时图像灰度级的分布是不均衡的,如果此时还将阈值设为127,那么阈值处理的结果就是失败的。所以需要找出图像的最佳的分割阈值。OTSU就是获得最佳阈值的方法。

OTSU(大津法)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出。从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景图像的类间方差最大。

它被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用。它是按图像的灰度特性,将图像分成背景和前景两部分。因方差是灰度分布均匀性的一种度量,背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大,当部分前景错分为背景或部分背景错分为前景都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。

OTSU 是求图像全局阈值的最佳方法,适用于大部分需要求图像全局阈值的场合。

缺点:对图像噪声敏感;只能针对单一目标分割;当图像中的目标与背景的面积相差很大时,表现为直方图没有明显的双峰,或者两个峰的大小相差很大,分割效果不佳,或者目标与背景的灰度有较大的重叠时也不能准确的将目标与背景分开。导致这种现象出现的原因是该方法忽略了图像的空间信息,同时该方法将图像的灰度分布作为分割图像的依据,因而对噪声也相当敏感。所以,在实际应用中,总是将其与其他方法结合起来使用。

图像直方图

图像直方图:

OTSU求阈值过程

假设图像的像素个数为M×N。假设存在阈值T将图像所有像素分为两类C1(像素值小于T)和C2(像素值大于T)。假设图片背景较暗,则C1类为背景,C2类为前景。像素被分为C1和C2类的概率分别为p1、p2。图像中属于C1类的像素个数记作N1,其平均灰度;属于C2类的的像素个数记作N2,其平均灰度为。图像的总平均灰度记为,类间方差记为。

因此有如下关系式:

把带入类间方差公式,化简,可以得到:

L为灰度级数,为灰度级为的像素点数

小于或等于灰度级K的累加均值为:

所以,

类间方差公式可以化为:

求得使最大的灰度级K,就是OTSU的阈值。OTSU方法会遍历所有灰度级,找到最佳阈值。

自适应阈值处理

前面介绍了OTSU算法,但这算法还属于全局阈值法,即整张图片只有一个阈值。

显然,这样的阈值处理结果不是我们想要的,所以需要使用变化的阈值对图像进行分割,这种技术称为自适应阈值处理方式。它的思想不是计算全局图像的阈值,而是根据图像不同区域亮度分布,计算其局部阈值,所以对于图像不同区域,能够自适应计算不同的阈值,因此被称为自适应阈值法。

确定局部阈值的方法:计算每个像素点周围临近区域的加权平均值获得阈值,并使用该阈值对该像素点进行处理。

void adaptiveThreshold(InputArray src, OutputArray dst,
                      double maxValue,
                      int adaptiveMethod,
                      int thresholdType,
                      int blockSize, double C)

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
//载入图像
Mat img = imread("D:\\yt\\picture\\threshold\\s.jpg");
if (img.empty())
{
cout << "Error: Could not load image" << endl;
return 0;
}
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);//先转为灰度图
Mat dst1,dst2,dst3,dst4,dst5;
threshold(gray, dst1, 127, 255, THRESH_BINARY);//二值化阈值处理
threshold(gray, dst2, 127, 255, THRESH_BINARY_INV);//反二值化阈值处理
threshold(gray, dst3, 127, 255, THRESH_TRUNC);//截断阈值化处理
threshold(gray, dst4, 127, 255, THRESH_TOZERO_INV);//超阈值零处理
threshold(gray, dst5, 127, 255, THRESH_TOZERO);//低阈值零处理
//显示图像
imshow("gray_image", gray);
imshow("THRESH_BINARY", dst1);
imshow("THRESH_BINARY_INV", dst2);
imshow("THRESH_TRUNC", dst3);
imshow("THRESH_TOZERO_INV", dst4);
imshow("THRESH_TOZERO", dst5);
waitKey(0);
return 0;
}

实现效果图样例

我是海浪学长,创作不易,欢迎点赞、关注、收藏、留言。

毕设帮助,疑难解答,欢迎打扰!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了许多图像处理和计算机视觉算法。图像分割是计算机视觉中的一个重要任务,它可以将图像分成多个区域或对象。OpenCV提供了许多图像分割算法,包括阈值分割、区域生长、聚类、水平集方法等。 以下是几个常见的OpenCV图像分割算法的介绍: 1. 阈值分割(Thresholding):阈值分割是一种简单的图像分割方法,它通过将图像中的像素值与一个阈值进行比较,将像素分为不同的类别。OpenCV提供了多种阈值分割算法,如全局阈值和自适应阈值等。 2. 区域生长(Region Growing):区域生长是一种基于像素的图像分割方法,它通过将具有相似属性的像素组合成一个区域,并将其他像素标记为背景。OpenCV提供了区域生长算法的实现,可以根据不同的应用场景选择不同的生长算法。 3. 聚类(Clustering):聚类是一种无监督的图像分割方法,它通过将相似的像素组合成群集,并将其他像素标记为背景。OpenCV提供了多种聚类算法,如K-means、DBSCAN等。 4. 水平集方法(Level Set Method):水平集方法是近年来发展起来的一种先进的图像分割方法,它通过将图像中的边界或轮廓进行跟踪和演化,将图像分割成不同的区域。OpenCV提供了水平集方法的实现,可以根据不同的应用场景选择不同的水平集算法。 在使用OpenCV进行图像分割时,通常需要先对图像进行预处理,如滤波、去噪、缩放等,然后再选择合适的算法进行分割OpenCV还提供了许多工具和函数,用于处理图像数据和执行各种计算机视觉任务。使用OpenCV进行图像分割可以大大提高效率和准确性,适用于各种计算机视觉应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值