[python opencv 计算机视觉零基础到实战] 十三 直方图颜色提鲜

一、学习目标

  1. 了解了均衡化的作用是什么
  2. 了解灰度、YUV、彩色图片均衡化的方法是使用什么方法
  3. 了解了合并通道的方法是什么
  4. 了解了分离通道的方法是什么

如有错误欢迎指出~

二、了解图像均衡化

2.1 了解直方图均衡化

图像直方图均衡化主要是对图像中的少数灰度进行压缩,扩展该值的范围,以致于让这个图的对比度调高,使当前图像变得更加清晰。在一张图片中,若整体偏亮,直方图的值应该是在偏右侧,就可能会产生过渡曝光;若一张图像的直方图整体偏暗就会导致直方图呈现数值整体偏左,可能会造成过暗不清晰,所以一张图是否看起来舒服应该在直方图中的布局显示会相对于均衡。

直方图均衡化有三种,分别是灰度图像直方图、彩色图像直方图以及YUV直方图均衡化。

2.2 灰度图像均衡化

需要实现直方图均衡化需要使用equalizeHist方法。equalizeHist方法使用很简单,直接传入图片进去即可。首先我们需要读取一张图片,并且将改图片转换成一张灰度图片:

import cv2
import numpy as npimg = cv2.imread(r'C:\Users\mx\Desktop\ganimg.png', 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

随后调用equalizeHist方法,完整代码如下:

import cv2
import numpy as npimg = cv2.imread(r'C:\Users\mx\Desktop\ganimg.png', 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
cv2.namedWindow("equalizeHist_gray_img",cv2.WINDOW_NORMAL)equalizeHist_gray_img = cv2.equalizeHist(gray)
cv2.imshow("equalizeHist_gray_img", equalizeHist_gray_img)
cv2.imshow("Image", gray)cv2.waitKey (0)
cv2.destroyAllWindows()

结果如下:
很明显,通过均衡化后,感觉舒服太多了。上图左侧为均衡化图,右侧为原图。

2.3 彩色图像均衡化

彩色图像均衡化也是非常简单。opencv提供了一个split方法,直接传入图片可以分离通道。代码如下:

b,g,r = cv2.split(img)

随后对每个通道进行均衡化:

equalizeHist_b=cv2.equalizeHist(b)
equalizeHist_g=cv2.equalizeHist(g)
equalizeHist_r=cv2.equalizeHist(r)

这时候需要将进行均衡化后的值进行合并,合并三个通道成为一张彩色图片,这时需要使用merge方法。merge方法将三个通道传入其中作为参数,返回的结果就是合并后的彩色图像值。代码如下:

merge_img=cv2.merge((equalizeHist_b, equalizeHist_g, equalizeHist_r))

最终完整的代码如下:

import cv2
import numpy as npimg = cv2.imread(r'C:\Users\mx\Desktop\ganimg.png', 1)
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
cv2.namedWindow("merge_img",cv2.WINDOW_NORMAL)b,g,r = cv2.split(img)
equalizeHist_b=cv2.equalizeHist(b)
equalizeHist_g=cv2.equalizeHist(g)
equalizeHist_r=cv2.equalizeHist(r)merge_img=cv2.merge((equalizeHist_b, equalizeHist_g, equalizeHist_r))
cv2.imshow("merge_img", merge_img)
cv2.imshow("Image", img)cv2.waitKey (0)
cv2.destroyAllWindows()

结果如下:

这时候的图片看起来就不难受了,是非常舒服的。

YUV均值化也是非常的简单,都是通过equalizeHist方法在此不浪费阅读时间直接上代码:

import cv2
import numpy as npimg = cv2.imread(r'C:\Users\mx\Desktop\ganimg.png', 1)
YUV_img = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
YUV_img_c = cv2.split(YUV_img)
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
cv2.namedWindow("YUV_img_merge",cv2.WINDOW_NORMAL)YUV_img_c[0] = cv2.equalizeHist(YUV_img_c[0])
YUV_img_merge = cv2.merge(YUV_img_c)
YUV_img_c_= cv2.cvtColor(YUV_img_merge, cv2.COLOR_YCrCb2BGR)
cv2.imshow("YUV_img_merge", YUV_img_c_)
cv2.imshow("Image", img)cv2.waitKey (0)
cv2.destroyAllWindows()

结果如下:

2.4 折线数据对比

我们刚刚知道了如何对图片进行明亮上的修改,我们现在从折线图的角度看一下两者之间的数据是否有什么变化,为了查看数据的不同,我先贴上折线图的核心代码:

color = ["blue", "green"]
imgs=[YUV_img_c_,img]
for i, v in enumerate(imgs):hist = cv2.calcHist([v], [i], None, [256], [0, 256])plt.plot(hist, color=color[i])
plt.show()

以上是对比YUV与原图的数据折线图对比。首先我们定义一个color列表,分别用于显示两个不同图片数据的线段颜色;随后定义一个imgs列表,用来存储两张图。之后使用一个for循环imgs内容,使用calcHist随便取一个通道值查看内容值,随后再使用plot对图像进行绘制。完整代码如下:

import cv2
import numpy as npfrom matplotlib import pyplot as pltimg = cv2.imread(r'C:\Users\mx\Desktop\ganimg.png', 1)
YUV_img = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
YUV_img_c = cv2.split(YUV_img)
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
cv2.namedWindow("YUV_img_merge",cv2.WINDOW_NORMAL)YUV_img_c[0] = cv2.equalizeHist(YUV_img_c[0])
YUV_img_merge = cv2.merge(YUV_img_c)
YUV_img_c_= cv2.cvtColor(YUV_img_merge, cv2.COLOR_YCrCb2BGR)
cv2.imshow("YUV_img_merge", YUV_img_c_)
cv2.imshow("Image", img)color = ["blue", "green"]
imgs=[YUV_img_c_,img]
for i, v in enumerate(imgs):hist = cv2.calcHist([v], [i], None, [256], [0, 256])plt.plot(hist, color=color[i])
plt.show()cv2.waitKey (0)
cv2.destroyAllWindows()

结果如下:
其中蓝色是做过均衡化处理后的数据,绿色是没做均衡化处理的原图。从结果上可以看出,两者的均衡化之间相差是非常巨大的。
该系列首发于ebaina

三、总结

  1. 了解了均衡化的作用是增加图片对比度
  2. 了解灰度、YUV、彩色图片均衡化的方法是使用equalizeHist方法
  3. 了解了合并通道的方法是merge
  4. 了解了分离通道的方法是split

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 中字符串比较方法_java中常用的字符串的比较方法(两种)

比较字符串比较常用的两个方法是运算符“”和String的equals方法。使用“”比较两个字符串,是比较两个对象的的“地址”是否一致,本质就是判断两个变量是否指向同一个对象,如果是则返回true,否则返回的是false。而String类的equal…

Android之稍微靠谱点的透明Activity(不获取触摸事件)

1 问题 实现透明的Activity(不获取触摸事件),就行什么也看不到,打开了透明activity,也不影响其他页面的滑动和点击,就行什么事情都没发生一样。 2 代码实现 1)配置样式 <style name="TestTheme" parent="Theme.AppCompat.Light"><item na…

分布式服务框架dubbo原理解析 转

alibaba有好几个分布式框架&#xff0c;主要有&#xff1a;进行远程调用(类似于RMI的这种远程调用)的(dubbo、hsf)&#xff0c;jms消息服务(napoli、notify)&#xff0c;KV数据库(tair)等。这个框架/工具/产品在实现的时候&#xff0c;都考虑到了容灾&#xff0c;扩展&#xff…

【倾情奉献】遥感物候研究:30年长时间序列遥感数据集GIMMS 3g NDVI产品预处理完整步骤

本文为作者硕士学位论文遥感物候研究数据处理过程总结。GIMMS(Global Inventory Modelling and Mapping Studies) 3g NDVI来源于ECOCAST网站(http://ecocast.arc.nasa.gov),是由NOAA卫星搭载的AVHRR传感器获取的全球植被数据,空间分辨率为0.0833 ,时间分辨率为15 d,一…

过早的给方法中 引用对象 设为 null 可被 GC提前回收吗?

经常在代码中看到有人将 null 赋值给引用类型&#xff0c;来达到让 GC 提前回收的目的&#xff0c;这样做真的有用吗&#xff1f;今天我们就来研究一下。为了方便讲解&#xff0c;来一段测试代码&#xff0c;提前将 test1null &#xff0c;然后调用 GC.Collect() 看看是否能提前…

[python opencv 计算机视觉零基础到实战] 十五 直方图反向投影

一、学习目标 了解了直方图反向投影的一般流程了解2D直方图的使用 如有错误欢迎指出~ 二、了解直方图反向投影 2.1 了解2D直方图 需要对直方图进行反向投影&#xff0c;需要使用2D直方图。2D直方图需要使用calcHist方法。calcHist方法在前两节中已经有了解&#xff0c;现在…

关联规则java代码_重量挖掘关联规则挖掘方法,哪个大神可以将以下伪代码转换为Java代码?...

重量挖掘关联规则挖掘方法&#xff0c;哪个大神可以将以下伪代码转换为Java代码&#xff1f; 10改进的加权关联规则算法的基本步骤与Apriori算法相似: 首先找到加权支持度不小于用户指定的最小加权支持度的所有频繁项集加权关联规则&#xff0c;然后使用频繁项集生成所有满足最…

Boostrap ZURB Foundation —— Web开发前端框架

webflow&#xff1a;Webflow 允许设计师通过自由的拖拉拽与 CSS 类互动&#xff0c;而定义它们的过程无需写任何一行代码。用户在完成从设计到 CSS 构架之后&#xff0c;甚至可以在线直接将建好的网页发布&#xff0c;而不需要导出代码到其他发布工具上。类似的这些 B2D 市场&a…

Git之HEAD和origin

1 问题 我们经常看见git相关操作里面看到HEAD和origin这些专业名称&#xff0c;它娘的到底什么意思。 2 解释 1&#xff09;HEAD git 中的分支&#xff0c;本质上仅仅是个指向 commit 对象的可变指针&#xff0c; HEAD 是一个特别指针&#xff0c;它是一个指向你正在工作中的…

如何离线安装chrome插件

如何离线安装chrome插件 本文转自Work Hard Work Smart博客园博客&#xff0c;原文链接&#xff1a;http://www.cnblogs.com/linlf03/p/6838852.html&#xff0c;如需转载请自行联系原作者

多种语言《九九乘法表》荟萃:C、C++、C#、JavaScript、SQL、VB、VBA、Python

九九乘法表对于我们学习循环结构,尤其是双重循环特别有帮助,本文演示用C、C++、C#、HTML、SQL、VB、VBA、Python等多种语九九乘法表。 一、C语言 #include<stdio.h> main() {int i,j;for(i=1;i<=9;i++){for(j=1;j<=i;j++){printf("%d*%d=%d\t",j,i,i*j…

Git之删除远程分支

1 问题 在工作区间删除远程分支 2 删除命令 git push origin --delete name

iptables (2) 基本配置

iptables 基本命令使用举例 一、链的基本操作 1、清除所有的规则。1&#xff09;清除预设表filter中所有规则链中的规则。# iptables -F -F, --flush [chain]Flush the selected chain (all the chains in the table if none is given). This is equivalent to deleting all …

[python opencv 计算机视觉零基础到实战] 十六、用opencv画画

一、学习目标 了解如何使用line方法了解如何使用rectangle方法了解如何使用ellipse方法 如有错误欢迎指出~ 二、了解OpenCV的绘图方法 2.1 了解直线绘图方法 我们在前两节中有了解使用OpenCV中的矩形绘制&#xff0c;接下来我们了解一下更多的图形绘制方法。我们在OpenCV中…

基于.NetCore开发博客项目 StarBlog - (5) 开始搭建Web项目

系列文章基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客&#xff1f;基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目基于.NetCore开发博客项目 StarBlog - (3) 模型设计基于.NetCore开发博客项目 StarBlog - (4) markdown博客批量导入基于.N…

java计算每个元素出现的百分比_Java程序计算百分比

百分数表示百分数(百)&#xff0c;即百分数与100之比。百分数的符号为&#xff05;。我们通常会计算获得的商标&#xff0c;投资回报率等百分比。该百分比也可以超过100&#xff05;。例如&#xff0c;假设我们有总数和一部分。所以我们说那一部分占总数的百分之几&#xff0c;…

ECShop 前台用户中心调整左侧栏目及中心部分呈现页面

1、首先调整用户中心左侧栏目&#xff0c;在 .dwt 里面我修改了半天&#xff0c;页面没改动。。后来某大神说这个是在另一个文件里&#xff1a;/themes/你用的模板目录/library/user_menu.lbi 文件改一个试试吧~ 不出意外的成功了吧2、中心部分呈现内容的调整。&#xff08;今天…

【测绘程序设计】高斯克吕格投影:带号及中央经度计算神器V1.0(附源程序)

【问题描述】:很多情况下,我们知道某一地点的坐标(经纬度),需要计算其在高斯克吕格投影中的带号及中央经度。关于该问题,有具体的公式可言,只是计算过程稍微繁琐一些,当然啦,我们可以写程序来解决,谁叫我们是名副其实的GISer呢?另外,这些复杂的计算过程还是交给计算…

外部中断0(含知识点)

1 #include "stm32f10x.h" // 相当于51单片机中的 #include <reg51.h>2 #include "stm32f10x_gpio.h"3 #include "stm32f10x_exti.h"4 #include "misc.h"5 6 /*外部中断配置*/7 8 9 int main(void)10 {11 /*************…