【火炉炼AI】机器学习047-图像的直方图均衡化操作

【火炉炼AI】机器学习047-图像的直方图均衡化操作

(本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )

图像的直方图是指图像中每一像素范围内像素频率的统计关系图,直方图能够给出图像灰度范围,每个灰度的频度和灰度的分布,整幅图的平均明暗,对比度等概貌性描述。灰度直方图是灰度级的函数,反映的是图像中具有该灰度级像素的个数。如果大部分像素都集中在低灰度区域,图像会呈现暗的特性,反之,如果大部分图像都集中在高灰度区域,图像呈现出亮的特性。

直方图均衡化是指,将随机分布的图像直方图修改成均匀分布的直方图,基本思想是对原始图像的像素灰度做某种映射变换,使得变换后的图像灰度的概率密度呈均匀分布,这就意味着图像灰度的动态范围得到扩大,提高了图像的对比度。

1. 获取图像直方图

图像直方图有灰度直方图和彩色直方图的区别,如果输入图像是灰度图,则得到灰度直方图,如果输入图像是BGR图像,得到的则是某个颜色通道的直方图。

# 获取灰度直方图gray_hist=cv2.calcHist([gray], [0], None, [256], [0, 256])plt.plot(gray_hist)复制代码

取得图像的灰度直方图,只需要调用cv2.calcHist()函数即可,这个函数的参数为:

第一个参数为输入的图像,可以是灰度图也可以是彩色图。

第二个参数是用于计算直方图的通道,这里使用灰度图计算直方图,所以就直接使用第一个通道;

第三个参数是Mask,这里没有使用,所以用None。

第四个参数是histSize,表示这个直方图分成多少份(即多少个直方柱)。

第五个参数是表示直方图中各个像素的值,[0.0, 256.0]表示直方图能表示像素值从0.0到256的像素。

最后是两个可选参数,由于直方图作为函数结果返回,所以第六个hist就没有意义了(待确定)

最后一个accumulate是一个布尔值,用来表示直方图是否叠加。

# 获取彩色图的各个通道直方图hist_B=cv2.calcHist([img],[0],None,[256],[0,256])plt.plot(hist_B,'b',label='B') # Blue colorhist_G=cv2.calcHist([img],[1],None,[256],[0,256])plt.plot(hist_G,'g',label='G') # green colorhist_R=cv2.calcHist([img],[2],None,[256],[0,256])plt.plot(hist_R,'r',label='R')# red colorplt.title('histogram of Color Chanel')plt.legend()复制代码

2. 直方图均衡化

2.1 灰度图的直方图均衡化

为了方便对比,我将直方图均衡化前后的图像都绘制到同一个图片中。如下:

# 灰度图的直方图均衡化:# 先显示均衡化前后的图像plt.figure(12,figsize=(15,30))plt.subplot(121)plt.imshow(gray,cmap='gray')plt.title('GrayImg before Equalization')equalize = cv2.equalizeHist(gray)plt.subplot(122)plt.imshow(equalize,cmap='gray')plt.title('GrayImg after Equalization')复制代码
plt.plot(gray_hist,c='b',label='raw_Hist')gray_equalized_hist=cv2.calcHist([equalize], [0], None, [256], [0, 256])plt.plot(gray_equalized_hist,c='r',label='Equalized')plt.legend()plt.title('Histogram comparison')复制代码

话说,经过直方图均衡化之后的直方图怎么长的这么丑?

直方图均衡化只需要一个函数cv2.equalizeHist()即可,但是需要注意:cv2.equalizeHist()只提供灰度值图片的处理,当把上面的图片换成RGB图片时,就会报错了。

2.2 彩色图的直方图均衡化

彩色图的直方图均衡化需要借助YUV空间,如下代码:

# 彩色直方图均衡化需要借助YUV空间img_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)img_yuv[:,:,0] = cv2.equalizeHist(img_yuv[:,:,0])img_histeq = cv2.cvtColor(img_yuv, cv2.COLOR_YUV2BGR)# 显示均衡化前后的图像plt.figure(12,figsize=(15,30))plt.subplot(121)img_rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)plt.imshow(img_rgb)plt.title('ColorImg before Equalization')plt.subplot(122)img_hist_rgb=cv2.cvtColor(img_histeq,cv2.COLOR_BGR2RGB)plt.imshow(img_hist_rgb)plt.title('ColorImg after Equalization')复制代码
# 显示均衡化前后的直方图情况plt.figure(12)plt.subplot(121)hist_B=cv2.calcHist([img],[0],None,[256],[0,256])plt.plot(hist_B,'b',label='B') # Blue colorhist_G=cv2.calcHist([img],[1],None,[256],[0,256])plt.plot(hist_G,'g',label='G') # green colorhist_R=cv2.calcHist([img],[2],None,[256],[0,256])plt.plot(hist_R,'r',label='R')# red colorplt.title('Color Histogram before Equalization')plt.legend()plt.subplot(122)hist_B=cv2.calcHist([img_histeq],[0],None,[256],[0,256])plt.plot(hist_B,'b',label='B') # Blue colorhist_G=cv2.calcHist([img_histeq],[1],None,[256],[0,256])plt.plot(hist_G,'g',label='G') # green colorhist_R=cv2.calcHist([img_histeq],[2],None,[256],[0,256])plt.plot(hist_R,'r',label='R')# red colorplt.title('Color Histogram after Equalization')plt.legend()复制代码

同样的,经过对比可以看出,经过直方图均衡化之后的图像直方图都比较丑。。。。

########################小**********结###############################

