opencv学习-010-图像像素值统计和二值图像采用阈值的一种方法(minMaxLoc,meanStdDev)
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:
·
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
这个接口类可以是Mat
、Mat_<T>
、Mat_<T, m, n>
、vector<T>
、vector<vector<T>>
、vector<Mat>
。也就意味着当你看refman或者源代码时,如果看见函数的参数类型是InputArray
型时,把上诉几种类型作为参数都是可以的。
OutputArray
是InputArray
的派生类。
简单来讲,InputArray
和OutputArray
类型一般都是Mat
类型
关于InputArray
和OutputArray
类型参考: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);
这里采用的就是使用图像各个通道的均值作为其阈值,来转换为二值图像。
更多推荐
所有评论(0)