【OpenCV】(三)opencv入门之图像的基本操作——图像阈值分割(ostu算法)
所谓图像分割是根据灰度、彩色、空间纹理、几何形状等特征把图像划分成若干个互不相交的区域,使得这些特征在同一区域内表现出一致性和相似性。
现有的图像分割有以下几类:
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算法)相关推荐
- 前景背景分割——ostu算法的原理及实现 OpenCV (八)
OpenCV [八]--前景背景分割--ostu算法的原理及实现 实验结果 代码实现 实现原理 参考资料 实验结果 代码实现 #include<opencv2/opencv.hpp> #i ...
- OPENCV C++图像提取,图像处理,roi,阈值分割,连通区域筛选,边缘检测(以箱子边缘框选为例)
本周有机会接触了一点opnev, 在此做一下记录, 最终以框选出下图箱子为目的(图片箱子为相机实拍结果,曝光有点低,会有亿点点暗 ), 本文会拆解步骤并附上图片, 完整的源码在最后.PS:本文参考了好 ...
- otsu自适应阈值分割的算法描述和opencv实现,及其在肤色检测中的应用
from:http://blog.csdn.net/onezeros/article/details/6136770 otsu算法选择使类间方差最大的灰度值为阈值,具有很好的效果 算法具体描述见ots ...
- opencv 二值化 python_Python OpenCV 图像二值化-阈值分割
1.二值化处理 # 手动二值化处理 # 设置阈值大小 threshold thresh = 125 # 设置超过阈值像素值的最大值 maxval = 255 # THRESH_BINARY:超过阈值为 ...
- c++opencv汉字分割_机器学习小白,还不快pick一下——【视觉与图像:阈值分割】...
" 前言:安利Python来开发OpenCV的原因其实细心的小伙伴早在?[视觉与图像]Python+OpenCV教程入门篇就找到了想要的答案.(点蓝字即可打开) " 今天周五了! ...
- 【千律】OpenCV基础:图像阈值分割 -- 自适应阈值分割 -- 代码实现
环境:Python3.8 和 OpenCV 内容:自适应阈值分割代码实现 import cv2 as cv import numpy as np import matplotlib.pyplot as ...
- opencv中几种阈值分割
七种常见阈值分割代码(Otsu.最大熵.迭代法.自适应阀值.手动.迭代法.基本全局阈值法) 一.工具:VC+OpenCV 二.语言:C++ 三.原理 otsu法(最大类间方差法,有时也称之为大津算法) ...
- 七种图像阈值分割技术
一.工具:VC+OpenCV 二.语言:C++ 三.原理 otsu法(最大类间方差法,有时也称之为大津算法)使用的是聚类的思想,把图像的灰度数按灰度级分成2个部分,使得两个部分之间的灰度值差异最大,每 ...
- python 阈值分割 给黑白图像上伪彩色
完整代码在最后. 一.处理结果 图1 原图像(左)和上色后图像(右) 二.实现方法 Opencv中提供了五种阈值分割的函数,将这五种函数均应用于源图像观察其效果. 图2 五种阈值分割函数作用于原图像i ...
最新文章
- 抗住 8 亿人买买买!双 11 背后黑科技大曝光
- 测试缺陷分析务实篇-转
- 09 | 基础篇:怎么理解Linux软中断?
- 在抽象类中可以没有抽象方法_是否可以在最终课程中使用抽象方法?
- 计算机二级web题目(2)--HTTP基础
- java 数组构造_java – 从数组构造(非二进制)树
- Gitorious基本配置流程
- 软件测试技术第一次试验之——JUnit的安装与使用
- 计算机应用基础五笔试题,2016全新计算机应用基础试题及答案
- 《炬丰科技-半导体工艺》 PVA刷接触式清洗过程中超细颗粒清洗现象
- 苹果测试软件testflight游戏,TestFlight
- router.php,CodeIgniter源码分析[5]——路由类Router.php
- 小草酒店客房管理系统 免费
- android 7 audio架构,GitHub - zozo825117/ble_audio_android: android audio框架
- 【按键精灵源码】一个稍微复杂点的脚本界面
- JAVA SpringBlade 微服务开发平台框架,企业级的SaaS多租户微服务平台,基于Spring Boot 2.7
- Antd 的 Upload 上传组件 uploading 状态踩坑记
- 读一本好书,享一段时光
- C++ 如何加载lib
- angularJS在移动端的点击事件延迟问题
热门文章
- Kinect 开发小记:穿越艾泽拉斯,调戏红龙女王
- 野路子土鳖ASP.NETer谈互联网的发展趋势
- 依赖注入和控制反转的区别
- STL 中list删除元素
- 【Uniapp】手把手教你高德地图的接入、定位、自定义标点与信息窗体使用
- 网址链接有效性批量检测工具使用教程
- scala调用java可变参数函数
- jquery 中$.ajax().done() 的用法
- #python二维列表(有图有代码,简洁清晰明了!)
- openGL+Python=PyopenGL模块