[python opencv 计算机视觉零基础到实战] 十四 直方图颜色提鲜
一、学习目标
- 了解了均衡化的作用是什么
- 了解灰度、YUV、彩色图片均衡化的方法是使用什么方法
- 了解了合并通道的方法是什么
- 了解了分离通道的方法是什么
目录
[python opencv 计算机视觉零基础到实战] 一、opencv的helloworld
[python opencv 计算机视觉零基础到实战] 二、 opencv文件格式与摄像头读取
[python opencv 计算机视觉零基础到实战] 三、numpy与图像编辑
[python opencv 计算机视觉零基础到实战] 四、了解色彩空间及转换
[python opencv 计算机视觉零基础到实战] 五、对象追踪
[python opencv 计算机视觉零基础到实战] 六、图像运算
[python opencv 计算机视觉零基础到实战] 七、逻辑运算与应用
[python opencv 计算机视觉零基础到实战] 八、ROI泛洪填充
[python opencv 计算机视觉零基础到实战] 九、模糊
[python opencv 计算机视觉零基础到实战] 十、图片效果毛玻璃
[python opencv 计算机视觉零基础到实战] 十一 找到图片中指定内容
[python opencv 计算机视觉零基础到实战] 十二 图像直方图
如有错误欢迎指出~
二、了解图像均衡化
2.1 了解直方图均衡化
图像直方图均衡化主要是对图像中的少数灰度进行压缩,扩展该值的范围,以致于让这个图的对比度调高,使当前图像变得更加清晰。在一张图片中,若整体偏亮,直方图的值应该是在偏右侧,就可能会产生过渡曝光;若一张图像的直方图整体偏暗就会导致直方图呈现数值整体偏左,可能会造成过暗不清晰,所以一张图是否看起来舒服应该在直方图中的布局显示会相对于均衡。
直方图均衡化有三种,分别是灰度图像直方图、彩色图像直方图以及YUV直方图均衡化。
2.2 灰度图像均衡化
需要实现直方图均衡化需要使用equalizeHist方法。equalizeHist方法使用很简单,直接传入图片进去即可。首先我们需要读取一张图片,并且将改图片转换成一张灰度图片:
import cv2
import numpy as np
img = cv2.imread(r'C:\Users\mx\Desktop\ganimg.png', 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
随后调用equalizeHist方法,完整代码如下:
import cv2
import numpy as np
img = 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 np
img = 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 np
img = 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 np
from matplotlib import pyplot as plt
img = 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()
结果如下:
其中蓝色是做过均衡化处理后的数据,绿色是没做均衡化处理的原图。从结果上可以看出,两者的均衡化之间相差是非常巨大的。
三、总结
- 了解了均衡化的作用是增加图片对比度
- 了解灰度、YUV、彩色图片均衡化的方法是使用equalizeHist方法
- 了解了合并通道的方法是merge
- 了解了分离通道的方法是split
- 分享
- 举报
-
浏览量:6770次2021-01-05 18:32:12
-
浏览量:4428次2021-01-08 01:04:31
-
浏览量:5238次2020-12-29 19:37:20
-
2020-12-14 18:16:24
-
浏览量:4966次2021-01-11 15:33:50
-
浏览量:5641次2020-12-21 16:50:21
-
浏览量:7293次2020-12-21 20:12:30
-
2021-01-15 12:22:23
-
2021-01-12 21:31:51
-
浏览量:5237次2021-01-12 23:46:34
-
浏览量:5630次2021-01-02 22:50:35
-
浏览量:6081次2020-12-29 14:13:00
-
浏览量:4775次2021-01-19 16:45:32
-
浏览量:8715次2020-12-16 22:21:43
-
浏览量:9384次2020-12-18 22:21:10
-
浏览量:6185次2020-12-25 23:18:24
-
浏览量:4610次2021-01-14 01:47:31
-
浏览量:5679次2021-01-03 01:24:13
-
2021-01-19 23:49:13
-
26篇
- rv1126_rv1109移植opencv with ffmpeg for rtsp
- opencv绘制几何图形
- 人脸识别再曝安全漏洞,15分钟解锁19款安卓手机,只需打印机、A4纸和眼镜框即可
- [python opencv 计算机视觉零基础到实战]二十、图片缩放、位移、旋转
- 海思Hi3516A-sample的使用2--PQ_TOOL获取视频
- 实战 | OpenCV中用HOG+SVM实现手写数字识(附代码)
- rv1126 opencv c++加中文水印
- [python opencv 计算机视觉零基础到实战] 四、了解色彩空间及转换
- 有需要海思,SONY芯片(SONY,海思,镁光,OV,PIXELPLUS )芯片可以找我
- 分享海思3519V101 3519 3516AV200 3516CV300 开发板和SDK资料
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
1_bit
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明