OpenCV——Otsu二值化

目录

  • 一、Otsu算法
  • 二、C++代码
  • 三、python代码
  • 四、结果展示
  • 五、参考链接

一、Otsu算法

   Otsu算法(大津法或最大类间方差法)使用的是聚类的思想,把图像的灰度数按灰度级分成2个部分,使得两个部分之间的灰度值差异最大,每个部分之间的灰度差异最小,通过方差的计算来寻找一个合适的灰度级别来划分。 所以可以在二值化的时候采用otsu算法来自动选取阈值进行二值化。otsu算法被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响。因此,使类间方差最大的分割意味着错分概率最小。

二、C++代码

#include 
#include 


using namespace std;
using namespace cv;

int main()
{
	Mat img = imread("s.jpg");
	if (img.empty())
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}

	Mat gray;
	cvtColor(img, gray, COLOR_BGR2GRAY);
	//灰度图像大津法
	Mat img_Thr_O;
	threshold(gray, img_Thr_O, 0, 255, THRESH_BINARY | THRESH_OTSU);    // 大津法自动寻求全局阈值。
	//-----------------------------------------------------------------------
	// *第一个参数:待二值化的图像,图像只能是CV_8U和CV_32F两种类型。对于
	// 图像通道数目的要求与选择二值化的方法有关。
	// *第二个参数:二值化后的图像
	// *第三个参数:二值化阈值
	// *第四个参数:二值化过程的最大值,它只在THRESH_BINARY和THRESH_BINARY_INV
	// 两种方法中才使用。
	// -----------------------------------------------------------------------
	imshow("origion_pic", img);
	imshow("img_Thr_O", img_Thr_O);
	waitKey(0);

	return 0;
}

三、python代码

import cv2

# -------------------------读取数据----------------------------
img = cv2.imread('s.jpg')
# ------------------------转为灰度图---------------------------
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# -------------------Otsu's thresholding----------------------
ret2, th2 = cv2.threshold(gray_img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# ------------------------显示图片----------------------------
cv2.imshow("origin_pic", img)
cv2.imshow("res", th2)
cv2.waitKey()

四、结果展示

OpenCV——Otsu二值化_第1张图片

五、参考链接

[1] 用OpenCV实现Otsu算法
[2] opencv 最大类间方差(大津法OTSU)
[3] opencv otsu二值化

你可能感兴趣的:(OpenCV,图像/点云处理,opencv,python,c++)