Python-Opencv中的直⽅图均衡化
Python-Opencv中的直⽅图均衡化
直⽅图均衡化
图像的直⽅图是对图像对⽐度效果上的⼀种处理,旨在使得图像整体效果均匀,⿊与⽩之间的各个像素级之间的点更均匀⼀点。
直⽅图均衡化:如果⼀副图像的像素占有很多的灰度级⽽且分布均匀,那么这样的图像往往有⾼对⽐度和多变的灰度⾊调。直⽅图均衡化就是⼀种能仅靠输⼊图像直⽅图信息⾃动达到这种效果的变换函数。它的基本思想是对图像中像素个数多的灰度级进⾏展宽,⽽对图像中像素个数少的灰度进⾏压缩,从⽽扩展像元取值的动态范围,提⾼了对⽐度和灰度⾊调的变化,使图像更加清晰。
直⽅图均衡化只对灰度图进⾏处理。
直⽅图均衡化的两种⽅式
1. 全局直⽅图均衡化
全局直⽅图均衡化可能得到是⼀种全局意义上的均衡化,通过全局来增强对⽐度,提⾼图像质量。
函数
equalizeHist(src[, dst])
2. 局部直⽅图均衡化
但是有的时候全局直⽅图均衡化并不是很好,会把某些不该调整的部分给调整了。Opencv中还有⼀种直⽅图均衡化,它是⼀种局部直⽅图均衡化,也就是是说把整个图像分成许多⼩块(⽐如按10*10作为⼀个⼩块),那么对每个⼩块进⾏均衡化。
函数
createCLAHE([, clipLimit[, tileGridSize]])
其中:
clipLimit - 表⽰对⽐度的⼤⼩。
tileGridSize - 表⽰每次处理块的⼤⼩ 。
两种直⽅图均衡化代码实现
import cv2 as cv
from matplotlib import pyplot as plt
def equalHist_demo(image):
# 将图⽚变成灰度图
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
cv.imshow("gray", gray)
# 全局直⽅图均衡函数
dst = cv.equalizeHist(gray)
plt.subplot(1,4,3)
plt.xlim([0,256])
plt.ylim([0,4000])
plt.hist(gray.ravel(),256,[0,256])
plt.title("equalHist_demo")
cv.imshow("equalHist_demo", dst)
def clahe_demo(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
plt.subplot(1,4,2)
plt.hist(gray.ravel(),256,[0,256])
plt.title("gray")
plt.xlim([0,256])
plt.ylim([0,4000])
# 局部直⽅图均衡化对⽐度⼤⼩设置为5 处理块⼤⼩为8*8
calhe = cv.createCLAHE(clipLimit=5.0, tileGridSize=(8,8))
dst = calhe.apply(gray)
plt.subplot(1,4,4)
plt.hist(dst.ravel(),256,[0,256])
plt.title("clahe_demo")
plt.xlim([0,256])
plt.ylim([0,4000])
cv.imshow("clahe_demo", dst)
src = cv.imread("scenery.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
# 创建画图区域 figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True) # num:图像编号或名称,数字为编号,字符串为名称
# figsize:figsize:指定figure的宽和⾼,单位为英⼨
# dpi:指定绘图对象的分辨率,即每英⼨多少个像素,缺省值为80,1英⼨等于2.5cm,A4纸是 21*30cm的纸张# facecolor:背景颜⾊ edgecolor:边框颜⾊ frameon:是否显⽰边框
plt.figure("scenery",figsize=(12,5))
# .subplot()创建⼦图
plt.subplot(1,4,1)
# 给⼦图加上⽹格
# 绘制直⽅图
plt.hist(src.ravel(),256,[0,256])
plt.title("original picture")
plt.xlim([0,256])
plt.ylim([0,4000])
局部直方图均衡化equalHist_demo(src)
clahe_demo(src)
plt.show()
cv.waitKey(0)
cv.destroyAllWindows()
(1,1)图为原图,(1,2)图为原图的灰度图,(2,1)图为经过全局直⽅图均衡化后的效果,(2,2)图为进过局部直⽅图均衡化后的效果。
以上四个图分别为原图,灰度图,经全局直⽅均衡化,局部直⽅均衡化后的直⽅图。
"直接"对BGR图进⾏局部直⽅图均衡化
所谓“直接”,其实也是对每个通道的灰度图进⾏直⽅图均衡化,然后对均衡化的三个通道进⾏叠加即变成了BGR图。
import cv2 as cv
from matplotlib import pyplot as plt
# 对于plt.title(“中⽂”),不能再图⼀些标题显⽰中⽂,则在程序前加上以下两⾏代码即可:Params['font.sans-serif']=['SimHei']
image = cv.imread("sine.jpg")
cv.imshow("original picture", image)
plt.figure("图")
plt.subplot(2,2,1)
plt.title("原图直⽅图")
plt.hist(image.ravel(),256,[0,256])
color =["b","g","r"]
plt.subplot(2,2,3)
plt.title("原图三通道直⽅图")
for i, color in enumerate(color):
hist = cv.calcHist([image],[i],None,[256],[0,256])
plt.plot(hist, color = color)
# 分离每⼀个通道
b, g, r = cv.split(image)
# 创建局部直⽅图均衡化
clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(5,5))
# 对每⼀个通道进⾏局部直⽅图均衡化
b = clahe.apply(b)
g = clahe.apply(g)
r = clahe.apply(r)
# 合并处理后的三通道成为处理后的图
image = cv.merge([b, g, r])
color =["b","g","r"]
plt.subplot(2,2,4)
plt.title("三通道直⽅图均衡化")
for i, color in enumerate(color):
hist = cv.calcHist([image],[i],None,[256],[0,256])
plt.plot(hist, color = color)
plt.subplot(2,2,2)
plt.title("直⽅图均衡化")
plt.hist(image.ravel(),256,[0,256])
cv.imshow("clahe", image)
plt.show()
cv.waitKey(0)
cv.destroyAllWindows()
注: 对于plt.title(“中⽂”),不能再图⼀些标题显⽰中⽂,则在程序前加上以下两⾏代码即可:Params[‘font.sans-serif’]=[‘SimHei’]
初学Opencv,如有错误地⽅和改进地⽅,真诚地邀请您提出来,谢谢!
本⽂结束…
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论