通过灰度直方图进行简单的阈值分割

用到calcHist函数,返回hist,用minMaxloc来找到hist中数目最大的灰度级,表明其背景大概在这个区域,并以此作为阈值,进行分割。

其代码如下:

// opencv_6.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<opencv245.h>

using namespace std;
using namespace cv;

class Histogram1D
{
private:
	int histSize[1];
	float hranges[2];
	const float* ranges[1];
	int channels[1];

public:
	Histogram1D()
	{
		histSize[0] = 256;
		hranges[0] = 0.0;
		hranges[1] = 255.0;
		ranges[0] = hranges;
		channels[0] = 0;

	}

	Mat getHistogram(const Mat& image)
	{
		Mat hist;
		calcHist(&image,
			     1,
				 channels,
				 Mat(),
				 hist,
				 1,
				 histSize,
				 ranges);
		return hist;
	}

	double lookMaxpixel(Mat & hist)
	{
		double MaxVal = 0.0;
		/*double MinVal = 0.0;*/
		minMaxLoc(hist, NULL, &MaxVal);
		return MaxVal;
	}
	
};


int _tmain(int argc, _TCHAR* argv[])
{
	Histogram1D h;
	Mat image = 
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
直方图是一种用于展示图像像素值分布情况的图表,它可以帮助我们了解图像中像素值的分布情况。在阈值分割中,我们可以利用直方图中的信息来选择一个合适的阈值来将图像分割成两部分:一部分是大于等于阈值的像素,另一部分是小于阈值的像素。 具体操作步骤如下: 1. 读取图像并将其转化为灰度图像。 2. 计算图像的直方图,可以使用OpenCV中的cv2.calcHist()函数。 3. 可以使用matplotlib库中的pyplot.hist()函数将直方图可视化。 4. 根据直方图的形状选择一个合适的阈值。可以通过手动调整的方式确定阈值,也可以使用Otsu算法自动选择阈值。 5. 将图像根据阈值进行分割,可以使用OpenCV中的cv2.threshold()函数实现。 6. 显示分割后的图像。 代码示例: ```python import cv2 import numpy as np import matplotlib.pyplot as plt # 读取图像并将其转化为灰度图像 img = cv2.imread('lena.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 计算直方图 hist = cv2.calcHist([gray], [0], None, [256], [0, 256]) # 可视化直方图 plt.hist(gray.ravel(), 256, [0, 256]) plt.show() # 手动选择阈值 threshold = 100 # 自动选择阈值 # threshold, _ = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) # 根据阈值进行分割 ret, binary = cv2.threshold(gray, threshold, 255, cv2.THRESH_BINARY) # 显示分割后的图像 cv2.imshow('binary', binary) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个示例中,我们首先读取了一张图像,然后将其转化为灰度图像。接着,我们使用cv2.calcHist()函数计算了图像的直方图,并可视化了直方图。然后,我们手动选择了一个阈值100,或者使用Otsu算法自动选择阈值。最后,我们使用cv2.threshold()函数对图像进行分割,并显示分割后的图像。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值