1,对于图像直方图进行操作可以比较明显的改变图像的对比度和明暗度。

2,使用cv2.equalizeHist函数可以直接改变灰度图的直方图,但是却不能直接改变彩色图的直方图,对于彩色图如果想要均衡化,需要先转变到YUV空间再进行转换。

#################################################################

注:本部分代码已经全部上传到(我的github)上,欢迎下载。

参考资料:

1, Python机器学习经典实例,Prateek Joshi著,陶俊杰,陈小莉译参考文献:K码农-http://kmanong.top/kmn/qxw/form/home?top_cate=28

python用numpy和pil处理图像成灰度图_「火炉炼AI」机器学习047-图像的直方图均衡化操作...相关推荐

  1. python分类预测降低准确率_【火炉炼AI】机器学习011-分类模型的评估:准确率,精确率,召回率,F1值...

    [火炉炼AI]机器学习011-分类模型的评估:准确率,精确率,召回率,F1值 (本文所使用的Python库和版本号: Python 3.5, Numpy 1.14, scikit-learn 0.19 ...

  2. 词袋模型 matlab,【火炉炼AI】机器学习051-视觉词袋模型+极端随机森林建立图像分类器...

    [火炉炼AI]机器学习051-视觉词袋模型+极端随机森林建立图像分类器 (本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, m ...

  3. 【火炉炼AI】机器学习050-提取图像的Star特征

    [火炉炼AI]机器学习050-提取图像的Star特征 (本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib ...

  4. 精雕软件怎么把图片转成灰度图_怎么把普通的照片变成浮雕用的灰度图 精雕图 灰度图 浮雕图之间怎么能联系起来使用...

    怎么把普通的照片变成浮雕用的灰度图 用PS啊,里面有这种效果的,若需要帮忙的话,可以加发给我一份啊,尽量帮你哈,呵呵 用 photoshop 把照片变成灰度图,用PS做有很多方法,介绍两种: 方法1: ...

  5. 彩色BMP转换成灰度图的原理

    图像处理中,大部分的处理方法都需要事先把彩色图转换成灰度图才能进行相关的计算.识别. 彩色图转换灰度图的原理如下: 我们知道彩色位图是由R/G/B三个分量组成,其文件存储格式为 BITMAPFILEH ...

  6. python PIL读取图像转换为灰度图及二值图像

    目录 以下操作都是在windows环境下进行. 一.读取数据 1. 读取单个图像: 2. 批量读取: 3. 看一下是否读取成功: 二.模式"RGB"转换为'L'模式灰度图 三.模式 ...

  7. Python使用openCV把原始彩色图像转化为灰度图、使用OpenCV把图像二值化(仅仅包含黑色和白色的简化版本)、基于自适应阈值预处理(adaptive thresholding)方法

    Python使用openCV把原始彩色图像转化为灰度图.使用OpenCV把图像二值化(仅仅包含黑色和白色的简化版本).基于自适应阈值预处理(adaptive thresholding)方法 目录

  8. Python的Numpy库的函数astype()在将大范围数据类型转换为小范围数据类型时并不是做饱和(saturate)操作(附实现饱和操作的方法)

    Python的Numpy库的函数astype()在将大范围数据类型转换为小范围数据类型时并不是做饱和(saturate)操作. 关于什么是饱和操作,可以参看博文:https://blog.csdn.n ...

  9. Windows Forms:在C#中将图像转换成灰度图

    Windows Forms:在C#中将图像转换成灰度图 本文翻译自Windows Forms: Convert an image into grayscale in C# 这篇文章向你展示在C# Wi ...

最新文章

  1. 在Ubuntu 16.04.04 LTS上调研QUIC开源项目minq笔记
  2. makefile 文件模板
  3. 不等待输入_「对方正在输入……」的提示,给聊天带来什么影响?
  4. CTFshow 命令执行 web53
  5. Tarjan有向图强连通分量
  6. 成功解决ValueError: fill value must be in categories
  7. python vscode_VScode || 为VScode配置python环境
  8. 关于OC-省市区习题
  9. 怎么玩转CSS内部样式表与外部样式表?
  10. End User 访问SharePoint URL获取数据流程
  11. java 生产者消费者 demo_生产者与消费者--demo1---bai
  12. 【Java】撩开Java线程的“神秘面纱”
  13. 大学生转入计算机专业申请书,计算机系大学生助学金申请书1000字
  14. JavaScript:分支流程控制switch语句详解
  15. XML数据解析-SAX和DOM
  16. iOS开发中的Web应用概述
  17. 操作系统正则符号知识点总结
  18. 学习笔记:Eclipse IDE for javaEE 64位下载安装
  19. 基于PaddleSpeech搭建个人语音听写服务
  20. 主流串口蓝牙模块方案对比选型说明

热门文章

  1. unity 弹出式菜单_Java Swing JMenu和JPopupMenu:菜单和弹出式菜单
  2. php实现tail,Linux-如何用php实现Linux下的tail -f命令?
  3. 如何解决tmux中Anaconda虚拟环境下的python版本不正确的问题
  4. 【Paper】2015_Active fault-tolerant control system design with trajectory re-planning against actuator
  5. 3.1 基础模型-深度学习第五课《序列模型》-Stanford吴恩达教授
  6. 8.1 概述-机器学习笔记-斯坦福吴恩达教授
  7. 【树莓派】可能是最简单粗暴的树莓派搭建个人网站教程
  8. 【PC工具】winrar解压缩装机必备软件,winRAR5.70免费无广告
  9. 面向对象简述--对象、引用、指针
  10. linux mint(Ubuntu、Debian) 18修改环境变量