opencv学习-010-图像像素值统计二值图像采用阈值的一种方法(minMaxLoc,meanStdDev)

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, const char *argv[]){
	Mat src = imread("E:/Desktop/y.jpg", IMREAD_GRAYSCALE);
	if (src.empty()) {
		printf("could not load image...\n");
		return -1;
	}
	namedWindow("input", WINDOW_AUTOSIZE);
	imshow("input", src);

	double minVal; double maxVal; Point minLoc; Point maxLoc;
	minMaxLoc(src, &minVal, &maxVal, &minLoc, &maxLoc, Mat());
	printf("min: %.2f, max: %.2f \n", minVal, maxVal);
	printf("min loc: (%d, %d) \n", minLoc.x, minLoc.y);
	printf("max loc: (%d, %d)\n", maxLoc.x, maxLoc.y);

	// 彩色图像 三通道的 均值与方差
	src = imread("E:/Desktop/y.jpg");
	Mat means, stddev;
	meanStdDev(src, means, stddev);
	
	//以下也可以means.at<double>(0,0)
	//means.at<double>(1,0)
	//means.at<double>(2,0)
	printf("blue channel->> mean: %.2f, stddev: %.2f\n", means.at<double>(0), stddev.at<double>(0));
	printf("green channel->> mean: %.2f, stddev: %.2f\n", means.at<double>(1), stddev.at<double>(1));
	printf("red channel->> mean: %.2f, stddev: %.2f\n", means.at<double>(2), stddev.at<double>(2));
	
	//彩色图像三通道的二值图像
	for (int row = 0; row < src.rows; row++) {
		for (int col = 0; col < src.cols;col++) {
			Vec3b bgr = src.at<Vec3b>(row, col);
			bgr[0] = bgr[0] < means.at <double>(0) ? 0 : 255;
			bgr[1] = bgr[1] < means.at <double>(1) ? 0 : 255;
			bgr[2] = bgr[2] < means.at <double>(2) ? 0 : 255;
			src.at<Vec3b>(row, col) = bgr;
		}
	}
	imshow("binary",src);
	waitKey(0);
	return 0;
}

在这里插入图片描述


1. minMaxLoc

函数原型:

void minMaxLoc(	InputArray src, 
				double* minVal, 
				double* maxVal=0, 
				Point* minLoc=0, 
				Point* maxLoc=0, 
				InputArray mask=noArray())
				
参数:
src:输入图像。
minVal:最小值,可输入NULL表示不需要。
maxVal :最大值,可输入NULL表示不需要。
minLoc:最小值的位置,可输入NULL表示不需要,Point类型。
maxLoc:最大值的位置,可输入NULL表示不需要,Point类型。
mask:可有可无的掩模。

很简单,只需要我们把我们要是用的参数先定义出来,使用完函数之后,那些参数的值就求出来了。

2. meanStdDev

void meanStdDev(InputArray src,
				OutputArray mean, 
				OutputArray stddev, 
				InputArray mask=noArray())

其中:
  InputArray这个接口类可以是MatMat_<T>Mat_<T, m, n>vector<T>vector<vector<T>>vector<Mat>。也就意味着当你看refman或者源代码时,如果看见函数的参数类型是InputArray型时,把上诉几种类型作为参数都是可以的。

OutputArrayInputArray的派生类。
简单来讲,InputArrayOutputArray类型一般都是Mat类型

关于InputArrayOutputArray类型参考:InputArray和OutputArray的那些事core

3. 二值图像采用阈值的一种方法

代码中:

//彩色图像三通道的二值图像
	for (int row = 0; row < src.rows; row++) {
		for (int col = 0; col < src.cols;col++) {
			Vec3b bgr = src.at<Vec3b>(row, col);
			bgr[0] = bgr[0] < means.at <double>(0) ? 0 : 255;
			bgr[1] = bgr[1] < means.at <double>(1) ? 0 : 255;
			bgr[2] = bgr[2] < means.at <double>(2) ? 0 : 255;
			src.at<Vec3b>(row, col) = bgr;
		}
	}
	imshow("binary",src);

这里采用的就是使用图像各个通道的均值作为其阈值,来转换为二值图像。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