文章目录

  • 一. 像素值统计的需求
  • 二. 像素值统计的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:最小值指针,如果不需要可以传参数NULL
  • maxVal:最大值指针,如果不需要可以传参数NULL
  • minLoc:最小值位置指针,Pointer类型,如果不需要,可以传参数NULL
  • maxLoc:最大值位置指针,Pointer类型,如果不需要,可以传参数NULL
  • mask: 用来选择一个子区域
#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 图像的像素值统计相关推荐

  1. C++ opencv之像素值统计(minMaxLoc,meanStdDev)

    一.引言 这篇博客的主要知识点为:像素值统计 最小(min) 最大(max) 均值(mean) 标准方差(standard deviation) API 的知识点为: 最大最小值minMaxLoc 计 ...

  2. OpenCV 学习笔记-day13 像素值统计 统计计算最大最小值,平均值和标准差 (minMaxLoc()和meanStdDev()函数的使用)

    OpenCV 学习笔记 day13 像素值统计 函数 minMaxLoc(); 最大值最小值统计 meanStdDev();平均值和标准方差统计 代码 day13 像素值统计 函数 minMaxLoc ...

  3. java读取tiff图像的像素值

    注意:读取tiff图像的像素值,并非rgb,这是GIS方向的同学应当明晓的事情. 由于本人之前糊里糊涂的将tiff图像的rgb值作为了像素值来读取,白折腾很久很久.希望这篇文章能够为正处于此时期的童鞋 ...

  4. c语言鼠标怎么获取像素,OpenCV获取鼠标左键点击位置图像的像素值

    本文实现功能:利用opencv获取鼠标左键点击位置图像的像素值(RGB像) vs2015+opencv3.1 #include #include using namespace std; using ...

  5. opencv将Mat读入的图像的像素值打印在控制台上

    //将Mat读入的图像像素值打印在控制台上,这里的Img为单通道 方法一:cv::Mat Img; IplImage *src;src=&IplImage(Img);for(int i=0;i ...

  6. itk调整图像的像素值范围

    1. 前言 比如原来是−1023−2034-1023-2034−1023−2034,现在需要调整到0−2550-2550−255 2. 代码 2.1 definition.h #pragma once ...

  7. C# 读取bmp图像所有像素值

    将Bitmap数据转为byte[]数据,且每个数据代表像素值 Bitmap bmp = new Bitmap(Image.FromFile(path)); // 加载图像 private byte[] ...

  8. opencv 图像基本操作 像素值的获取、图像大小、ROI、通道分割与合并等

    opencv中的图像基本操作方法 访问和修改图像某像素点的值 函数 a=img[y,x] #获取像素点的值 img[y,x]=b #修改像素点的值 实例 import cv2 as cv import ...

  9. Python+OpenCV 图像处理系列(4)—— 图像像素的读写、算术运算、逻辑运算及像素的统计

    1. 像素的读写 可以根据像素的行和列的坐标获取它的像素值.对 BGR 图像而言,返回值为 B,G,R 的值. img.shape 可以获取图像的形状.它的返回值是一个包含行数 h,列数 w,通道数 ...

  10. 【转】DICOM图像像素值(灰度值)转换为CT值

    转自:https://www.cnblogs.com/xuhui24/p/6193032.html            https://zhuanlan.zhihu.com/p/358770379 ...

最新文章

  1. 深入理解argparse模块中的add_argument的参数(如action等)
  2. linux中下载ftp文件
  3. HDMI_VGA_CBVS同时显示
  4. Oracle 工具权限二
  5. JZOJ 100043. 【NOIP2017提高A组模拟7.13】第K小数
  6. 论文浅尝 | 将文本建模为关系图,用于联合实体和关系提取
  7. java功能模块_Java 14功能
  8. 路孚特:300天350个版本,旗舰移动产品“0”到“1”的交付之路
  9. MATLAB实现智能优化算法
  10. GO语言+区块链视频教程,GO语言+区块链学习线路图(含大纲+视频+资料)
  11. 今天520情人节,你确定不学一下「情话设计模式」?
  12. hioki电阻测试仪3540软件,微电阻计/电阻测试仪/HIOKI 3540/HIOKI 3560/日置3540/日置3560...
  13. 小白学习cartopy画地图的第六天
  14. Netlogon特权提升漏洞
  15. 关于Titan的中文整理
  16. .net实现微信公众账号接口开发
  17. sql删除字段约束 删除字段
  18. 方差分析 球形检验_spss球形检验.PDF
  19. 对接阿里云平台短信接口
  20. 航空摄影测绘图制作,无人机航测成图

热门文章

  1. js一键批量打印_JS 实现选中内容批量打印/导出
  2. oracle数据库,使用plsql导出表数据缺少空表
  3. 劢领AT| 五分钟,零基础玩转Wing中国电信物联网开放平台
  4. AFNetworking 2.0 来了
  5. 推荐oracle exadata,Exadata的一些常见误区
  6. Jmeter进行接口测试流程步骤详解
  7. springboot整合tkmybatis以及使用
  8. nmap快速扫描大量主机端口方法
  9. 马拉车算法(Manacher's Algorithm)
  10. SMART200 DP01模块通讯问题