cv2.calcHist()函数返回值,灰度值为255的像素个数看似为0的细节探究。

import cv2
import matplotlib.pyplot as plt
import numpy as npimg=cv2.imread("gray.jpg",cv2.IMREAD_GRAYSCALE) #灰度模式加载。
print(img.shape)
H=np.zeros(256)
for i in range(img.shape[0]):for j in range(img.shape[1]):**if img[i,j]!=255:**   #灰度图,灰度值为255的像素个数不计算。最后默认为0.H[img[i,j]]=H[img[i,j]]+1
#print(H.astype(np.int32))
plt.plot(H.reshape(256,1),color='b')

#这个是自己算的亮度直方图中像素个数统计信息。灰度值为255的像素个数不统计之后,和cv2.calcHist()统计信息返回结果一样。可能是因为255代表白色,所以灰度图不需要统计白色像素值。

histb=cv2.calcHist([img],[0],None,[256],[0,255])#统计图像直方图信息。
print(histb.shape)
print(histb.astype(np.int32))
#histb==H.reshape(256,1)
print(histb.sum())#img.shape=(320, 518)。这个结果乘出来是165,760。
#histb.sum()=157932.0.
#也就是有7828个灰度值为255的像素点没被统计。结果7828也非常好计算,
count=0
for i in range(img.shape[0]):for j in range(img.shape[1]):if img[i,j]==255: count=count+1

OK!

后来我发现我上边的错了,cv2.calcHist的range参数是[0,255]的时候,255灰度值的像素个数统计为0,但是参数是[0,256]的时候,255灰度值的像素个数统计为正确的个数。(range参数代表像素值的取值范围。)
改一下参数就会发现这个有趣的地方:
histb=cv2.calcHist([img],[0],None,[256],[0,256])#统计图像直方图信息。
这个得到的结果对比:上图是原来[0,255]的数据,下图是[0,256]的数据。


根据这个结果,我认为range参数取得是左闭右开区间,当参数是[0,255]时候,histb形状是(256,1),所以histb的第256个元素的统计个数一定为0。然而参数是[0,256]时候,histb的第256个元素就会得到像素值的统计个数。

接着,查看opencv/ calcHist函数源码中:
//位深度为8位的图像,一个基础元素的范围都在**[0,255)**内。
(这里某博主注释的是[0,255),看来是不计算255的。)

const int low = 0, high = 256;
/*
*/
for( j = low; j < high; j++ )// 灰度值j 从0到255 循环{/* */}

但是从源码这个for遍历来看,是要计算255的。

参考(https://blog.csdn.net/zhjm07054115/article/details/24498839)
这是阿婆主小白猜测,希望有大佬指正错误。

神奇。cv2.calcHist()函数返回值,灰度值为255的像素个数看似为0。相关推荐

  1. 详解为什么OpenCV的直方图计算函数calcHist()计算出的灰度值为255的像素个数为0

    在使用OpenCV的直方图计算函数calcHist()时,发现灰度值为255的像素个数总是为0. 哪怕图像中灰度值为255的像素个数不为0,使用OpenCV的直方图计算函数calcHist()计算出的 ...

  2. Opencv中的cv2.calcHist()函数的作用及返回值

    在讨论其返回值前,我们先来介绍以下calcHist()函数的用法: cv2.calcHist()函数 cv2.calcHist()函数的作用:通过直方图可以很好的对整幅图像的灰度分布有一个整体的了解, ...

  3. c++中函数放在等号右边_如何从C或C++中的函数返回多个值?

    新程序员通常在寻找从函数返回多个值的方法.不幸的是,C和C++不允许直接这样做.但是幸运的是,通过一些巧妙的编程,我们可以轻松实现这一目标. 下面是从C函数中返回多个值的方法: 通过使用指针. 通过使 ...

  4. Python学习之函数返回多个值

    Python学习之函数返回多个值 问题的引出 Python中,一个函数能不能一次返回多个值? 在C语言中,函数最多返回一个值,如果要返回多个值,可以把这些值封装在一个结构体中.注意,C语言不允许函数返 ...

  5. Android JNI编程(三)——C语言指针的初步认识、指针变量、互换两个数、函数返回多个值...

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一.什么是指针? 简单来说: 指针就是内存地址      内存地址就是指针. ...

  6. python学习笔记-day6-函数的延续【汉字转拼音模块,函数返回多个值,匿名函数,列表生成式,generator生成器,三元运算符】...

    继续来说函数的后续知识点,主要是函数返回多个值,匿名函数,三元运算符,算是比较小的知识点. 一.汉字转拼音模的使用 1.安装模块 #install xpinyin 2.如果使用 结果: 二.函数返回多 ...

  7. python函数返回多个值_python函数返回多个值的示例方法

    python可以返回多个值,确实挺方便 函数里的return只能返回一个值,但是返回类型是没是限制的 因此,我们可以"返回一个 tuple类型,来间接达到返回多个值". 例子是我在 ...

  8. Java中如何实现一个函数返回多个值

    由于java中没有指针,不能像C++一样通过指针的方式实现一个函数返回多个值,因此在java中必须采用变通的方式解决,常用的方式有以下几种: 1.封装一个实体类,将要返回的值封装进去: 2.通过map ...

  9. C语言通过指针间接的实现函数返回多个值

    C语言通过指针间接的实现函数返回多个值 本例题中通过把指针作为函数参数来传递,依次达到改变变量的值的目的,最后实现一个函数返回两个变量的值 int *X,*X应该被看成一个整体来看,表示一个整形. # ...

最新文章

  1. SQL 语句转换格式函数Cast、Convert
  2. php rdkafka实例,linux下php扩展kafka的实例分享
  3. asp.net三层架构应用详解【收录】
  4. Nginx配置成系统服务
  5. pyspider 安装 和 快速开始
  6. 荔枝派 Nano 全志 F1C100s 编译运行 Linux ubuntu并升级gcc
  7. react的导出是怎么实现的_不到一百行代码,我们来实现一个简简简简简简简简简简版react库...
  8. Linux日志系统与日志库zlog
  9. Xpose框架的入门学习
  10. 腾讯软件测试笔试题西安,腾讯软件测试笔试题题库
  11. 万能Markdown数学公式
  12. 很多程序员编码时都戴耳机,到底在听什么?
  13. chrome广告过滤器插件-Adblock Plus
  14. Trx-address和交易的address
  15. 东北人都难懂的东北话
  16. Java中Thread类的start()和run()方法
  17. LQ0215 绳圈【DP】
  18. S60手机开发平台构建-塞班9.2+Carbide.c++
  19. 【Python三体问题】
  20. 20141226-网易有道实习反思

热门文章

  1. 面试/笔试第三弹 —— 数据库面试问题集锦
  2. java 游戏 protobuf,Unity 3D Protobuf的使用 信息的简单发送 并在Java服务器上接受显示...
  3. mvn 默认scope_Maven依赖中的scope详解
  4. 信息增益,信息增益率,Gini
  5. PHP 无限极分类下拉列表实现
  6. linux CST与EDT时区互转
  7. AI 人工智能学习之假设检验
  8. CSS漂亮搜索框代码
  9. 批量提取word doc文档中的表格
  10. [转]百度Appollo无人车Perception Module 分析