今天在实现图像阈值分割的时候,需要找到能将背景与物体区分开的灰度阈值,因为处理到的图像比较简单,它的直方图具有一个十分明显的特点,也就是它的直方图以双峰一谷的形式呈现,将物体与背景区分开来的阈值也就是谷所对应的阈值,利用数学概念解释一下,双峰就对应着两个极大值,谷对应着极小值,也就是在两个极大值之间找到这个最小值,当然也可以通过统计一下图像灰度值的分布,将灰度值分布以可视化的方式呈现,然后找到合适的阈值,这比排序找极小值的效率快很多,在这里我将介绍三种将灰度分布可视化的方式。

    方法一————利用matplotlib库中的hist()函数

matplotlib.pyplot.hist(xbins=Nonerange=Nonedensity=Falseweights=Nonecumulative=Falsebottom=Nonehisttype='bar'align='mid'orientation='vertical'rwidth=Nonelog=Falsecolor=Nonelabel=Nonestacked=False*data=None**kwargs)

一般只定义前面三个参数:

x: 输入的数据

bins:如果bins输入的是一个整数,那么它代表着在输出的图像中,横坐标被均分为多少份

range:它定义了横坐标的范围,输入的是存储了两个数的列表,左边的数是横坐标起点,右边的数是横坐标截止点

这个函数输出的最终结果,是显示每一个灰度值,以及其对应的频率的连续图

  方法二————利用opencv中的calcHist函数

cv.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])

image:需要被统计灰度值分布的图像,有一个血的教训,image一定要用[]框住

channels:图像通道,对于一个BGR图像, [0], [1],[2]分别对于B,G,R三个通道

mask:一般默认其为None即可

histSize:定义了直方图横坐标范围

ranges:定义了横坐标被分为多少份

方法三————利用PLotly进行可视化绘图

Plotly生成的图表是交互式的,也就是说当你用鼠标指向对应的一个灰度值时,他会直接显示这个灰度值的频率,但是耗时比较长,应为他需要用程序计算出每个灰度值对应的频数是多少。

在这里主要用到了:

Bar函数,来存储输入数据的横纵坐标

Layout函数,用来定义函数的标题,横纵坐标

offline.plot, 最终的绘图

三种方法的实现过程总程序如下:

import cv2
import matplotlib.pyplot as plt
from plotly import offline
from  plotly.graph_objs import Bar, Layout
img_source = cv2.imread('C:\\Users\\yu\\Desktop\\picture_csdn\\cells_segmentation.jpg', cv2.IMREAD_COLOR)
img_gray = cv2.cvtColor(img_source, cv2.COLOR_BGR2GRAY)
cv2.imshow('img_gray', img_gray)
#   方法二————利用opencv中的calcHist函数
img_hist = cv2.calcHist([img_gray], [0], None, [256], [0, 256])
plt.plot(img_hist, color='blue')
plt.show()
#   方法一————利用matplotlib库中的hist()函数
plt.hist(img_gray.ravel(), 256, [0, 256])#ravel函数功能是将多维数组降为一维数组
plt.show()
ret, img_segmentation = cv2.threshold(img_gray, 80, 255, cv2.THRESH_TRUNC)#    对图像进行阈值分割
cv2.imshow('img_segmentation', img_segmentation)#    图像分割结果
#    方法三————利用PLotly进行可视化绘图
a_input = list(img_gray.ravel())
frequencies = []
for value in list(range(0, 256)):print(value)frequency = a_input.count(value)frequencies.append(frequency)
#   对结果可视化
x_values = list(range(0, 256))
data = [Bar(x=x_values, y=frequencies)]
x_axis_config = {'title': '灰度值'}
y_axis_config = {'title': '灰度值的频率'}
my_layout = Layout(title='一个图像的灰度直方图', xaxis=x_axis_config, yaxis=y_axis_config)
offline.plot({'data': data, 'layout': my_layout}, filename='gray_histogram.html')
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的程序中,附带了一个我对图像进行阈值分割的两条代码,读者在使用程序的时候可以将其注释掉。

在这里我统计的图像是一个将彩色图像转化为灰度图像的细胞图像:

三种灰度直方分布结果如下所示:

方法一

方法二

方法三

