Opencv_07 图像的像素值统计
文章目录
- 一. 像素值统计的需求
- 二. 像素值统计的API
- ① 获取像素最大值,最小值,像素最大值位置,像素最小值为的API
- ② 获取像素的均值和方差的API
- ③ 统计非零像素的个数
一. 像素值统计的需求
统计一个图像中的像素在工作中很有必要的,因为图像处理过程中主要就是和像素打交道.
主要统计的数据:
- 像素最大值
- 像素最小值
- 像素最小值的位置
- 像素最大值的位置
- 像素均值
- 像素方差(像素方差,是所有像素和像素均值之间的平方的平均数)
二. 像素值统计的API
① 获取像素最大值,最小值,像素最大值位置,像素最小值为的API
函数原型:
void minMaxLoc(InputArray src, CV_OUT double* minVal,CV_OUT double* maxVal = 0,
CV_OUT Point* minLoc = 0,CV_OUT Point* maxLoc = 0, InputArray mask = noArray());
函数功能:
这个函数用来获取一个单通道图像的最大和最小值,以及最大值和最小值的位置,如果mask
为空,则是全部的图像,如果mask
不为空,在mask
的区域求最大值和最小值.其实就是mask
的非零区域求最大值和最小值.
参数解释:
src:
输入的图像,只能是单通道的图像minVal:
最小值指针,如果不需要可以传参数NULLmaxVal:
最大值指针,如果不需要可以传参数NULLminLoc:
最小值位置指针,Pointer
类型,如果不需要,可以传参数NULLmaxLoc:
最大值位置指针,Pointer
类型,如果不需要,可以传参数NULLmask:
用来选择一个子区域
#include "MyOpencv.h"int main(void)
{Mat src = Mat::zeros(Size(10, 10), CV_8UC1);int rows = src.rows;int cols = src.cols;int channels = src.channels();for (int row = 0; row < rows; row++){uchar *pCurrent = src.ptr<uchar>(row);for (int col = 0; col < cols; col++){*pCurrent++ = row * 10 + col; // 像素赋值从0~99}}cout << "src = " << endl;cout << src << endl;double minVal;double maxVal;Point minLoc;Point maxLoc;cv::minMaxLoc(src, &minVal, &maxVal, &minLoc, &maxLoc);cout << "图像像素信息: 像素最小值: " << minVal << " 最小值位置: " << minLoc<< " 像素最大值: " << maxVal << " 像素最大值位置: " << maxLoc << endl;// 使用Mask,只统计第2~4行和2~4列 22~44的位置Mat mask = Mat::zeros(src.rows, src.cols, CV_8UC1);Rect rect(2, 2, 3, 3);mask(rect) = Scalar(1);cout << "Mask = " << endl;cout << mask << endl;cv::minMaxLoc(src, &minVal, &maxVal, &minLoc, &maxLoc, mask);cout << "2~4行 && 2~4列的像素信息: " << endl;cout << "像素最小值: " << minVal << " 最小值位置 : " << minLoc<< " 像素最大值: " << maxVal << " 像素最大值位置: " << maxLoc << endl;}
结果:
② 获取像素的均值和方差的API
函数原型:
void meanStdDev(InputArray src, OutputArray mean, OutputArray stddev,InputArray mask=noArray());
函数功能:
该函数独自的计算各个通道的均值和方差,然后通过输出参数返回.
参数:
src:
输入图像mean:
输出Mat,代表各个通道的均值,这里的形状是3行一列的矩阵stddev:
输出Mat,代表各个通道的均方差,这里的形状是3行一列的矩阵mask:
用来确定计算区域,也就是mask中那些非0的位置才会参与计算.当mask所有的元素都是0的时候,返回mean=stddev=Scalar::all(0).
#include "MyOpencv.h"int main(void)
{Mat src = Mat::zeros(Size(6, 6), CV_8UC3);int rows = src.rows;int cols = src.cols;int channels = src.channels();for (int row = 0; row < rows; row++){uchar *pCurrent = src.ptr<uchar>(row);for (int col = 0; col < cols; col++){*pCurrent++ = row * 6 * 3 + col * 3 + 0;*pCurrent++ = row * 6 * 3 + col * 3 + 1;*pCurrent++ = row * 6 * 3 + col * 3 + 2;}}cout << "src = " << endl; // 0 ~ 107像素值,一共 6 * 6 & 3 = 108个像素值cout << src << endl;Mat mean, stddev;cv::meanStdDev(src, mean, stddev);cout << "不带mask的时候: 图形均值: " << mean << ", 均方差: " << stddev << endl;cout << "mean的形状: 行数: " << mean.rows << " 列数: " << mean.cols << endl;cout << "stddev的形状: 行数: " << mean.rows << " 列数: " << mean.cols << endl;cout << "----------------------------------" << endl;// 带mask的,首先把mask全部是0的情况Mat maskZero = Mat::zeros(src.rows, src.cols, CV_8UC1);cv::meanStdDev(src, mean, stddev,maskZero);cout << "mask全部为0的时候: 图形均值: " << mean << ", 均方差: " << stddev << endl;cout << "mean的形状: 行数: " << mean.rows << " 列数: " << mean.cols << endl;cout << "stddev的形状: 行数: " << mean.rows << " 列数: " << mean.cols << endl;cout << "---------------------------------" << endl;Rect rect(3, 3, 2, 2); // 第3~4行 3~4列的均值方差maskZero(rect) = Scalar(1);cv::meanStdDev(src, mean, stddev, maskZero);cout << "mask 3~4行,3~4列为1的时候: 图形均值: " << mean << ", 均方差: " << stddev << endl;cout << "mean的形状: 行数: " << mean.rows << " 列数: " << mean.cols << endl;cout << "stddev的形状: 行数: " << mean.rows << " 列数: " << mean.cols << endl;return 0;
}
结果:
③ 统计非零像素的个数
函数原型:
int countNonZero( InputArray src );
功能:
统计单通道图像非0像素的个数
参数:
src:
输入图像,只能是单通道的Mat图像矩阵.
#include"MyOpencv.h"int main(void)
{Mat srcColor = Mat::zeros(Size(10, 10), CV_8UC3);Mat srcGray = Mat::zeros(Size(10, 10), CV_8UC1);int rows = srcColor.rows;int cols = srcColor.cols;int channels = srcColor.channels();// 三通道图像赋值for (int row = 0; row < rows; row++){uchar *pCurrent = srcColor.ptr<uchar>(row);for (int col = 0; col < cols; col++){if ((row + col) % 2 == 0){// 如果行数和列数的和是偶数,就赋值为0*pCurrent++ = 0;*pCurrent++ = 0;*pCurrent++ = 0;}else{*pCurrent++ = 128;*pCurrent++ = 128;*pCurrent++ = 128;}}}// 单通道图像赋值for (int row = 0; row < rows; row++){uchar *pCurrent = srcGray.ptr<uchar>(row);for (int col = 0; col < cols; col++){if ((row + col) % 2 == 0){*pCurrent++ = 0;}else{*pCurrent++ = 128;}}}// 然后统计非0的个数//int number = cv::countNonZero(srcColor); 这里会报错,所以三通道的,要先分离通道,然后再统计int number = cv::countNonZero(srcGray);cout << "srcGray = " << endl;cout << srcGray << endl;cout << "---------------------" << endl;cout << "非零个数: " << number << endl;}
结果:
Opencv_07 图像的像素值统计相关推荐
- C++ opencv之像素值统计(minMaxLoc,meanStdDev)
一.引言 这篇博客的主要知识点为:像素值统计 最小(min) 最大(max) 均值(mean) 标准方差(standard deviation) API 的知识点为: 最大最小值minMaxLoc 计 ...
- OpenCV 学习笔记-day13 像素值统计 统计计算最大最小值,平均值和标准差 (minMaxLoc()和meanStdDev()函数的使用)
OpenCV 学习笔记 day13 像素值统计 函数 minMaxLoc(); 最大值最小值统计 meanStdDev();平均值和标准方差统计 代码 day13 像素值统计 函数 minMaxLoc ...
- java读取tiff图像的像素值
注意:读取tiff图像的像素值,并非rgb,这是GIS方向的同学应当明晓的事情. 由于本人之前糊里糊涂的将tiff图像的rgb值作为了像素值来读取,白折腾很久很久.希望这篇文章能够为正处于此时期的童鞋 ...
- c语言鼠标怎么获取像素,OpenCV获取鼠标左键点击位置图像的像素值
本文实现功能:利用opencv获取鼠标左键点击位置图像的像素值(RGB像) vs2015+opencv3.1 #include #include using namespace std; using ...
- opencv将Mat读入的图像的像素值打印在控制台上
//将Mat读入的图像像素值打印在控制台上,这里的Img为单通道 方法一:cv::Mat Img; IplImage *src;src=&IplImage(Img);for(int i=0;i ...
- itk调整图像的像素值范围
1. 前言 比如原来是−1023−2034-1023-2034−1023−2034,现在需要调整到0−2550-2550−255 2. 代码 2.1 definition.h #pragma once ...
- C# 读取bmp图像所有像素值
将Bitmap数据转为byte[]数据,且每个数据代表像素值 Bitmap bmp = new Bitmap(Image.FromFile(path)); // 加载图像 private byte[] ...
- opencv 图像基本操作 像素值的获取、图像大小、ROI、通道分割与合并等
opencv中的图像基本操作方法 访问和修改图像某像素点的值 函数 a=img[y,x] #获取像素点的值 img[y,x]=b #修改像素点的值 实例 import cv2 as cv import ...
- Python+OpenCV 图像处理系列(4)—— 图像像素的读写、算术运算、逻辑运算及像素的统计
1. 像素的读写 可以根据像素的行和列的坐标获取它的像素值.对 BGR 图像而言,返回值为 B,G,R 的值. img.shape 可以获取图像的形状.它的返回值是一个包含行数 h,列数 w,通道数 ...
- 【转】DICOM图像像素值(灰度值)转换为CT值
转自:https://www.cnblogs.com/xuhui24/p/6193032.html https://zhuanlan.zhihu.com/p/358770379 ...
最新文章
- 深入理解argparse模块中的add_argument的参数(如action等)
- linux中下载ftp文件
- HDMI_VGA_CBVS同时显示
- Oracle 工具权限二
- JZOJ 100043. 【NOIP2017提高A组模拟7.13】第K小数
- 论文浅尝 | 将文本建模为关系图,用于联合实体和关系提取
- java功能模块_Java 14功能
- 路孚特:300天350个版本,旗舰移动产品“0”到“1”的交付之路
- MATLAB实现智能优化算法
- GO语言+区块链视频教程,GO语言+区块链学习线路图(含大纲+视频+资料)
- 今天520情人节,你确定不学一下「情话设计模式」?
- hioki电阻测试仪3540软件,微电阻计/电阻测试仪/HIOKI 3540/HIOKI 3560/日置3540/日置3560...
- 小白学习cartopy画地图的第六天
- Netlogon特权提升漏洞
- 关于Titan的中文整理
- .net实现微信公众账号接口开发
- sql删除字段约束 删除字段
- 方差分析 球形检验_spss球形检验.PDF
- 对接阿里云平台短信接口
- 航空摄影测绘图制作,无人机航测成图