所谓图像分割是根据灰度、彩色、空间纹理、几何形状等特征把图像划分成若干个互不相交的区域,使得这些特征在同一区域内表现出一致性和相似性。

现有的图像分割有以下几类:
1.基于阈值分割:通过设定不同的特征阈值,把图像像素点分为若干类。

最稳定,且无需参数,对于现实图像保持了最好的均匀性和形状特性

2.基于区域分割

3.基于边缘分割:图像中边缘处像素的灰度值不连续,这种不连续性可通过求导数来检测。
常用的一阶微分算子有Roberts算子、Prewitt算子和Sobel算子,二阶微分算子有Laplace算子和Kirsh算子等。

4.基于特定的理论分割方法

下面是基于阈值分割ostu算法实现:

#include "pch.h"
#include<iostream>
#include <core.hpp>
#include <highgui.hpp>
#include <imgproc.hpp>
#include <opencv2/imgproc/types_c.h>  using namespace std;
using namespace cv;int Otsu(Mat matSrc)
{if (CV_8UC1 != matSrc.type()){cout << "Please input Gray-image!" << endl;return 0;}int nCols = matSrc.cols;int nRows = matSrc.rows;int nPixelNum = nCols * nRows;    //图像像素总数  int pixelNum[256];double probability[256];for (int i = 0; i < 256; i++)     //图像像素初始化{pixelNum[i] = 0;probability[i] = 0.0;}// 统计像素数和频率for (int j = 0; j < nRows; j++){for (int i = 0; i < nCols; i++){pixelNum[matSrc.at<uchar>(j, i)]++;}}for (int i = 0; i < 256; i++){probability[i] = (double)0.1*pixelNum[i] / nPixelNum;}int T = 0;          // 最佳阈值double dMaxDelta = 0;      // 最大类间方差double f = 0;        // 前景平均灰度double b = 0;        // 背景平均灰度double dDelta = 0;         // 类间方差double f_temp = 0;   // 前景均值中间值double b_temp = 0;   // 背景均值中间值double fProbability = 0;  // 前景频率值double bProbability = 0;   // 背景频率值for (int j = 0; j < 256; j++){for (int i = 0; i < 256; i++){if (i < j)// 前景部分{fProbability += probability[i];f_temp += i * probability[i];     //计算前景部分灰度中间值}else      // 背景部分{bProbability += probability[i];b_temp += i * probability[i];     //计算背景部分灰度中间值}}f = f_temp / fProbability;    //前景的灰度b = b_temp / bProbability;    //背景的灰度dDelta = (double)(fProbability * bProbability * pow((f - b), 2));   //当前类方差的计算if (dDelta > dMaxDelta){dMaxDelta = dDelta;T = j;}fProbability = 0;bProbability = 0;f_temp = 0;b_temp = 0;f = 0;b = 0;dDelta = 0;}return T;
}int main()
{Mat img = imread("D:\\Visual Studio project\\ConsoleApplication2\\风景.jpg",IMREAD_GRAYSCALE);  //读取一张灰色的风景图片int nCols = img.cols;int nRows = img.rows;imshow("gray", img);int nOstuThreshold = Otsu(img);cout << nOstuThreshold << endl;Mat matOstu = Mat::zeros(img.rows, img.cols, CV_8UC1);for (int j = 0; j < nRows; j++){for (int i = 0; i < nCols; i++){if (img.at<uchar>(j, i) < nOstuThreshold){matOstu.at<uchar>(j, i) = img.at<uchar>(j, i);}else{matOstu.at<uchar>(j, i) = 0;}}}imshow("ostu", matOstu);imwrite("D:\\Visual Studio project\\ConsoleApplication2\\ostu.jpg", matOstu);waitKey();return 0;
}

输出结果:


参考文章:https://www.cnblogs.com/Tang-tangt/p/9420405.html