绘制图像灰度直方图——将图像的灰度分布可视化方法总结相关推荐

  1. 【医学图像处理】 2 灰度直方图、图像二值化(阈值分割)

    文章目录 1 灰度直方图 1.1 直方图理解 1.2 直方图计算 1.3 直方图均衡化 1.3.1 全局均衡化 1.3.2 自适应(局部)均值化 2 图像二值化(阈值分割) 2.1 二值化理解 2.2 ...

  2. java图像灰度直方图_图像灰度变换、二值化、直方图

    1.灰度变换 1)灰度图的线性变换 Gnew = Fa * Gold + Fb. Fa为斜线的斜率,Fb为y轴上的截距. Fa>1 输出图像的对比度变大,否则变小. Fa=1 Fb≠0时,图像的 ...

  3. opencv python matplotlib.pyplot.hist() 如何绘制灰度直方图,如何根据灰度直方图确定最优二值化值

    什么是灰度直方图? 图像直方图(histogram)是图像的统计学特征,常用于了解图像的基本特征以便分析.不过图像的直方图不具有空间特征. 图像的灰度直方图(histogram),就是将图像转化成灰度 ...

  4. python 灰度直方图_python3+opencv 使用灰度直方图来判断图片的亮暗操作

    1.如何让计算机自动判断一张图是否偏暗?或是判断一张图是否是处于夜晚?我们可以先把图片转换为灰度图,然后根据灰度值的分布来判断,如: 我们可以从上图看到,晚上的图片的灰度值是集中在前段的,如0~30多 ...

  5. erdas查看灰度直方图_ERDAS图像的基本操作

    1 .图像导入 在 erdas 的 Import/Export 模块中,分别导入 TM 图像的第 1 . 2 . 3 . 4 . 5 . 7 波段,具体操 作步骤为 ① 点击 import 模块,打开 ...

  6. 1数字图像获取:1.2图像灰度直方图

    ----------1图像灰度直方图的概念------ 灰度直方图是反映一幅图像中各灰度级像素出现的频率与灰度级的关系.以灰度级为横坐标,频率为纵坐标绘制频率同灰度级的关系图就是一副灰度图像的直方图. ...

  7. MATLAB实现图像灰度直方图

    (近期有用到灰度直方图的情况,就稍微做了一点点小总结,第一次总结,借鉴了很多博主的文章,下面会码出链接,膜拜大佬~) 1. 图像灰度直方图 灰度直方图是将数字图像中所有像素按灰度值的大小,统计每种像素 ...

  8. 【OpenCV 例程200篇】45. 图像的灰度直方图

    [OpenCV 例程200篇]45. 图像的灰度直方图 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 图像直方图是反 ...

  9. 【OpenCV 例程200篇】45. 图像的灰度直方图(cv2.calcHist)

    『youcans 的 OpenCV 例程200篇 - 总目录』 [OpenCV 例程200篇]45. 图像的灰度直方图 图像直方图是反映图像像素分布的统计表,横坐标代表像素值的取值区间,纵坐标代表每一 ...

最新文章

  1. java培训分享:学习java开发的优势是什么
  2. Android SDK 更新不下来解决方法
  3. 文件/目录权限相关命令:chmod、chown、umask、lsattr/chattr命令解析
  4. 中国SaaS死或生之七:死生非大事,利益最相关
  5. Async await 异步编程说明
  6. 新内容,新交互”全球视频云创新挑战
  7. HTML property 和 attribute 的区别
  8. 作家笔下的数学与数学家
  9. 搭载敏捷飞天底座,阿里云专有云敏捷版全面升级
  10. Zuul异常Zuul spring cloud zuul com.netflix.zuul.exception.ZuulException GENERAL
  11. C#设计模式(20)——策略者模式(Stragety Pattern)
  12. 泊松图像融合算法代码实现_部分多曝光图像融合算法(含少数通用图像融合算法)代码下载链接...
  13. springboot16 整合MyBatis
  14. 2007年IT技术走向何方 网络将再掀“酷”革命
  15. 获取URL Schema
  16. JS中类方法、对象方法、原型方法
  17. layui框架简单解读,为什么要使用layui框架,layui框架的好处,后端程序员快速学习掌握layui框架技术型文档博文,layui学习笔记,快速掌握前端技术框架
  18. jQuery-获取验证码
  19. 吴恩达-deep learning 02.改善深层神经网络:优化算法 (Optimization algorithms)Week2
  20. AutoHotKey写一个改键的小脚本

热门文章

  1. DCT 变换的一些思考
  2. Android studio中如何利用Debug模式来调试程序
  3. 【程序人生】IT界含金量高的证书
  4. k折交叉验证 python_Python实现K折交叉验证法的方法步骤
  5. 【Matlab数理统计知识点合集】新手入门第十三天
  6. 【数字图像处理】图像的数学变换之傅里叶变换
  7. ajax传递数组类型值到sevrlet
  8. e470换高分屏_给ThinkPad E470C 换个高分屏(1080P)
  9. 关于“语义通信”的名词解释
  10. java中如何进行强制转换?