【OpenCV】(三)opencv入门之图像的基本操作——图像阈值分割(ostu算法)相关推荐

  1. 前景背景分割——ostu算法的原理及实现 OpenCV (八)

    OpenCV [八]--前景背景分割--ostu算法的原理及实现 实验结果 代码实现 实现原理 参考资料 实验结果 代码实现 #include<opencv2/opencv.hpp> #i ...

  2. OPENCV C++图像提取,图像处理,roi,阈值分割,连通区域筛选,边缘检测(以箱子边缘框选为例)

    本周有机会接触了一点opnev, 在此做一下记录, 最终以框选出下图箱子为目的(图片箱子为相机实拍结果,曝光有点低,会有亿点点暗 ), 本文会拆解步骤并附上图片, 完整的源码在最后.PS:本文参考了好 ...

  3. otsu自适应阈值分割的算法描述和opencv实现,及其在肤色检测中的应用

    from:http://blog.csdn.net/onezeros/article/details/6136770 otsu算法选择使类间方差最大的灰度值为阈值,具有很好的效果 算法具体描述见ots ...

  4. opencv 二值化 python_Python OpenCV 图像二值化-阈值分割

    1.二值化处理 # 手动二值化处理 # 设置阈值大小 threshold thresh = 125 # 设置超过阈值像素值的最大值 maxval = 255 # THRESH_BINARY:超过阈值为 ...

  5. c++opencv汉字分割_机器学习小白,还不快pick一下——【视觉与图像:阈值分割】...

    " 前言:安利Python来开发OpenCV的原因其实细心的小伙伴早在?[视觉与图像]Python+OpenCV教程入门篇就找到了想要的答案.(点蓝字即可打开) " 今天周五了! ...

  6. 【千律】OpenCV基础:图像阈值分割 -- 自适应阈值分割 -- 代码实现

    环境:Python3.8 和 OpenCV 内容:自适应阈值分割代码实现 import cv2 as cv import numpy as np import matplotlib.pyplot as ...

  7. opencv中几种阈值分割

    七种常见阈值分割代码(Otsu.最大熵.迭代法.自适应阀值.手动.迭代法.基本全局阈值法) 一.工具:VC+OpenCV 二.语言:C++ 三.原理 otsu法(最大类间方差法,有时也称之为大津算法) ...

  8. 七种图像阈值分割技术

    一.工具:VC+OpenCV 二.语言:C++ 三.原理 otsu法(最大类间方差法,有时也称之为大津算法)使用的是聚类的思想,把图像的灰度数按灰度级分成2个部分,使得两个部分之间的灰度值差异最大,每 ...

  9. python 阈值分割 给黑白图像上伪彩色

    完整代码在最后. 一.处理结果 图1 原图像(左)和上色后图像(右) 二.实现方法 Opencv中提供了五种阈值分割的函数,将这五种函数均应用于源图像观察其效果. 图2 五种阈值分割函数作用于原图像i ...

最新文章

  1. 抗住 8 亿人买买买!双 11 背后黑科技大曝光
  2. 测试缺陷分析务实篇-转
  3. 09 | 基础篇:怎么理解Linux软中断?
  4. 在抽象类中可以没有抽象方法_是否可以在最终课程中使用抽象方法?
  5. 计算机二级web题目(2)--HTTP基础
  6. java 数组构造_java – 从数组构造(非二进制)树
  7. Gitorious基本配置流程
  8. 软件测试技术第一次试验之——JUnit的安装与使用
  9. 计算机应用基础五笔试题,2016全新计算机应用基础试题及答案
  10. 《炬丰科技-半导体工艺》 PVA刷接触式清洗过程中超细颗粒清洗现象
  11. 苹果测试软件testflight游戏,TestFlight
  12. router.php,CodeIgniter源码分析[5]——路由类Router.php
  13. 小草酒店客房管理系统 免费
  14. android 7 audio架构,GitHub - zozo825117/ble_audio_android: android audio框架
  15. 【按键精灵源码】一个稍微复杂点的脚本界面
  16. JAVA SpringBlade 微服务开发平台框架,企业级的SaaS多租户微服务平台,基于Spring Boot 2.7
  17. Antd 的 Upload 上传组件 uploading 状态踩坑记
  18. 读一本好书,享一段时光
  19. C++ 如何加载lib
  20. angularJS在移动端的点击事件延迟问题

热门文章

  1. Kinect 开发小记:穿越艾泽拉斯,调戏红龙女王
  2. 野路子土鳖ASP.NETer谈互联网的发展趋势
  3. 依赖注入和控制反转的区别
  4. STL 中list删除元素
  5. 【Uniapp】手把手教你高德地图的接入、定位、自定义标点与信息窗体使用
  6. 网址链接有效性批量检测工具使用教程
  7. scala调用java可变参数函数
  8. jquery 中$.ajax().done() 的用法
  9. #python二维列表(有图有代码,简洁清晰明了!)
  10. openGL+Python=PyopenGL模块